+
    €",iÓª  ã                   óf  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIt^ RIHt ^ RIHtHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHt ^ RIHt ^ RI H!t!H"t"H#t#H$t$H%t% ^ R	I&H't'H(t(H)t) R
 t*R t+R t,R t-R t.]%]$R 4       4       t/]%]$])! ]P                  R8g  RR7      R 4       4       4       t0]%]$R 4       4       t1]%R 4       t2]%]$]'! R]]Pf                  .RR.R7      R 4       4       4       t4]%]$]'! R]]Pf                  .RR.R7      R 4       4       4       t5]%]$]'! RRR.4      R 4       4       4       t6]%]$]'! RRR.4      R 4       4       4       t7]%]$]'! RRR.4      R 4       4       4       t8]%]$]'! RRR.4      R  4       4       4       t9]%]$R! 4       4       t:]%]$R" 4       4       t;]%]$]'! RRR.4      R# 4       4       4       t<]%]$]'! RRR.4      R$ 4       4       4       t=]%]$]'! RRR.4      R% 4       4       4       t>]%]$]'! R]]Pf                  .RR.R7      R& 4       4       4       t?]%]$]'! R]P€                  ! R]P‚                  P…                  R'R7      R(7      R.4      R) 4       4       4       tC]%]$]'! R]]Pf                  .RR.R7      R* 4       4       4       tD]%]$]#]'! R]]Pf                  .RR.R7      R+ 4       4       4       4       tE]%]$]#]'! R]]Pf                  .RR.R7      R, 4       4       4       4       tF]%]$]'! R]]Pf                  .RR.R7      R- 4       4       4       tGR. tH]%]$]'! R]]Pf                  .RR.R7      R/ 4       4       4       tIR0 tJ]%]$]'! R1]K! ]P˜                  ! ]]Pf                  .]M! ^4      4      4      ]P˜                  ! RR.]N! ]O]M! ^4      4      4       U Uu. uF  w  rR2P¡                  W4      NK  	  upp R7      R3 4       4       4       tQR4 tRR5 tS]%])! ]P                  R8H  R6R7      ]'! R7R8R9.4      R: 4       4       4       tT]%R; 4       tUR< tV]%]$R= 4       4       tW]%]$R> 4       4       tXR# u upp i )?é    N)Úsleep)ÚArrayMemmapForwardReducerÚ_get_backing_memmapÚ_get_temp_dirÚ_strided_from_memmapÚ_WeakArrayKeyMapÚhas_shareable_memory)Úmake_memmap)Ú_TestingMemmappingExecutor)ÚParallelÚdelayed)ÚMemmappingPool)ÚIS_GIL_DISABLEDÚnpÚwith_dev_shmÚwith_multiprocessingÚ
with_numpy)ÚparametrizeÚraisesÚskipifc                  ó6   € \         P                  ! R RR7       R# )i,  T)ÚtimeoutÚexitN)ÚfaulthandlerÚdump_traceback_later© ó    Ú=/usr/lib/python3/dist-packages/joblib/test/test_memmapping.pyÚsetup_moduler   &   s   € Ü×%Ò%¨c¸×=r   c                  ó0   € \         P                  ! 4        R # ©N)r   Úcancel_dump_traceback_laterr   r   r   Úteardown_moduler#   *   s   € Ü×,Ò,Ö.r   c                 ó$   € \        V 4      f   Q hV # r!   )r   )Úarrays   &r   Úcheck_memmap_and_send_backr&   .   s   € Ü˜uÓ%Ò1Ð1Ð1Ø€Lr   c                ó\   € V w  rp\         P                  P                  W,          V4       R# )z„Dummy helper function to be executed in subprocesses

Check that the provided array has the expected values in the provided
range.

N©r   ÚtestingÚassert_array_equal©ÚargsÚdataÚpositionÚexpecteds   &   r   Úcheck_arrayr0   3   s$   € ð  $Ñ€D�HÜ‡J�J×!Ñ! $¥.°(Ö;r   c                ó°   € V w  rpW,          V8X  g   Q hW;;,          ^,          uu&   \         P                  P                  W,          ^V,          4       R# )zÌDummy helper function to be executed in subprocesses


Check that the input array has the right values in the provided range
and perform an inplace modification to double the values in the range by
two.

Nr(   r+   s   &   r   Úinplace_doubler2   >   sD   € ð  $Ñ€D�HØ�>˜XÔ%Ð%Ð%Ø‡N�aÕƒNÜ‡J�J×!Ñ! $¥.°!°hµ,Ö?r   c           	     ó²  a€ \         P                  P                  pV P                  R4      P                  p\         P
                  ! V\         P                  RRR7      pR\         P                  ! VP                  ^ ,          VP                  R7      ,          VR&   VP                  4        \         P
                  ! V\         P                  RRR^R	7      p\         P                  ! ^<4      P                  VP                  4      VR&   V^R1^R1R
3,          pVP                  ^
^24      p\         P                  ! V4      pVP                  p\        RV P                  RR4      oV3R lp	V	! V4      p
\        V
4      '       g   Q h\!        V
\         P
                  4      '       g   Q hV! W¤4       V	! V4      p\        V4      '       g   Q hV! Wµ4       V	! V4      p\        V4      '       g   Q hV! WÆ4       V	! V4      p\!        V\         P
                  4      '       d   Q h\        V4      '       g   Q hV! W×4       V	! V4      p\!        V\         P
                  4      '       d   Q h\        V4      '       g   Q hV! Wè4       V^,          p\        V4      '       d   Q hV	! V4      p\        V4      '       d   Q h\!        V\         P
                  4      '       d   Q hV! VV^,          4       \         P                  ! V4      p\        V4      '       d   Q hV	! V4      p\!        V\         P"                  4      '       g   Q h\        V4      '       d   Q hV! VV4       R# )z9Check that it is possible to reduce a memmap backed arrayú	test.mmapiô  úw+©ÚdtypeÚshapeÚmode©r7   ºNNNúr+ÚF)r7   r8   r9   ÚorderÚoffset:é   é   NNÚcTc                 ó$   <€ S! V 4      w  rV! V!  # r!   r   ©ÚxÚconsr,   Úreducers   &  €r   Úreconstruct_array_or_memmapÚEtest_memmap_based_array_reducing.<locals>.reconstruct_array_or_memmaps   ó   ø€ Ù˜Q“Z‰
ˆÙ�T‰{Ðr   g      ð¿)é   é   rA   éÿÿÿÿ)r   r)   r*   ÚjoinÚstrpathÚmemmapÚfloat64Úaranger8   r7   ÚflushÚreshapeÚasarrayÚTr   r	   Ú
isinstanceÚndarray)Útmpdirr*   ÚfilenameÚbufferÚaÚbÚb2rB   ÚdrH   Úa_reconstructedÚb_reconstructedÚb2_reconstructedÚc_reconstructedÚd_reconstructedÚa3Úa3_reconstructedÚb3Úb3_reconstructedrG   s   &                  @r   Ú test_memmap_based_array_reducingri   M   sÕ  ø€ ô Ÿ™×6Ñ6ÐØ�{‰{˜;Ó'×/Ñ/€Hô �YŠY�x¤r§z¡z¸À4ÔH€Fð ”r—y’y §¡¨a¥¸¿¹ÔEÕE€Fˆ1�IØ
‡L�L„Nô 	�	Š	ØœŸ
™
¨)¸$ÀcÐRSô	€Aô �9Š9�R‹=× Ñ  §¡Ó)€A€a�Dð
 	
