o
    Zhj                     @   s<  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g dZ	ej
dkZej
dk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 ejd#e d*d+ Z!dS ),    N)systemjemallocmimalloclinuxwin32c                  c   s.    t jV  t  D ]} tt |  dV  q	d S )NZ_memory_pool)padefault_memory_poolsupported_memory_backendsgetattr)backend r   P/var/www/html/lang_env/lib/python3.10/site-packages/pyarrow/tests/test_memory.py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)typeZmemory_pool   N)r   arraybinarybufferslen)poolnbytesZ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_allocatedZ
max_memoryr   )r   allocated_beforeZmax_mem_beforeZ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   Ztotal_allocated_bytesr   r   r   r   test_default_allocated_bytesI   s
   "r   c                  C   sB   t t  } t|  t| }| d usJ ~ | d u sJ d S N)r   proxy_memory_poolr   r   weakrefref)r   wrr   r   r   test_proxy_memory_poolP   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   Zlogging_memory_poolr   r   Z
readouterrcount)Zcapfdr   outerrr   r   r   test_logging_memory_poolY   s   r*   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!   Zset_memory_poolr   r   )old_poolr   r   r   r   r   test_set_memory_poolb   s   

r,   c                  C   s   t  } | jtv sJ d S r    )r   r   backend_namepossible_backendsr   r   r   r   test_default_backend_nameo   s   r/   c                  C   s   t  } |   d S r    )r   r   Zrelease_unusedr   r   r   r   test_release_unusedt   s   r0   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
        ZARROW_DEFAULT_MEMORY_POOL-cTenvuniversal_newlinesstderrr   file)   r   r:   zUnsupported backend ''zInitGoogleLogging())dictosenviron
subprocessrunsys
executablePIPE
returncodeprintr7   check_returncode
splitlinesr   )nameexpectedr2   coder5   resZerrlinesr   r   r   check_env_vary   s&   


rL   c                   C   s>   t ddg trt ddg trt ddg t dtdd d S )Nr   r   r   ZnonexistentTr1   )rL   should_have_jemallocshould_have_mimallocr.   r   r   r   r   test_env_var   s   rO   c                     sL   t   dd fdd
} | tjd | tjdt d | tjdt d d S )NF)can_failc                   sF   |rz|  }W n t y   Y d S w |  }|j|ksJ  | d S r    )NotImplementedErrorr-   add)factoryrH   rP   r   Zspecific_poolsr   r   check   s   
z)test_specific_memory_pools.<locals>.checkr   r   r   )setr   Zsystem_memory_poolZjemalloc_memory_poolrM   Zmimalloc_memory_poolrN   )rU   r   rT   r   test_specific_memory_pools   s   
rW   c                  C   s<   t  } d| v s
J trd| v sJ trd| v sJ d S d S )Nr   r   r   )r   r	   rM   rN   )backendsr   r   r   test_supported_memory_backends   s   rY   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
        ZARROW_DEBUG_MEMORY_POOLr3   Tr4   r8   )
r<   r=   r>   r?   r@   rA   rB   rC   rE   r7   )pool_factoryZ	env_valuerJ   r5   rK   r   r   r   run_debug_memory_pool   s   
r[   rZ   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)r[   __name__r=   rH   rD   signalSIGABRTr7   rZ   rK   r   r   r   test_debug_memory_pool_abort   
   
rd   c                 C   r\   )NZtrapr^   r   r_   )r[   r`   r=   rH   rD   ra   SIGTRAPr7   rc   r   r   r   test_debug_memory_pool_trap   re   rg   c                 C   s&   t | jd}|  d|jv sJ d S )Nwarnr_   )r[   r`   rF   r7   rc   r   r   r   test_debug_memory_pool_warn   s   ri   c                 C   s@   t | jd}tjdkr|jdksJ n|  |jdksJ d S )Nr&   r^   r   )r[   r`   r=   rH   rD   rF   r7   rc   r   r   r   test_debug_memory_pool_disabled   s
   
rj   )"
contextlibr=   ra   r?   rA   r"   Zpyarrowr   Zpytestr.   platformrM   rN   r   contextmanagerr   r   r   r%   r*   r,   r/   r0   rL   rO   rW   rY   r[   markZparametrizerd   rg   ri   rj   r   r   r   r   <module>   sD   


			

	
	
