
    Rhj-                        d dl Z d dlmZ d dlZd dlZd dlZd dlZd dlZddlm	Z	m
Z
 ddlmZ dgZej                  dk(  rd dlZ G d d	e      Zn$ G d
 d	e      Zd Zd Z e	j(                  ee        G d de      Z G d de      Zy)    N)defaultdict   )	reductionassert_spawning)utilBufferWrapperwin32c                   D    e Zd ZdZ ej
                         Zd Zd Zd Z	y)ArenazL
        A shared memory area backed by anonymous memory (Windows).
        c                 x   || _         t        d      D ]o  }dt        j                         t	        | j
                        fz  }t        j                  d||      }t        j                         dk(  r n|j                          q t        d      || _        || _        | j                   | j                  f| _        y )Nd   z	pym-%d-%stagnamer   zCannot find name for new mmap)sizerangeosgetpidnext_randmmap_winapiGetLastErrorcloseFileExistsErrornamebuffer_state)selfr   ir   bufs        +/usr/lib/python3.12/multiprocessing/heap.py__init__zArena.__init__&   s    DI3Z G"biik4

3C%DDiiD$7'')Q.		G &&EFFDIDK99dii0DK    c                 0    t        |        | j                  S N)r   r   )r   s    r"   __getstate__zArena.__getstate__5   s    D!;;r$   c                     |x\  | _         | _        | _        t        j                  d| j                   | j                        | _        y )Nr   r   )r   r   r   r   r   )r   states     r"   __setstate__zArena.__setstate__9   s3    166 DIty4;))B		499EDKr$   N)
__name__
__module____qualname____doc__tempfile_RandomNameSequencer   r#   r'   r*    r$   r"   r   r      s)    	 -,,.	1		Fr$   r   c                   H    e Zd ZdZej
                  dk(  rdgZng ZddZd Zy)r   zJ
        A shared memory area backed by a temporary file (POSIX).
        linuxz/dev/shmc                    || _         || _        |dk(  rt        j                  dt	        j
                         z  | j                  |            \  | _        }t	        j                  |       t        j                  | t        j                  | j                  f       t	        j                  | j                  |       t        j                  | j                  | j                         | _        y )Nr   zpym-%d-)prefixdir)r   fdr/   mkstempr   r   _choose_dirunlinkr   Finalizer   	ftruncater   r   )r   r   r7   r   s       r"   r#   zArena.__init__M   s    DIDGRx !) 0 0%biik1))$/!1 		$dBHHtwwj9TWWd+))DGGTYY7DKr$   c                     | j                   D ]7  }t        j                  |      }|j                  |j                  z  |k\  s5|c S  t        j                         S r&   )_dir_candidatesr   statvfsf_bavailf_frsizer   get_temp_dir)r   r   dsts       r"   r9   zArena._choose_dir[   sQ     )) ZZ];;,4H $$&&r$   N)r   )	r+   r,   r-   r.   sysplatformr>   r#   r9   r1   r$   r"   r   r   C   s+    	 <<7")lO O	8	'r$   c                     | j                   dk(  rt        d      t        | j                  t	        j
                  | j                         ffS )Nr   zDArena is unpicklable because forking was enabled when it was created)r7   
ValueErrorrebuild_arenar   r   DupFd)as    r"   reduce_arenarL   d   sC    442: G H Hqvvyqtt'<===r$   c                 6    t        | |j                               S r&   )r   detach)r   dupfds     r"   rI   rI   j   s    T5<<>**r$   c                   |    e Zd ZdZdZdZej                  fdZe	d        Z
d Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zy)Heap   i  @ c                    t        j                         | _        t        j                         | _        || _        g | _        i | _        i | _	        i | _
        t        t              | _        g | _        g | _        d| _        d| _        y Nr   )r   r   _lastpid	threadingLock_lock_size_lengths_len_to_seq_start_to_block_stop_to_blockr   set_allocated_blocks_arenas_pending_free_blocks
_n_mallocs_n_frees)r   r   s     r"   r#   zHeap.__init__{   sy    		^^%

   " ! "-S!1 %'! r$   c                     |dz
  }| |z   | z  S )Nr   r1   )n	alignmentmasks      r"   _roundupzHeap._roundup   s     1}DTE!!r$   c                 H   | j                  t        | j                  |      t        j                        }| j                  | j
                  k  r| xj                  dz  c_        t        j                  d|       t        |      }| j                  j                  |       |d|fS )N   z"allocating a new mmap of length %dr   )rh   maxrY   r   PAGESIZE_DOUBLE_ARENA_SIZE_UNTILr   infor   r`   append)r   r   lengtharenas       r"   
_new_arenazHeap._new_arena   sy    s4::t4dmmD ::555JJ!OJ		6?fE"q&!!r$   c                    |j                   }|| j                  k  ry | j                  j                  |      }|rJ | j                  |df= | j
                  ||f= | j                  j                  |       | j                  |   }|j                  |d|f       |s)| j                  |= | j                  j                  |       y y rT   )