ˆ!ˆBˆ$��"��cˆ/Õ€Að 
�‰˜˜BÓ	€Bô 	�
Š
�1‹€AØ	�‰€Aô (¨¨f¯n©n¸cÀ4ÓH€Gõñ
 2°!Ó4€OÜ ×0Ò0Ð0Ð0Ü�o¤r§y¡y×1Ò1Ð1Ð1Ù�Ô*ñ 2°!Ó4€OÜ ×0Ò0Ð0Ð0Ù�Ô*ñ 3°2Ó6ÐÜÐ 0×1Ò1Ð1Ð1ÙÐ'Ô,ñ 2°!Ó4€OÜ˜/¬2¯9©9×5Ò5Ð5Ð5Ü ×0Ò0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ˜/¬2¯9©9×5Ò5Ð5Ð5Ü ×0Ò0Ð0Ð0Ù�Ô*ð 
ˆQ�€BÜ# B×'Ò'Ð'Ð'Ù2°2Ó6ÐÜ#Ð$4×5Ò5Ð5Ð5ÜÐ*¬B¯I©I×6Ò6Ð6Ð6ÙÐ'¨¨Q­Ô/ô 
�Š�B‹€BÜ# B×'Ò'Ð'Ð'á2°2Ó6ÐÜÐ&¬¯
©
×3Ò3Ð3Ð3Ü#Ð$4×5Ò5Ð5Ð5ÙÐ'¨Ö,r   Úwin32z2PermissionError only easily triggerable on Windows)Úreasonc                 óÜ  € V P                  R 4      P                  pRP                  VR7      p\        P                  ! \
        P                  RV.\        P                  \        P                  R7      pVP                  4        VP                  4       w  rEVP                  ^ 8X  g   Q VP                  4       4       hVR8X  g   Q hRP                  V4      pWeP                  4       9   g   Q hR# )r4   aæ  if 1:
    import os
    import numpy as np
    import time
    from joblib.externals.loky.backend import resource_tracker
    resource_tracker.VERBOSE = 1

    # Start the resource tracker
    resource_tracker.ensure_running()
    time.sleep(1)

    # Create a file containing numpy data
    memmap = np.memmap(r"{filename}", dtype=np.float64, shape=10, mode='w+')
    memmap[:] = np.arange(10).astype(np.int8).data
    memmap.flush()
    assert os.path.exists(r"{filename}")
    del memmap

    # Create a np.memmap backed by this file
    memmap = np.memmap(r"{filename}", dtype=np.float64, shape=10, mode='w+')
    resource_tracker.register(r"{filename}", "file")

    # Ask the resource_tracker to delete the file backing the np.memmap , this
    # should raise PermissionError that the resource_tracker will log.
    resource_tracker.maybe_unlink(r"{filename}", "file")

    # Wait for the resource_tracker to process the maybe_unlink before cleaning
    # up the memmap
    time.sleep(2)
    )rZ   ú-c©ÚstderrÚstdoutr   z'tried to unlink {}, got PermissionErrorN)rN   rO   ÚformatÚ
subprocessÚPopenÚsysÚ
executableÚPIPEÚwaitÚcommunicateÚ
returncodeÚdecode)rY   rZ   ÚcmdÚpÚoutÚerrÚmsgs   &      r   Ú2test_resource_tracker_retries_when_permissionerrorr€   ¥   s¿   € ð �{‰{˜;Ó'×/Ñ/€Hð÷: 	‰˜ˆÓ!ð; ô< 	×ÒÜ	�‰˜˜sÐ#¬J¯O©OÄJÇOÁOô	€Að ‡F�F„HØ�}‰}‹�H€CØ�<‰<˜1ÔÐ*˜cŸj™j›lÓ*ÐØ�#Œ:Ðˆ:Ø
3×
:Ñ
:¸8Ó
D€CØ—*‘*“,ÔÐÒr   c                 óL  a€ \         P                  P                  pV P                  R 4      P                  p\         P
                  ! V\         P                  R
RR7      p\         P                  ! R4      P                  VP                  4      VR&   VR,          pVR,          pVR,          pVR,          p\        RV P                  RR4      oV3R	 lpV! V4      p	\        V	4      '       g   Q h\        V	\         P
                  4      '       g   Q hV! W“4       V! V4      p
\        V
4      '       g   Q hV! W¤4       V! V4      p\        V4      '       g   Q hV! Wµ4       V! V4      p\        V4      '       g   Q hV! WÆ4       V! V4      p\        V4      '       g   Q hV! W×4       R# )r4   r5   r6   r;   :r   é
   N:é   rK   rA   NrB   Tc                 ó$   <€ S! V 4      w  rV! V!  # r!   r   rD   s   &  €r   rH   ÚNtest_high_dimension_memmap_array_reducing.<locals>.reconstruct_array_or_memmapë   rJ   r   )éd   é   r‡   rK   i¬ )r;   :rL   r‚   N)r;   r;   r;   r   )r   r)   r*   rN   rO   rP   rQ   rR   rT   r8   r   r	   rW   )rY   r*   rZ   r\   r]   rB   r_   ÚerH   r`   ra   rc   rd   Úe_reconstructedrG   s   &             @r   Ú)test_high_dimension_memmap_array_reducingrŠ   ×   so  ø€ ô Ÿ™×6Ñ6Ðà�{‰{˜;Ó'×/Ñ/€Hô 	�	Š	�(¤"§*¡*Ð4DÈ4ÔP€AÜ�9Š9Ð&Ó'×/Ñ/°·±Ó8€A€a�Dð 	
ˆ$�€AØ	ˆ'�
€AØ	ˆ*�€AØ	ˆ%�€Aô (¨¨f¯n©n¸cÀ4ÓH€Gõñ 2°!Ó4€OÜ ×0Ò0Ð0Ð0Ü�o¤r§y¡y×1Ò1Ð1Ð1Ù�Ô*á1°!Ó4€OÜ ×0Ò0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ ×0Ò0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ ×0Ò0Ð0Ð0Ù�Ô*á1°!Ó4€OÜ ×0Ò0Ð0Ð0Ù�Ö*r   c                 óØ  € V P                  R 4      P                  p^\        P                  ,          p\        P                  ^,           p\        P
                  ! VRW#,           R7      p\        VRRVRVRRRR7	      p\        V\        P
                  4      '       g   Q hVP                  V8X  g   Q h\        VRRVRV^,          3R	VRR7	      p\        V4      P                  V8X  g   Q hR# )
r4   r5   )r9   r8   Úuint8ÚrÚCNF)r7   r9   r?   r>   r8   ÚstridesÚtotal_buffer_lenÚunlink_on_gc_collect©r@   )
rN   rO   ÚmmapÚALLOCATIONGRANULARITYr   rP   r   rW   r?   r   )rY   ÚfnameÚsizer?   Ú
memmap_objÚmemmap_backed_objs   &     r   Útest__strided_from_memmapr™     sä   € à�K‰K˜Ó$×,Ñ,€EØŒt×)Ñ)Õ)€DÜ×'Ñ'¨!Õ+€Fä—’˜5 t°4µ=ÔA€Jä%ØØØØØØØØØ"ô
€Jô �j¤"§)¡)×,Ò,Ð,Ð,Ø×Ñ Ô&Ð&Ð&Ü,ØØØØØØ�q�yˆlØØØ"ô
Ðô Ð0Ó1×8Ñ8¸FÔBÐBÒBr   ÚfactoryÚmultiprocessingÚloky)Úidsc                ó  € \         P                  P                  pVP                  R4      P                  pV ! ^
^VR7      p VP                  R4      P                  p\         P                  ! V\         P                  RRR7      pVP                  R4       TP                  \        \        VP                  ^ ,          4       UUu. uF+  p\        VP                  ^,          4       F  q†Wx3R3NK
  	  K-  	  upp4       V! V^\         P                  ! VP                  4      ,          4       \         P                  ! V\         P                  RRR7      p	TP                  \        \        V	P                  ^ ,          4       UUu. uF+  p\        V	P                  ^,          4       F  q‰Wx3R3NK
  	  K-  	  upp4       \        P                  ! V4      . 8X  g   Q hV! V^\         P                  ! VP                  4      ,          4       V! V	^\         P                  ! V	P                  4      ,          4       \         P                  ! V\         P                  RR	^R
