o
    h"                     @   sx  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZej	j
Zg dZddgZdd Zdd Ze jd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZddddZdd Zdd  Zd!d" Zd#d$ Zej	d%e d&d' Zej	d%e d(d) Z ej	d%e d*d+ Z!d,d- Z"ej	d%e d.d/ Z#ej	d%e d0d1 Z$ej	d%e d2d3 Z%dS )4    N)systemjemallocmimallocr   r   c                 C   s   t t|  dS )N_memory_pool)getattrpabackend_name r
   M/var/www/vscode/kcb/lib/python3.10/site-packages/pyarrow/tests/test_memory.pybackend_factory%   s   r   c                  c   s&    t jV  t  D ]} t| V  q	d S N)r   default_memory_poolsupported_memory_backendsr   r   r
   r
   r   supported_factories)   s
   r   c                 c   sT    t jd| gt  | d}| d }d}t||ksJ zdV  W d}dS d}w )z>
    Temporarily allocate *nbytes* from the given *pool*.
       x)typememory_pool   N)r   arraybinarybufferslen)poolnbytesarrbufr
   r
   r   allocate_bytes/   s   r   c                 C   s   |   }|  }t| d |   |d ksJ |  }|  |ks$J W d   n1 s.w   Y  |   |ks;J |  |ksCJ dS )z+
    Check allocation stats on *pool*.
       N)bytes_allocated
max_memoryr   )r   allocated_beforemax_mem_beforenew_max_memoryr
   r
   r   check_allocated_bytes@   s   r$   c                  C   sT   t  } t| d t|  |  t  ksJ W d    d S 1 s#w   Y  d S )Ni   )r   r   r   r$   r   total_allocated_bytesr   r
   r
   r   test_default_allocated_bytesN   s
   "r'   c                  C   sB   t t  } t|  t| }| d usJ ~ | d u sJ d S r   )r   proxy_memory_poolr   r$   weakrefref)r   wrr
   r
   r   test_proxy_memory_poolU   s   
r,   c                 C   s\   t t  }t| |  \}}|dksJ |ddks J |d|dks,J d S )N z	Allocate:r   zFree:)r   logging_memory_poolr   r$   
readouterrcount)capfdr   outerrr
   r
   r   test_logging_memory_pool^   s   r4   c               	   C   s   t  } t | }t | z3| }td d | |d ks#J W d    n1 s-w   Y  | |ks:J W t |  d S t |  w )Nr   )r   r   r(   set_memory_poolr   r   )old_poolr   r!   r
   r
   r   test_set_memory_poolg   s   

r7   c                  C   s   t  } | jtv sJ d S r   )r   r   r	   possible_backendsr&   r
   r
   r   test_default_backend_namet   s   r9   c                  C   s   t  } |   d S r   )r   r   release_unusedr&   r
   r
   r   test_release_unusedy   s   r;   Fexpect_warningc                C   s   d|d}t tj}| |d< tjtjd|g|dtjd}|jdkr.t	|j
tj
d |  |j
 }|rgt|d	v s=J t|d
krQd|  d|d v sOJ d S d|d v sYJ d|  d|d
 v seJ d S t|dksoJ d S )Nzpif 1:
        import pyarrow as pa

        pool = pa.default_memory_pool()
        assert pool.backend_name in z, pool.backend_name
        ARROW_DEFAULT_MEMORY_POOL-cTenvuniversal_newlinesstderrr   file)   r   rF   zUnsupported backend ''zInitGoogleLogging())dictosenviron
subprocessrunsys
executablePIPE
returncodeprintrC   check_returncode
splitlinesr   )nameexpectedr=   coderA   reserrlinesr
   r
   r   check_env_var~   s&   


rY   c                  C   s(   t D ]} t| | g qtdtdd d S )NnonexistentTr<   )mandatory_backendsrY   r8   r   r
   r
   r   test_env_var   s   r\   c                  C   s2   dddd} t D ]}| t|||tvd q	d S )NF)can_failc                S   s<   |rz|  }W n t y   Y d S w |  }|j|ksJ d S r   )NotImplementedErrorr	   )factoryrT   r]   r   r
   r
   r   check   s   
z)test_memory_pool_factories.<locals>.check)r8   r   r[   )r`   r	   r
   r
   r   test_memory_pool_factories   s   

ra   c                  C   s4   t  } t| ttksJ t| ttksJ d S r   )r   r   setr[   r8   )backendsr
   r
   r   test_supported_memory_backends   s   rd   c                 C   sN   d|  d}t tj}||d< tjtjd|g|dtjd}t|j	tj	d |S )z
    Run a piece of code making an invalid memory write with the
    ARROW_DEBUG_MEMORY_POOL environment variable set to a specific value.
    a  if 1:
        import ctypes
        import pyarrow as pa
        # ARROW-16873: some Python installs enable faulthandler by default,
        # which could dump a spurious stack trace if the following crashes
        import faulthandler
        faulthandler.disable()

        pool = pa.z()
        buf = pa.allocate_buffer(64, memory_pool=pool)

        # Write memory out of bounds
        ptr = ctypes.cast(buf.address, ctypes.POINTER(ctypes.c_ubyte))
        ptr[64] = 0

        del buf
        ARROW_DEBUG_MEMORY_POOLr?   Tr@   rD   )
rH   rI   rJ   rK   rL   rM   rN   rO   rQ   rC   )pool_factory	env_valuerV   rA   rW   r
   r
   r   run_debug_memory_pool   s   
rh   rf   c                 C   J   t | jd}tjdkr|jtj ksJ n|jdksJ d|jv s#J d S )Nabortposixr   Wrong size on deallocation)rh   __name__rI   rT   rP   signalSIGABRTrC   rf   rW   r
   r
   r   test_debug_memory_pool_abort   
   
rq   c                 C   ri   )Ntraprk   r   rl   )rh   rm   rI   rT   rP   rn   SIGTRAPrC   rp   r
   r
   r   test_debug_memory_pool_trap   rr   ru   c                 C   s&   t | jd}|  d|jv sJ d S )Nwarnrl   )rh   rm   rR   rC   rp   r
   r
   r   test_debug_memory_pool_warn   s   rw   c                 C   sn   t jdk r
td t| j|}tjdkr|jdksJ n|	  |dkr.|j
dks,J d S ||j
v s5J d S )Nl        z!Test may fail on 32-bit platformsrk   r   r-   )rM   maxsizepytestskiprh   rm   rI   rT   rP   rR   rC   )rf   rg   msgrW   r
   r
   r    check_debug_memory_pool_disabled   s   


r|   c                 C   s   t | dd d S )Nnoner-   r|   rf   r
   r
   r   test_debug_memory_pool_none      r   c                 C   s   t | dd d S )Nr-   r~   r   r
   r
   r   test_debug_memory_pool_empty  r   r   c                 C   s    d}d| d}t | || d S )Nsome_arbitrary_valuez,Invalid value for ARROW_DEBUG_MEMORY_POOL: 'z4'. Valid values are 'abort', 'trap', 'warn', 'none'.r~   )rf   rg   r{   r
   r
   r   test_debug_memory_pool_unknown
  s   
r   )&
contextlibrI   rn   rK   rM   r)   pyarrowr   ry   mark	processes
pytestmarkr8   r[   r   r   contextmanagerr   r$   r'   r,   r4   r7   r9   r;   rY   r\   ra   rd   rh   parametrizerq   ru   rw   r|   r   r   r   r
   r
   r
   r   <module>   sP   
		
	
	