r   _DISCARD_FREE_SPACE_LARGER_THANr_   popr\   r]   r`   remover[   rZ   )r   rq   rp   blocksseqs        r"   _discard_arenazHeap._discard_arena   s     D888''++E2z  %,0E"v&

E1f%&  (MM  ( r$   c                 t   t        j                  | j                  |      }|t        | j                        k(  r| j	                  |      S | j                  |   }| j
                  |   }|j                         }|s| j
                  |= | j                  |= |\  }}}| j                  ||f= | j                  ||f= |S r&   )	bisectbisect_leftrZ   lenrr   r[   ru   r\   r]   )	r   r   r    rp   rx   blockrq   startstops	            r"   _malloczHeap._malloc   s    t}}d3DMM""??4((]]1%F""6*CGGIE$$V,dmmA.>$t  %0.r$   c                    |\  }}}	 | j                   ||f   }| j                  |      \  }}	 | j                  ||f   }| j                  |      \  }}|||f}||z
  }	 | j                  |   j                  |       || j                  ||f<   || j                   ||f<   y # t        $ r Y }w xY w# t        $ r Y fw xY w# t        $ r3 |g| j                  |<   t        j                  | j                  |       Y |w xY wr&   )	r]   _absorbKeyErrorr\   r[   ro   r{   insortrZ   )	r   r~   rq   r   r   
prev_block_
next_blockrp   s	            r"   _add_free_blockzHeap._add_free_block   s    $t	0,,eU^<J ||J/HE1	/--udm<J ll:.GAtt$	1V$++E2
 05eU^,-2UDM*-  		  		  	1(-wDV$MM$--0	1s4   B B. B= 	B+*B+.	B:9B:=9C98C9c                     |\  }}}| j                   ||f= | j                  ||f= ||z
  }| j                  |   }|j                  |       |s(| j                  |= | j                  j                  |       ||fS r&   )r\   r]   r[   rv   rZ   )r   r~   rq   r   r   rp   rx   s          r"   r   zHeap._absorb   s    $t  %0.v&

5  (MM  (d{r$   c                 |    |\  }}}| j                   |   }|j                  ||f       |s| j                  |       y y r&   )r_   rv   ry   )r   r~   rq   r   r   rw   s         r"   _remove_allocated_blockzHeap._remove_allocated_block   sD    "ud''.udm$& r$   c                     	 	 | j                   j                         }| j                  |       | j	                  |       ># t        $ r Y y w xY wr&   )ra   ru   
IndexErrorr   r   r   r~   s     r"   _free_pending_blockszHeap._free_pending_blocks  sU    11557   '((/   s   A   	AAc                 $   t        j                         | j                  k7  r7t        dj	                  t        j                         | j                              | j
                  j                  d      s| j                  j                  |       y 	 | xj                  dz  c_	        | j                          | j                  |       | j                  |       | j
                  j                          y # | j
                  j                          w xY w)Nz$My pid ({0:n}) is not last pid {1:n}Fr   )r   r   rU   rH   formatrX   acquirera   ro   rc   r   r   r   releaser   s     r"   freez	Heap.free  s     99;$--'6==IIK/0 0 zz!!%( %%,,U3%"))+$$U+,,U3

""$

""$s   AC3 3Dc                    |dk  rt        dj                  |            t        j                  |k  rt	        dj                  |            t        j                         | j                  k7  r| j                          | j                  5  | xj                  dz  c_
        | j                          | j                  t        |d      | j                        }| j                  |      \  }}}||z   }||k  r| j!                  |||f       | j"                  |   j%                  ||f       |||fcd d d        S # 1 sw Y   y xY w)Nr   Size {0:n} out of rangeSize {0:n} too larger   )rH   r   rE   maxsizeOverflowErrorr   r   rU   r#   rX   rb   r   rh   rk   
_alignmentr   r   r_   add)r   r   rq   r   r   	real_stops         r"   malloczHeap.malloc(  s   !86==dCDD;;$ 6 = =d CDD99;$--'MMOZZ 	-OOq O%%'==T1t?D#'<<#5 UE4I4 $$eY%=>""5)--ui.@A5),	- 	- 	-s   
B#D77E N)r+   r,   r-   r   rt   rm   r   rl   r#   staticmethodrh   rr   ry   r   r   r   r   r   r   r   r1   r$   r"   rQ   rQ   s   sb     J&3#, MM : " "

")$"3<'0%8-r$   rQ   c                   &    e Zd Z e       Zd Zd Zy)r   c                 N   |dk  rt        dj                  |            t        j                  |k  rt	        dj                  |            t
        j                  j                  |      }||f| _        t        j                  | t
        j                  j                  |f       y )Nr   r   r   )args)rH   r   rE   r   r   r   _heapr   r   r   r;   r   )r   r   r~   s      r"   r#   zBufferWrapper.__init__F  s    !86==dCDD;;$ 6 = =d CDD##**40dmdM//44E8Dr$   c                 ^    | j                   \  \  }}}}t        |j                        |||z    S r&   )r   
memoryviewr   )r   rq   r   r   r   s        r"   create_memoryviewzBufferWrapper.create_memoryviewO  s1    %)[["td%,,'eDj99r$   N)r+   r,   r-   rQ   r   r#   r   r1   r$   r"   r   r   B  s    FEE:r$   )r{   collectionsr   r   r   rE   r/   rV   contextr   r    r   __all__rF   r   objectr   rL   rI   registerrQ   r   r1   r$   r"   <module>r      s     #  	 
   / 
 <<7F FH' 'B>+ Iul+I-6 I-^:F :r$   