7      p
\!        \"        4      ;_uu_ 4        TP                  \$        \        V
P                  ^ ,          4       Uu. uF  qzVR3NK	  	  up4       RRR4       \!        \&        \(        34      ;_uu_ 4        TP                  \        \        V
P                  ^ ,          4       Uu. uF  qzVR3NK	  	  up4       RRR4       VP+                  4        ?R# u uppi u uppi u upi   + '       g   i     Lœ; iu upi   + '       g   i     LL; i  TP+                  4        ?i ; i)z@Check that subprocess can access and update shared memory memmapÚpool©Ú
max_nbytesÚtemp_folderr4   r5   r6   ç      ð?rB   g       @r�   )r7   r8   r9   r?   g      @N©rK   rL   )rL   rK   ©r‚   )r   r)   r*   ÚmkdirrO   rN   rP   Úfloat32ÚfillÚmapr2   Úranger8   ÚonesÚosÚlistdirr   ÚAssertionErrorr0   ÚRuntimeErrorÚ
ValueErrorÚ	terminate)rš   rY   r*   Úpool_temp_folderr|   rZ   r\   ÚiÚjr]   rB   s   &&         r   Útest_pool_with_memmaprµ   (  s‹  € ô Ÿ™×6Ñ6Ðð —|‘| FÓ+×3Ñ3ÐÙ�˜qÐ.>Ô?€Að)Ø—;‘;˜{Ó+×3Ñ3ˆÜ�IŠI�h¤b§j¡j¸ÀTÔJˆØ	�‰ˆsŒà	�‰ÜÜ',¨Q¯W©W°Q­ZÔ'8ÔTÑ'8 !Ä%ÈÏÉÐPQÍ
ÖBS¸Q�!�˜ÓÑBSÑÑ'8ÒTô	
ñ
 	˜1˜a¤"§'¢'¨!¯'©'Ó"2Õ2Ô3ô �IŠI�h¤b§j¡j¸ÀSÔIˆà	�‰ÜÜ',¨Q¯W©W°Q­ZÔ'8ÔTÑ'8 !Ä%ÈÏÉÐPQÍ
ÖBS¸Q�!�˜ÓÑBSÑÑ'8ÒTô	
ô �zŠzÐ*Ó+¨rÔ1Ð1Ð1ñ 	˜1˜a¤"§'¢'¨!¯'©'Ó"2Õ2Ô3Ù˜1˜a¤"§'¢'¨!¯'©'Ó"2Õ2Ô3ô �IŠI�h¤b§j¡j¸ÀCÐPUÔVˆä”N×#Õ#Ø�E‰E”+´U¸1¿7¹7À1½:Ô5FÓGÑ5F° A s£Ñ5FÑGÔH÷ $ô
 ”\¤:Ð.×/Õ/Ø�E‰E”.¼¸a¿g¹gÀa½jÔ8IÓ"JÑ8I°1 q¨#£;Ñ8IÑ"JÔK÷ 0ð 	
�‰ŒÚùóE Uùó Uùò  H÷ $×#üò #K÷ 0×/ûð 	
�‰ŒÙús�   ÁBM7 Ã1L;Ã6BM7 Æ1MÆ4CM7 É5/MÊ$MÊ1MÊ8%M7 Ë/M$ÌMÌM$Ì M7 Ì;M7 ÍMÍM	ÍM7 ÍM$Í$M4	Í/M7 Í7N
c                óæ  € \         P                  P                  pVP                  R4      P                  pV ! ^
^VR7      p VP                  R4      P                  p\         P                  ! V\         P                  RRR7      pVP                  R4       \         P                  ! V4      p\        V\         P                  4      '       d   Q h\        V4      '       g   Q hTP                  \        \        VP                  ^ ,          4       UU	u. uF,  p\        VP                  ^,          4       F	  p	WxV	3R3NK  	  K.  	  up	p4       V! V^\         P                   ! VP                  4      ,          4       V! V^\         P                   ! VP                  4      ,          4       \"        P$                  ! V4      . 8X  g   Q h VP'                  4        ?R# u up	pi   TP'                  4        ?i ; i)	z?Check that subprocess can access and update shared memory arrayrŸ   r    r4   r5   r6   r£   Nr¤   )r   r)   r*   r¦   rO   rN   rP   r§   r¨   rU   rW   r	   r©   r2   rª   r8   r«   r¬   r­   r±   )
rš   rY   r*   r²   r|   rZ   r\   Úa_viewr³   r´   s
   &&        r   Ú test_pool_with_memmap_array_viewr¸   b  s€  € ô Ÿ™×6Ñ6Ðð —|‘| FÓ+×3Ñ3ÐÙ�˜qÐ.>Ô?€AðØ—;‘;˜{Ó+×3Ñ3ˆÜ�IŠI�h¤b§j¡j¸ÀTÔJˆØ	�‰ˆsŒô —’˜A“ˆÜ˜f¤b§i¡i×0Ò0Ð0Ð0Ü# F×+Ò+Ð+Ð+à	�‰Üô ˜qŸw™w q�zÔ*ôá*�AÜ˜qŸw™w q�zÖ*�Að ˜Q˜ Ó%á*ñ &Ù*òô	
ñ 	˜1˜a¤"§'¢'¨!¯'©'Ó"2Õ2Ô3Ù˜6 1¤r§w¢w¨q¯w©wÓ'7Õ#7Ô8ô �zŠzÐ*Ó+¨rÔ1Ð1Ñ1ð 	
�‰ŒÚùó#øð  	
�‰ŒÙús    ÁCG Ä2GÅBG ÇG ÇG0Úbackendc                 ó~  € R P                  V R7      p\        P                  ! \        P                  RV.\        P
                  \        P
                  R7      pVP                  4        VP                  4       w  r4VP                  ^ 8X  g2   Q VP                  4       R,           VP                  4       ,           4       hR# )á€  if 1:
        import numpy as np
        from joblib import Parallel, delayed


        data = np.random.rand(int(2e6)).reshape((int(1e6), 2))

        # Build a complex cyclic reference that is likely to delay garbage
        # collection of the memmapped array in the worker processes.
        first_list = current_list = [data]
        for i in range(10):
            current_list = [current_list]
        first_list.append(current_list)

        if __name__ == "__main__":
            results = Parallel(n_jobs=2, backend="{b}")(
                delayed(len)(current_list) for i in range(10))
            assert results == [1] * 10
    ©r]   rm   rn   ú

N)
rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   ©r¹   r{   r|   r}   r~   s   &    r   Ú-test_permission_error_windows_reference_cycler¿   �  s‹   € ð÷$ 	‰�ˆÓð% ô& 	×ÒÜ	�‰˜˜sÐ#¬J¯O©OÄJÇOÁOô	€Að ‡F�F„HØ�}‰}‹�H€CØ�<‰<˜1ÔÐB˜cŸj™j›l¨VÕ3°c·j±j³lÕBÓBÒr   c                 óü  € R P                  V R7      p\        ^4       FÚ  p\        P                  P	                  4       p\        P
                  P                  \        4      VR&   \        P                  ! \        P                  RV.\        P                  \        P                  VR7      pVP                  4        VP                  4       w  rVVP                  ^ 8X  g   Q V4       hVR8X  g   Q hRV9  d   KÚ  Q h	  R# )ak  if 1:
        import os
        import time

        import numpy as np

        from joblib import Parallel, delayed
        from testutils import return_slice_of_data

        data = np.ones(int(2e6))

        if __name__ == '__main__':
            # warm-up call to launch the workers and start the resource_tracker
            _ = Parallel(n_jobs=2, verbose=5, backend='{b}')(
                delayed(id)(i) for i in range(20))

            time.sleep(0.5)

            slice_of_data = Parallel(n_jobs=2, verbose=5, backend='{b}')(
                delayed(return_slice_of_data)(data, 0, 20) for _ in range(10))
    r¼   Ú
PYTHONPATHrm   ©ro   rp   Úenvr   ó   resource_trackerN)rq   rª   r¬   ÚenvironÚcopyÚpathÚdirnameÚ__file__rr   rs   rt   ru   rv   rw   rx   ry   )r¹   r{   Ú_rÃ   r|   r}   r~   s   &      r   Ú3test_permission_error_windows_memmap_sent_to_parentrË   ´  sÉ   € ð÷( 	‰�ˆÓð) ô, �1ŽXˆÜ�j‰j�o‰oÓˆÜŸG™GŸO™O¬HÓ5ˆˆLÑÜ×ÒÜ�^‰^˜T 3Ð'Ü—?‘?Ü—?‘?Øô	
ˆð 	
�‰ŒØ—=‘=“?‰ˆØ�|‰|˜qÔ Ð% #Ó%Ð Ø�cŒzÐˆzØ"¨#Ö-Ð-Ð-ó r   c                 óp  a€ \         P                  ! \        R 4      4      o\        ^V ^
R7      ! V3R l\	        ^4       4       4      w  p\        ^V ^
R7      ! V3R l\	        ^4       4       4      w  p\
        P                  P                  V4      \
        P                  P                  V4      8w  g   Q hR# )ç      Y@©Ún_jobsr¹   r¡   c              3   óP   <"  € T F  p\        \        4      ! SR 4      x € K  	  R# 5i©rZ   N©r   Úgetattr©Ú.0rÊ   r%   s   & €r   Ú	<genexpr>Ú6test_parallel_isolated_temp_folders.<locals>.<genexpr>ë  ó$   øé € ð FÙ5=°Œ”Ô˜ 
×+Ð+³Xùó   ƒ#&c              3   óP   <"  € T F  p\        \        4      ! SR 4      x € K  	  R# 5irÑ   rÒ   rÔ   s   & €r   rÖ   r×   î  rØ   rÙ   N©r   rR   Úintr   rª   r¬   rÇ   rÈ   )r¹   Ú
filename_1Ú
filename_2r%   s   &  @r   Ú#test_parallel_isolated_temp_foldersrß   ä  s“   ø€ ô �IŠI”c˜#“hÓ€EÜ 1¨gÀ"ÕEô FÜ5:¸1´XóFó �L€Zô  1¨gÀ"ÕEô FÜ5:¸1´XóFó �L€Zô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÔEÐEÒEr   c                 ó¤  a€ \         P                  ! \        R 4      4      o\        ^V ^
R7      ;_uu_ 4       pV! V3R l\	        ^4       4       4      w  pV! V3R l\	        ^4       4       4      w  pRRR4       \
        P                  P                  X4      \
        P                  P                  X4      8X  g   Q hR#   + '       g   i     LU; i)rÍ   rÎ   c              3   óP   <"  € T F  p\        \        4      ! SR 4      x € K  	  R# 5irÑ   rÒ   rÔ   s   & €r   rÖ   Ú9test_managed_backend_reuse_temp_folder.<locals>.<genexpr>û  ó    øé € ÐOÁhÀœ¤Ô)¨%°×<Ð<ÃhùrÙ   c              3   óP   <"  € T F  p\        \        4      ! SR 4      x € K  	  R# 5irÑ   rÒ   rÔ   s   & €r   rÖ   râ   ü  rã   rÙ   NrÛ   )r¹   r|   rÝ   rÞ   r%   s   &   @r   Ú&test_managed_backend_reuse_temp_folderrå   ô  sŒ   ø€ ô
 �IŠI”c˜#“hÓ€EÜ	˜ G¸×	;Õ	;¸qÙÔOÄeÈAÄhÓOÓO‰ˆÙÔOÄeÈAÄhÓOÓO‰ˆ÷ 
<ô �7‰7�?‰?˜:Ó&¬"¯'©'¯/©/¸*Ó*EÔEÐEÒE÷ 
<×	;ús   ·;B?Â?C	c                  ó®  € \         P                  ! \        R 4      4      p \        4       p\        4       pR p\        P
                  ! W0V3R7      p\        P
                  ! W0V3R7      pVP                  4        VP                  4        VP                  4        VP                  4        \        V4      ^8X  g   Q h\        V4      ^8X  g   Q hW8w  g   Q hR# )rÍ   c           	      ó(  a € \        R ^^
R7      ;_uu_ 4       p\        ^
4       FN  pV! V 3R l\        ^4       4       4      w  pVP                  \        P                  P                  V4      4       KP  	  RRR4       R#   + '       g   i     R# ; i)rœ   )r¹   rÏ   r¡   c              3   óP   <"  € T F  p\        \        4      ! SR 4      x € K  	  R# 5irÑ   rÒ   rÔ   s   & €r   rÖ   Ú]test_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filename.<locals>.<genexpr>  s    øé € ÐUÉHÀqœw¤wÔ/°°z×BÐBËHùrÙ   N)r   rª   Úaddr¬   rÇ   rÈ   )r%   Ú	temp_dirsr|   r³   rZ   s   f&   r   Úconcurrent_get_filenameÚJtest_memmapping_temp_folder_thread_safety.<locals>.concurrent_get_filename  sa   ø€ Ü˜f¨Q¸2×>Õ>À!Ü˜2–Y�ÙÔUÌEÐRSÌHÓUÓU‘
�Ø—‘œbŸg™gŸo™o¨hÓ7Ö8ñ ÷ ?×>×>Ò>ús   ˜AB Â B	)Útargetr,   N)	r   rR   rÜ   ÚsetÚ	threadingÚThreadÚstartrN   Úlen)r%   Útemp_dirs_thread_1Útemp_dirs_thread_2rì   Út1Út2s         r   Ú)test_memmapping_temp_folder_thread_safetyrø      s»   € ô �IŠI”c˜#“hÓ€Eä›ÐÜ›Ðò9ô 
×	Ò	Ø&Ð5GÐ-Hô
€Bô 
×	Ò	Ø&Ð5GÐ-Hô
€Bð ‡H�H„JØ‡H�H„Jà‡G�G„IØ‡G�G„IäÐ!Ó" aÔ'Ð'Ð'ÜÐ!Ó" aÔ'Ð'Ð'àÔ3Ð3Ò3r   c            
      óž  € R p . ROpV FÀ  w  r#p\         P                  ! \        P                  RV P	                  W#R7      .\         P
                  \         P
                  R7      pVP                  4        VP                  4       w  rgVP                  V8X  g   Q VP                  4       4       hRV9  d   K­  Q VP                  4       4       h	  R# )a>  if 1:
        import os
        import numpy as np
        from joblib import Parallel, delayed
        from joblib.externals.loky.backend import resource_tracker
        from concurrent.futures import ThreadPoolExecutor, wait

        resource_tracker.VERBOSE = 0

        array = np.arange(int(1e2))

        temp_dirs_thread_1 = set()
        temp_dirs_thread_2 = set()


        def raise_error(array):
            raise ValueError


        def parallel_get_filename(array, temp_dirs):
            with Parallel(backend="loky", n_jobs=2, max_nbytes=10) as p:
                for i in range(10):
                    [filename] = p(
                        delayed(getattr)(array, "filename") for _ in range(1)
                    )
                    temp_dirs.add(os.path.dirname(filename))


        def parallel_raise(array, temp_dirs):
            with Parallel(backend="loky", n_jobs=2, max_nbytes=10) as p:
                for i in range(10):
                    [filename] = p(
                        delayed(raise_error)(array) for _ in range(1)
                    )
                    temp_dirs.add(os.path.dirname(filename))


        executor = ThreadPoolExecutor(max_workers=2)

        # both function calls will use the same loky executor, but with a
        # different Parallel object.
        future_1 = executor.submit({f1}, array, temp_dirs_thread_1)
        future_2 = executor.submit({f2}, array, temp_dirs_thread_2)

        # Wait for both threads to terminate their backend
        wait([future_1, future_2])

        future_1.result()
        future_2.result()
    rm   )Úf1Úf2rn   rÄ   N))Úparallel_get_filenamerü   r   )rü   Úparallel_raiserƒ   )rý   rý   rƒ   )
rr   rs   rt   ru   rq   rv   rw   rx   ry   rz   )r{   Úfunctions_and_returncodesrú   rû   ry   r|   rÊ   r~   s           r   Ú?test_multithreaded_parallel_termination_resource_tracker_silentrÿ   &  s¨   € ð1€Còd!Ðó 8Ñˆ�
Ü×ÒÜ�^‰^˜T 3§:¡:° :Ó#;Ð<Ü—?‘?Ü—?‘?ô
ˆð
 	
�‰ŒØ—‘“‰ˆØ�|‰|˜zÔ)Ð7¨3¯:©:«<Ó7Ð)Ø"¨#Ö-Ð;¨s¯z©z«|Ó;Ð-ó 8r   c                 ó  € R P                  V R7      p\        P                  P                  4       p\        P                  P                  \        4      VR&   \        P                  ! \        P                  RV.\        P                  \        P                  VR7      pVP                  4        VP                  4       w  rEVP                  ^ 8X  g   Q VP                  4       4       hVR8X  g   Q VP                  4       4       hRV9  g   Q hR# )a÷  if 1:
        import os
        import time

        import numpy as np

        from joblib import Parallel, delayed
        from testutils import return_slice_of_data

        data = np.ones(100)

        if __name__ == '__main__':
            for i in range(5):
                slice_of_data = Parallel(
                    n_jobs=2, max_nbytes=1, backend='{b}')(
                        delayed(return_slice_of_data)(data, 0, 20)
                        for _ in range(10)
                    )
    r¼   rÁ   rm   rÂ   r   rÄ   N)rq   r¬   rÅ   rÆ   rÇ   rÈ   rÉ   rr   rs   rt   ru   rv   rw   rx   ry   rz   )r¹   r{   rÃ   r|   r}   r~   s   &     r   Ú'test_many_parallel_calls_on_same_objectr  q  sÌ   € ð÷$ 	‰�ˆÓð% ô& �*‰*�/‰/Ó
€CÜŸ™Ÿ™¬Ó1€CˆÑÜ×ÒÜ	�‰˜˜sÐ#Ü�‰Ü�‰Øô		€Að ‡F�F„HØ�}‰}‹�H€CØ�<‰<˜1ÔÐ*˜cŸj™j›lÓ*ÐØ�#Œ:Ð#�s—z‘z“|Ó#ˆ:Ø cÔ)Ð)Ò)r   c                 ó¶   a€ \         P                  ! \        R 4      4      o\        ^V ^dR7      ! V3R l\	        ^4       4       4      w  p\        V4      e   Q hR# )g     @�@rÎ   c              3   óN   <"  € T F  p\        \        4      ! S4      x € K  	  R # 5ir!   )r   r&   )rÕ   rÊ   r-   s   & €r   rÖ   Ú8test_memmap_returned_as_regular_array.<locals>.<genexpr>¢  s#   øé € ð CÙ;C°aŒÔ*Ô+¨D×1Ð1»8ùs   ƒ"%N)r   r«   rÜ   r   rª   r   )r¹   Úresultr-   s   & @r   Ú%test_memmap_returned_as_regular_arrayr  œ  sR   ø€ ô �7Š7”3�s“8Ó€Dä˜q¨'¸cÕBô CÜ;@À¼8óCó �H€Vô ˜vÓ&Ò.Ð.Ò.r   c                 ó&  € V R 8X  d<   \         P                  P                  R4      '       d   \        P                  ! R4       RP                  V R7      p\        P                  ! \         P                  RV.\        P                  \        P                  R7      pVP                  4        VP                  4       w  r4VP                  4       pVP                  4       pVP                  ^ 8X  g   Q VR,           V,           4       hRV9  g   Q V4       hR	# )
rœ   ÚwinzVThe temporary folder cannot be deleted on Windows in the presence of a reference cycler»   r¼   rm   rn   r½   Úresource_trackerN)rt   ÚplatformÚ
startswithÚpytestÚxfailrq   rr   rs   ru   rv   rw   rx   rz   ry   r¾   s   &    r   Ú2test_resource_tracker_silent_when_reference_cyclesr  ¨  sØ   € ð" �&ÔœSŸ\™\×4Ñ4°U×;Ò;ô 	�Šð,ô	
ð
÷$ 	‰�ˆÓð% ô& 	×ÒÜ	�‰˜˜sÐ#¬J¯O©OÄJÇOÁOô	€Að ‡F�F„HØ�}‰}‹�H€CØ
�*‰*‹,€CØ
�*‰*‹,€CØ�<‰<˜1ÔÐ0˜c F�l¨SÕ0Ó0ÐØ SÔ(Ð-¨#Ó-Ò(r   c           	     óê  € \         P                  ! VP                  4      . 8X  g   Q hV ! ^^(VP                  ^R7      p \         P                  ! VP                  4      . 8X  g   Q h\         P                  P	                  VP
                  4      '       d   Q h\        P                  ! ^\        P                  R7      pVP                  ^8X  g   Q hTP                  \        \        VP                  ^ ,          4       Uu. uF  qCVR3NK	  	  up4       \         P                  ! VP                  4      . 8X  g   Q h\        P                  ! ^d\        P                  R7      pVP                  R8X  g   Q hTP                  \        \        VP                  ^ ,          4       Uu. uF  qEVR3NK	  	  up4       \         P                  P                  VP
                  4      '       g   Q h\         P                  ! VP
                  4      p\!        V4      ^8X  g   Q h\        P"                  ! R.^d,          RR7      pVP                  \$        V.4      pV^ ,          '       d   Q h VP'                  4        \        ^
4       FA  p\)        R4       \         P                  P	                  VP
                  4      '       d   K?   ?R	# 	  \+        RP-                  VP
                  4      4      hu upi u upi   TP'                  4        \        ^
4       F@  p\)        R4       \         P                  P	                  TP
                  4      '       d   K?   ?i 	  \+        RP-                  TP
                  4      4      h; i)
z0Check that large arrays are not copied in memory)r¡   r¢   Úverboser:   r£   é   ÚabcÚobjectçš™™™™™¹?z#temporary folder {} was not deletedN)r¬   r­   rO   rÇ   ÚexistsÚ_temp_folderr   r«   r§   Únbytesr©   r0   rª   r8   rQ   Úisdirró   r%   r	   r±   r   r®   rq   )	rš   rY   r|   Úsmallr³   ÚlargeÚdumped_filenamesÚobjectsÚresultss	   &&       r   Ú%test_memmapping_pool_for_large_arraysr  à  sŒ  € ô �:Š:�f—n‘nÓ%¨Ô+Ð+Ð+ñ 	�˜b¨f¯n©nÀaÔH€Að(ä�zŠz˜&Ÿ.™.Ó)¨RÔ/Ð/Ð/Ü—7‘7—>‘> !§.¡.×1Ò1Ð1Ð1ä—’˜¤§¡Ô,ˆØ�|‰|˜rÔ!Ð!Ð!Ø	�‰Œk´U¸5¿;¹;Àq½>Ô5JÓKÑ5J° A s›OÑ5JÑKÔLô �zŠz˜&Ÿ.™.Ó)¨RÔ/Ð/Ð/ô —’˜¤2§:¡:Ô.ˆØ�|‰|˜sÔ"Ð"Ð"Ø	�‰Œk´U¸5¿;¹;Àq½>Ô5JÓKÑ5J° A s›OÑ5JÑKÔLô �w‰w�}‰}˜QŸ^™^×,Ò,Ð,Ð,ÜŸ:š: a§n¡nÓ5ÐÜÐ#Ó$¨Ô)Ð)Ð)ô —(’(˜E˜7 S�=°Ô9ˆØ—%‘%Ô,¨w¨iÓ8ˆØ˜1—:”:Ðˆ~�:ð 	
�‰ŒÜ�r–ˆAÜ�#ŒJÜ—7‘7—>‘> !§.¡.×1Ô1Øò
 ñ ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð ùò= Lùò Løð  	
�‰ŒÜ�r–ˆAÜ�#ŒJÜ—7‘7—>‘> !§.¡.×1Ô1Øñ
 ñ ô
 !Ø5×<Ñ<¸Q¿^¹^ÓLóð úsF   ¿AK. ÂA)K. Ã>K$
ÄBK. Æ K)
Æ-5K. Ç#A9K. ÉK. Ë$
K. Ë.AM2Í	)M2z,https://github.com/joblib/joblib/issues/1086)Úmarksc                 ó–  € R P                  V R7      p\        P                  P                  4       p\        P                  P                  \        4      VR&   \        P                  ! \        P                  RV.\        P                  \        P                  VR7      pVP                  4        VP                  4       w  rEVP                  4       VP                  4       rTVP                  R4      ^ ,          pVP                   ^ 8X  g   Q T;'       g    T4       hVR8X  g   Q h\        P                  P#                  V4      '       d   Q hR# )aï  if 1:
        import os
        from pathlib import Path
        from time import sleep

        import numpy as np
        from joblib import Parallel, delayed
        from testutils import print_filename_and_raise

        data = np.random.rand(1000)

        def get_temp_folder(parallel_obj, backend):
            if "{b}" == "loky":
                return Path(parallel_obj._backend._workers._temp_folder)
            else:
                return Path(parallel_obj._backend._pool._temp_folder)


        if __name__ == "__main__":
            try:
                with Parallel(n_jobs=2, backend="{b}", max_nbytes=100) as p:
                    temp_folder = get_temp_folder(p, "{b}")
                    p(delayed(print_filename_and_raise)(data)
                              for i in range(1))
            except ValueError as e:
                # the temporary folder should be deleted by the end of this
                # call but apparently on some file systems, this takes
                # some time to be visible.
                #
                # We attempt to write into the temporary folder to test for
                # its existence and we wait for a maximum of 10 seconds.
                for i in range(100):
                    try:
                        with open(temp_folder / "some_file.txt", "w") as f:
                            f.write("some content")
                    except FileNotFoundError:
                        # temp_folder has been deleted, all is fine
                        break

                    # ... else, wait a bit and try again
                    sleep(.1)
                else:
                    raise AssertionError(
                        str(temp_folder) + " was not deleted"
                    ) from e
    r¼   rÁ   rm   rÂ   Ú
Ú N)rq   r¬   rÅ   rÆ   rÇ   rÈ   rÉ   rr   rs   rt   ru   rv   rw   rx   rz   Úsplitry   r  )r¹   r{   rÃ   r|   r}   r~   rZ   s   &      r   Ú&test_child_raises_parent_exits_cleanlyr$    s÷   € ð:-÷Z 	‰�ˆÓð[ ô\ �*‰*�/‰/Ó
€CÜŸ™Ÿ™¬Ó1€CˆÑÜ×ÒÜ	�‰˜˜sÐ#Ü�‰Ü�‰Øô		€Að ‡F�F„HØ�}‰}‹�H€CØ�z‰z‹|˜SŸZ™Z›\ˆØ�y‰y˜‹˜qÕ!€HØ�<‰<˜1ÔÐ(˜cŸj˜j SÓ(ÐØ�"Œ9Ðˆ9Ü�w‰w�~‰~˜h×'Ò'Ð'Ð'Ñ'r   c           	     ó  € V ! ^RVP                   R7      p \        P                  ! VP                   4      . 8X  g   Q h\        P                  ! ^d\        P
                  R7      pVP                  R8X  g   Q hTP                  \        \        VP                  ^ ,          4       Uu. uF  qCVR3NK	  	  up4       \        P                  ! VP                   4      . 8X  g   Q h VP                  4        ?R# u upi   TP                  4        ?i ; i)z2Check that large arrays memmapping can be disabledNr    r:   r  r£   )rO   r¬   r­   r   r«   rQ   r  r©   r0   rª   r8   r±   )rš   rY   r|   r  r³   s   &&   r   Ú.test_memmapping_pool_for_large_arrays_disabledr&  w  sÏ   € ñ 	�˜d°·±Ô?€Aðä�zŠz˜&Ÿ.™.Ó)¨RÔ/Ð/Ð/ô —’˜¤2§:¡:Ô.ˆØ�|‰|˜sÔ"Ð"Ð"Ø	�‰Œk´U¸5¿;¹;Àq½>Ô5JÓKÑ5J° A s›OÑ5JÑKÔLô �zŠz˜&Ÿ.™.Ó)¨RÔ/Ð/Ñ/ð 	
�‰ŒÚùò Løð 	
�‰ŒÙús   —BC9 Â%C4
Â2.C9 Ã4C9 Ã9Dc                ó*  € \         P                  p \        R4      \         n        V ! ^^
R7      p VP                  pRpVP	                  V4      '       g   Q h\
        P                  P                  V4      '       g   Q h\        P                  ! ^d\        P                  R7      pVP                  R8X  g   Q hVP                  \        V.^
,          4       \        \
        P                  ! V4      4      ^8X  g   Q h\        P                  ! ^d\        P                  R7      ^,          pVP                  R8X  g   Q hVP                  \        V.^
,          4       \        \
        P                  ! V4      4      ^8X  g   Q h VP!                  4        ?\#        ^d4       F5  p\
        P                  P                  V4      '       g    M\%        R4       K7  	  \'        R4      h V\         n        R#   TP!                  4        ?i ; i  T\         n        i ; i)	z1Check that memmapping uses /dev/shm when possibleg    €„~A©r¡   z"/dev/shm/joblib_memmapping_folder_r:   r  r  z(temporary folder of pool was not deletedN)ÚjmrÚSYSTEM_SHARED_MEM_FS_MIN_SIZErÜ   r  r  r¬   rÇ   r  r   r«   rQ   r  r©   Úidró   r­   r±   rª   r   r®   )rš   Ú	orig_sizer|   r²   Úfolder_prefixr\   r]   r³   s   &       r   Ú'test_memmapping_on_large_enough_dev_shmr.  ”  sœ  € ô ×1Ñ1€Ið+6ô -0°«IŒÔ)Ù�A "Ô%ˆð	ð  !Ÿ~™~ÐØ@ˆMØ#×.Ñ.¨}×=Ò=Ð=Ð=Ü—7‘7—>‘>Ð"2×3Ò3Ð3Ð3ô —’˜¤2§:¡:Ô.ˆAØ—8‘8˜s”?Ð"�?Ø�E‰E”"�q�c˜B•hÔô ”r—z’zÐ"2Ó3Ó4¸Ô9Ð9Ð9ô
 —’˜¤2§:¡:Ô.°Õ2ˆAØ—8‘8˜s”?Ð"�?Ø�E‰E”"�q�c˜B•hÔä”r—z’zÐ"2Ó3Ó4¸Ô9Ð9Ñ9ð �K‰KŒMØä�s–ˆAä—7‘7—>‘>Ð"2×3Ò3ÙÜ�#ŽJñ	 ô !Ð!KÓLÐLð ð
 -6ŒÖ)øð �K‰KŒMÙûð -6ŒÕ)ús+   ’H ±AG/ Á=DG/ ÆA H Ç/HÈH ÈHc                 ó†  € \         P                  p \        R 4      \         n        V ! ^^
R7      p VP                  pVP	                  R4      '       d   Q h VP                  4        ?\        P                  P                  V4      '       d   Q h V\         n        R#   TP                  4        ?i ; i  T\         n        i ; i)g@³ËËï6Dr(  z/dev/shmN)	r)  r*  rÜ   r  r  r±   r¬   rÇ   r  )rš   r,  r|   r²   s   &   r   Ú$test_memmapping_on_too_small_dev_shmr0  Í  s©   € ô ×1Ñ1€Ið6ô -0°«JŒÔ)á�A "Ô%ˆð	ð  !Ÿ~™~ÐØ'×2Ñ2°:×>Ò>Ð>Ð>Ð>ð �K‰KŒMØô —7‘7—>‘>Ð"2×3Ò3Ð3Ð3Ð3à,5ŒÖ)øð �K‰KŒMÙûð
 -6ŒÕ)ús(   ’B3 ±%B Á5B3 ÂB3 ÂB0Â0B3 Â3C c                óv  € \         P                  P                  pV ! ^^
VP                  R7      p VP	                  \         P
                  RR7      pVP                  4       p\        V4      '       d   Q hV! V\         P
                  ! R4      4       VP                  4        ?R#   TP                  4        ?i ; i)z:Check that large arrays are not copied in memory in returnr    éè  ©r,   N)r2  )	r   r)   r*   rO   Úapply_asyncr«   Úgetr	   r±   )rš   rY   r*   r|   Úresr  s   &&    r   Ú/test_memmapping_pool_for_large_arrays_in_returnr7  í  s�   € ô Ÿ™×6Ñ6Ðñ 	�˜b¨f¯n©nÔ=€AðØ�m‰mœBŸG™G¨'ˆmÓ2ˆØ—‘“	ˆÜ'¨×.Ò.Ð.Ð.Ù˜5¤"§'¢'¨$£-Ô0à	�‰ŒÚøð 	
�‰ŒÙús   ±A!B% Â%B8c                ó8   € \        V 4      '       g   Q hW,          # )z4Multiplication function to be executed by subprocess)r	   )r\   Ún_timess   &&r   Ú_worker_multiplyr:  
  s   € ä ×"Ò"Ð"Ð"Ø�;Ðr   c                óÌ  € \         P                  P                  pV ! ^^
VP                  R7      p \         P                  ! \         P
                  ! R4      P                  R4      RR7      R,          pVP                  \        V^3R7      P                  4       p\        V4      '       d   Q hV! V^V,          4       VP                  4        ?R#   TP                  4        ?i ; i)	zÃCheck that memmaps with a bad buffer are returned as regular arrays

Unary operations and ufuncs on memmap instances return a new memmap
instance with an in-memory buffer (probably a numpy bug).
r    ip  r=   )r>   r3  N)r2  r@   rK   )r;   :Nrƒ   Nr;   )r   r)   r*   rO   rU   rR   rT   r4  r:  r5  r	   r±   )rš   rY   r*   r|   r\   r]   s   &&    r   Ú6test_workaround_against_bad_memmap_with_copied_buffersr<    s²   € ô Ÿ™×6Ñ6Ðá�˜b¨f¯n©nÔ=€Aðô �JŠJ”r—y’y “×.Ñ.¨|Ó<ÀCÔHÈÕRˆð �M‰MÔ*°!°Q°ˆMÓ8×<Ñ<Ó>ˆÜ'¨×*Ò*Ð*Ð*Ù˜1˜a !�eÔ$à	�‰ŒÚøð 	
�‰ŒÙús   ±BC ÃC#c                 ó   € V # r!   r   )Úargs   &r   Úidentityr?  /  s   € Ø€Jr   zfactory,retry_noz{}, {}c                 óô  € VP                  R 4      P                  p^\        P                  ,          p\        P                  ^,           p\	        VRVRVR7      pV ! ^VP                  R7      pVP                  \        V3R7      P                  4       p\        V\        P                  4      '       g   Q hVP                  V8X  g   Q h\        P                  P                  Wh4       VP                  4        R# )r4   r5   rŒ   )r9   r8   r7   r?   ©r¢   r3  N)rN   rO   r“   r”   r
   r4  r?  r5  rW   r   rP   r?   r)   r*   r±   )	rš   Úretry_norY   r•   r–   r?   Úobjr|   r  s	   &&&      r   Ú test_pool_memmap_with_big_offsetrD  3  s»   € ð& �K‰K˜Ó$×,Ñ,€EØŒt×)Ñ)Õ)€DÜ×'Ñ'¨!Õ+€FÜ
�e $¨d¸'È&Ô
Q€Cá�˜vŸ~™~Ô.€AØ�]‰]œ8¨3¨&ˆ]Ó1×5Ñ5Ó7€FÜ�fœbŸi™i×(Ò(Ð(Ð(Ø�=‰=˜FÔ"Ð"Ð"Ü‡J�J×!Ñ! #Ô.Ø‡K�K†Mr   c                 ó4  € R p\        WP                  4      w  r#VRJ g   Q hW P                  R 4      P                  8X  g   Q h\        VRR7      w  r#\        P                  P                  R4      '       d	   VRJ g   Q hVP                  V4      '       g   Q hR# )útest.tmpdirFNrA  r  )r   rO   rN   rt   r
  r  Úendswith)rY   Úpool_folder_nameÚpool_folderÚ
shared_mems   &   r   Útest_pool_get_temp_dirrK  S  sŽ   € Ø$ÐÜ+Ð,<¿n¹nÓMÑ€KØ˜ÓÐÐØŸ+™+ mÓ4×<Ñ<Ô<Ð<Ð<ä+Ð,<È$ÔOÑ€KÜ
‡|�|×Ñ˜u×%Ò%Ø˜UÓ"Ð"Ð"Ø×ÑÐ 0×1Ò1Ð1Ò1r   c                óT  € Rp^ RI p\        VP                  P                  R4      '       d'   VP	                  VP                  P                  R4       \        VRR7      w  rE\        P                  P                  R4      '       d	   VRJ g   Q hVP                  V4      '       g   Q hR# )zXCheck that _get_temp_dir works when os.statvfs is not defined

Regression test for #902
rF  NÚstatvfsrA  r  F)
Újoblib._memmapping_reducerÚhasattrÚ_memmapping_reducerr¬   Údelattrr   rt   r
  r  rG  )rY   ÚmonkeypatchrH  ÚjoblibrI  rJ  s   &&    r   Ú!test_pool_get_temp_dir_no_statvfsrT  _  s�   € ð
 %ÐÛ%äˆv×)Ñ)×,Ñ,¨i×8Ò8à×Ñ˜F×6Ñ6×9Ñ9¸9ÔEä+Ð,<È$ÔOÑ€KÜ
‡|�|×Ñ˜u×%Ò%Ø˜UÓ"Ð"Ð"Ø×ÑÐ 0×1Ò1Ð1Ò1r   z1This test fails with a PermissionError on WindowsÚ	mmap_moder<   r5   c                 ó,  a€ R  o\        ^
4       Uu. uF  p\        P                  ! RRR7      NK  	  pp\        V ^ ^R7      ! V3R l\	        V4       4       4      p\	        V4       F$  w  r\        P
                  P                  WA4       K&  	  R# u upi )c                 ó   € WR &   V # )r;   r   )ÚarrÚvalues   &&r   ÚfuncÚ4test_numpy_arrays_use_different_memory.<locals>.funcw  s   € ØˆA‰Øˆ
r   rQ   r:   )rU  r¡   rÏ   c              3   óJ   <"  € T F  w  r\        S4      ! W!4      x € K  	  R # 5ir!   ©r   )rÕ   r³   rX  rZ  s   &  €r   rÖ   Ú9test_numpy_arrays_use_different_memory.<locals>.<genexpr>}  s$   øé € ð DÙ,=¡& !Œ�Œ�c×ÐÓ,=ùs   ƒ #N)r‚   r‚   )rª   r   Úzerosr   Ú	enumerater)   r*   )rU  r³   Úarraysr  rX  rZ  s   &    @r   Ú&test_numpy_arrays_use_different_memoryrb  q  s€   ø€ òô <AÀ¼9ÓE¹9°aŒb�hŠh�x y×1¹9€FÐEä °qÀÕCô DÜ,5°fÔ,=óDó €Gô ˜GÖ$‰ˆÜ
�
‰
×%Ñ% cÖ-ó %ùò Fs   ’!Bc            	      óR  € R
R lp \         P                  ! ^*4      p\        4       pVP                  VR4       VP	                  V4      R8X  g   Q hTpVP	                  V4      R8X  g   Q hVP                  VR4       VP	                  V4      R8X  g   Q h?\
        P                  ! 4        \        VP                  4      ^8X  g   Q hVP	                  V4      R8X  g   Q h?V ! VP                  4       \         P                  ! ^*4      pVP                  VR4       \        VP                  4      ^8X  g   Q hVP	                  V4      R8X  g   Q h\        \        4      ;_uu_ 4        VP	                  \         P                  ! ^*4      4       RRR4       ?V ! VP                  4       R p\        \        R4       Uu. uF
  qe! W&4      NK  	  up4      p\        P                  ! 4       R8X  d%   \        '       d   R	M^dp\        V4      V8  g   Q hR# R#   + '       g   i     L�; iu upi )r†   c                 ó´   € \        V4       F6  p\        V 4      ^ 8X  d    R# \        P                  ! 4        \	        R4       K8  	  \        V 4      ^ 8X  g   Q hR# )r   Nr  )rª   ró   ÚgcÚcollectr   )Ú	containerÚretriesr³   s   && r   Úassert_empty_after_gc_collectÚ>test_weak_array_key_map.<locals>.assert_empty_after_gc_collect‡  sC   € Ü�w–ˆAÜ�9‹~ Ô"ÚÜ�JŠJŒLÜ�#ŽJñ	  ô
 �9‹~ Ô"Ð"Ò"r   r\   r]   rB   Nc                 ó  € \         P                  ! ^*4      p\        \        4      ;_uu_ 4        V P	                  V4       RRR4       V P                  W!4       V P	                  V4      V8X  g   Q h\        V4      #   + '       g   i     LD; i)é*   N)r   r«   r   ÚKeyErrorr5  rï   r+  )Úmr³   r\   s   && r   Úget_set_get_collectÚ4test_weak_array_key_map.<locals>.get_set_get_collect®  s[   € Ü�GŠG�B‹KˆÜ”H×ÕØ�E‰E�!ŒH÷ à	�‰ˆaŒØ�u‰u�Q‹x˜1Œ}Ðˆ}Ü�!‹uˆ÷	 ×ús   ®A<Á<B	r2  ÚCPythoni�  )r†   )r   r«   r   rï   r5  re  rf  ró   Ú_datar   rm  rª   r
  Úpython_implementationr   )	ri  r\   rn  r]   rB   ro  r³   Ú
unique_idsÚmax_len_unique_idss	            r   Útest_weak_array_key_maprv  …  s¦  € ô#ô 	�Š�‹€AÜÓ€AØ‡E�Eˆ!ˆS„MØ�5‰5�‹8�sŒ?Ðˆ?à	€AØ�5‰5�‹8�sŒ?Ðˆ?Ø‡E�Eˆ!ˆS„MØ�5‰5�‹8�sŒ?Ðˆ?à	Ü‡J‚J„LÜˆq�w‰w‹<˜1ÔÐÐØ�5‰5�‹8�sŒ?Ðˆ?à	Ù! !§'¡'Ô*ä
�Š�‹€AØ‡E�Eˆ!ˆS„MÜˆq�w‰w‹<˜1ÔÐÐØ�5‰5�‹8�sŒ?Ðˆ?ä	”×	Õ	Ø	�‰Œb�gŠg�b‹kÔ÷ 
ð 	
Ù! !§'¡'Ô*òô ¼¸t¼ÓE¹°AÐ)¨!Ö/¹ÑEÓF€JÜ×%Ò%Ó'¨9Ô4÷ %4£O™S¸ÐÜ�:‹Ð!3Ô3Ð3Ò3ñ 5÷# 
×	üò  Fs   Å$&HÆ:H$ÈH!	c                  óÂ   € \        4       p \        \        P                  4      ;_uu_ 4        \        P                  ! V 4       R R R 4       R #   + '       g   i     R # ; ir!   )r   r   ÚpickleÚPicklingErrorÚdumps)rn  s    r   Ú#test_weak_array_key_map_no_picklingr{  Á  s5   € ÜÓ€AÜ	”×$Ñ$×	%Õ	%Ü�Š�QŒ÷ 
&×	%×	%Ò	%ús   ¬AÁA	c                 óü  aaa€ \        V P                  R 4      4      o\        P                  ! ^
RR7      pVP	                  S4       V3R loR oS! 4       p\        ^R7      ! V3R lV3 4       4      p\        ^R7      ! V3R lV3 4       4      p\        P                  P                  WC4       \        ^R7      ! V3R l\        ^4       4       4      p\        P                  P                  V^ ,          V4       R	# )
zarr.datrŒ   r:   c            	      ó  <€ \        S4      ;_uu_ 4       p \        P                  ! V P                  4       ^ \        P                  ^ R7      pRRR4       \        P
                  ! R\        P                  X^ R7      #   + '       g   i     L8; i)r   )Úaccessr?   N)r7   r[   r?   r¥   )Úopenr“   ÚfilenoÚACCESS_READr   rX   rŒ   )ÚfdÚmmÚtestfiles     €r   Ú_read_arrayÚ%test_direct_mmap.<locals>._read_arrayÎ  sT   ø€ Ü�(�^Œ^˜rÜ—’˜2Ÿ9™9›;¨´$×2BÑ2BÈ1ÔMˆB÷ ä�zŠz˜%¤r§x¡x¸À1ÔEÐE÷ �^ús   •7A<Á<B	c                 ó   € V ^,          # r’   r   ©rE   s   &r   rZ  Útest_direct_mmap.<locals>.funcÓ  ó   € Ø�!�tˆr   ©rÏ   c              3   óF   <"  € T F  p\        S4      ! V4      x € K  	  R # 5ir!   r]  ©rÕ   rE   rZ  s   & €r   rÖ   Ú#test_direct_mmap.<locals>.<genexpr>Ù  ó   øé € Ð;±s°!œW Tœ]¨1×-Ð-³sùó   ƒ!c              3   óF   <"  € T F  p\        S4      ! V4      x € K  	  R # 5ir!   r]  r�  s   & €r   rÖ   rŽ  Ü  ó   øé € Ð A¹5°a¤¨¤¨q×!1Ð!1»5ùr�  c              3   óD   <"  € T F  p\        S4      ! 4       x € K  	  R # 5ir!   r]  ©rÕ   rÊ   r…  s   & €r   rÖ   rŽ  à  ó   øé € Ð JÁ¸A¤¨Ô!5×!7Ð!7Ãùó   ƒ N)	ÚstrrN   r   rR   Útofiler   r)   r*   rª   ©rY   r\   rX  Úrefr  r…  rZ  r„  s   &    @@@r   Útest_direct_mmapr›  Ç  s¿   ú€ ô �6—;‘;˜yÓ)Ó*€HÜ
�	Š	�"˜GÔ$€AØ‡H�HˆXÔõFò
ñ ‹-€Cô ˜!Õ
Ô;¸±sÓ;Ó
;€Cô ˜aÕ Ô A¸C¹5Ó AÓA€GÜ‡J�J×!Ñ! 'Ô/ô ˜aÕ Ô JÄÀqÄÓ JÓJ€GÜ‡J�J×!Ñ! '¨!¥*¨cÖ2r   c                 ó`  aaa€ \        V P                  R 4      4      o\        P                  ! ^
RR7      P	                  ^^4      pVP                  S4       V3R loR oS! 4       p\        ^R7      ! V3R lV3 4       4      p\        ^R7      ! V3R lV3 4       4      pV^ ,          P                  R,          '       d   Q h\        P                  P                  WC4       \        ^R7      ! V3R	 l\        ^4       4       4      p\        P                  P                  V^ ,          V4       R
# )zarr2.datrŒ   r:   c                  óT   <€ \         P                  ! S4      p V P                  ^^4      # )rL   )r   rP   rT   )rƒ  r„  s    €r   r…  Ú=test_parallel_memmap2d_as_memmap_1d_base.<locals>._read_arrayí  s"   ø€ Ü�YŠY�xÓ ˆØ�z‰z˜!˜QÓÐr   c                 ó   € V ^,          # r’   r   rˆ  s   &r   rZ  Ú6test_parallel_memmap2d_as_memmap_1d_base.<locals>.funcñ  rŠ  r   r‹  c              3   óF   <"  € T F  p\        S4      ! V4      x € K  	  R # 5ir!   r]  r�  s   & €r   rÖ   Ú;test_parallel_memmap2d_as_memmap_1d_base.<locals>.<genexpr>÷  r�  r�  c              3   óF   <"  € T F  p\        S4      ! V4      x € K  	  R # 5ir!   r]  r�  s   & €r   rÖ   r¢  ú  r’  r�  ÚF_CONTIGUOUSc              3   óD   <"  € T F  p\        S4      ! 4       x € K  	  R # 5ir!   r]  r”  s   & €r   rÖ   r¢  ÿ  r•  r–  N)r—  rN   r   rR   rT   r˜  r   Úflagsr)   r*   rª   r™  s   &    @@@r   Ú(test_parallel_memmap2d_as_memmap_1d_baser§  ä  sæ   ú€ ô
 �6—;‘;˜zÓ*Ó+€HÜ
�	Š	�"˜GÔ$×,Ñ,¨Q°Ó2€AØ‡H�HˆXÔõ òñ ‹-€Cô ˜!Õ
Ô;¸±sÓ;Ó
;€Cô ˜aÕ Ô A¸C¹5Ó AÓA€GØ�q�z×Ñ ×/Ô/Ð/Ð/Ü‡J�J×!Ñ! 'Ô/ô ˜aÕ Ô JÄÀqÄÓ JÓJ€GÜ‡J�J×!Ñ! '¨!¥*¨aÖ0r   )Yr   re  Ú	itertoolsr“   r¬   rx  r
  rr   rt   rð   Útimer   r  rN  rP  r)  r   r   r   r   r   r	   Újoblib.backportsr
   Újoblib.executorr   ÚTestExecutorÚjoblib.parallelr   r   Újoblib.poolr   Újoblib.test.commonr   r   r   r   r   Újoblib.testingr   r   r   r   r#   r&   r0   r2   ri   r€   rŠ   r™   Úget_memmapping_executorrµ   r¸   r¿   rË   rß   rå   rø   rÿ   r  r  r  r  ÚparamÚmarkr  r$  r&  r.  r0  r7  r:  r<  r?  ÚlistÚproductrª   r©   r—  rq   rD  rK  rT  rb  rv  r{  r›  r§  )rE   Úys   00r   Ú<module>r·     sm  ðÛ Û 	Û Û Û 	Û Û Û Û 
Û Ý ã å (÷÷ õ )Ý Fß -Ý &÷õ ÷ 7Ñ 6ò>ò/òò
<ò@ð ØñS-ó ó ðS-ðl ØÙØ‡L�L�GÑÐ$Xôñ*óó ó ð
*ðZ Øñ)+ó ó ð)+ðX ñCó ðCðD ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
0óó ó ð0ðf ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
$óó ó ð$ðN ØÙˆYÐ*¨FÐ3Ó4ñCó 5ó ó ðCðB ØÙˆYÐ*¨FÐ3Ó4ñ*.ó 5ó ó ð*.ðZ ØÙˆYÐ*¨FÐ3Ó4ñ
Fó 5ó ó ð
Fð ØÙˆYÐ*¨FÐ3Ó4ñFó 5ó ó ðFð Øñ!4ó ó ð!4ðH ØñF<ó ó ðF<ðR ØÙˆYÐ*¨FÐ3Ó4ñ%*ó 5ó ó ð%*ðP ØÙˆYÐ*¨FÐ3Ó4ñ/ó 5ó ó ð/ð ØÙˆYÐ*¨FÐ3Ó4ñ2.ó 5ó ó ð2.ðj ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
1óó ó ð1ðh ØÙØà�ŠØØ—+‘+×#Ñ#ØEð $ó ô	
ð 	ðóñK(óó ó ðK(ð\ ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
óó ó ðð, ØØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
.6óó ó ó ð.6ðb ØØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
6óó ó ó ð6ð0 ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
óó ó ðò,ð ØÙØØ�\×9Ñ9Ð:Ø	˜FÐ#ôñ
óó ó ðò0ð ØÙØÙØ×ÒØ˜\×AÑAÐBÁEÈ!ÃHó	
óð ×%Ò%Ð'8¸&Ð&AÁ3ÀsÉEÐRSËHÓCUÔVô	áV‰DˆAð 	�‰˜ÖÙVò	ôñóó ó ðò$	2ò2ð$ ÙØ‡L�L�GÑÐ$Wôñ ˆ[˜4 ˜,Ó'ñ.ó (óó ð
.ð ñ84ó ð84òvð Øñ3ó ó ð3ð6 Øñ1ó ó ò1ùóU	s   ÎP-