ó
\K]c           @  s¨  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 Z d  d l Z	 d  d l
 j Z d  d l m Z m Z d  d l m Z m Z d d l m Z m Z e j j Z e j e _ g  e _ e j d k re j j j Z e j  g e _ d e _ d Z" n? e j# e j$ j% d ƒ ƒ j& Z e j  g e _ e j' e _ d	 Z" d
 „  Z( d Z) d „  Z* d „  Z+ d e f d „  ƒ  YZ, e- d k r¤e j. ƒ  n  d S(   iÿÿÿÿ(   t   print_functionN(   t   compile_isolatedt   Flags(   t   errorst   jiti   (   t   TestCaset   tagt   ntt   ciè  c         C  s0   x) | D]! } t  d t ƒ t ƒ  |  | <q Wd  S(   Ni
   (   t   sleept   sleep_factort   PyThread_get_thread_ident(   t   at   indicest   idx(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   f$   s    s   void(int64[:], intp[:])c         C  s7   t  ƒ  x) | D]! } t d t ƒ t ƒ  |  | <q Wd S(   s/   
    Same as f(), but inside a lifted loop
    i
   N(   t   objectR	   R
   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   lifted_f0   s    c         C  s7   x0 | D]( } t  d t ƒ t ƒ  t ƒ  |  | <q Wd S(   s)   
    Same as f(), but in object mode
    i
   N(   R	   R
   R   R   (   R   R   R   (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   object_f:   s    t   TestGILReleasec           B  sw   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z e d ƒ d „  ƒ Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z RS(   c         C  s   t  j | d t  j ƒS(   Nt   dtype(   t   npt   aranget   int64(   t   selft	   n_members(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   make_test_arrayG   s    c         C  sä   g  } | |  j  d ƒ t j d d t j ƒƒ |  j  d ƒ } xj t | ƒ D]\ } t j | j d t j ƒ} t j j | ƒ t j	 d | d | | f ƒ } | j
 | ƒ qJ Wx | D] } | j ƒ  q± Wx | D] } | j ƒ  qÌ W| S(   Ni   R   i2   t   targett   args(   R   R   R   t   intpt   ranget   sizet   randomt   shufflet	   threadingt   Threadt   appendt   startt   join(   R   t   funct	   n_threadst   threadst   arrt   iR   t   t(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   run_in_threadsJ   s    (c         C  s>   |  j  | d d ƒ} t | ƒ } |  j t | ƒ d | ƒ d  S(   NR(   i   i   (   R-   t   sett   assertEqualt   len(   R   R'   R*   t   distinct(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   check_gil_held^   s    c         C  sv   xi d D]a } |  j  | | ƒ } t | ƒ } y |  j t | ƒ d | ƒ Wn t k
 rc } | } q Xd  Sq W| ‚ d  S(   Ni   i   i    i   (   i   i   i    (   R-   R.   t   assertGreaterR0   t   AssertionError(   R   R'   R(   R*   R1   t   et   failure(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   check_gil_releasedc   s    
c         C  s)   t  t d t ƒt ƒ } |  j | ƒ d S(   su   
        Test the GIL is held by default, by checking serialized runs
        produce deterministic results.
        t   nopythonN(   R   t   f_sigt   TrueR   R2   (   R   t   cfunc(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   test_gil_heldq   s    t	   importantc         C  s/   t  t d t d t ƒt ƒ } |  j | ƒ d S(   sj   
        Test releasing the GIL, by checking parallel runs produce
        unpredictable results.
        R8   t   nogilN(   R   R9   R:   R   R7   (   R   R;   (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   test_gil_releasedy   s    c         C  s)   t  t d t ƒt ƒ } |  j | ƒ d S(   sz   
        Test the GIL can by released by a lifted loop even though the
        surrounding code uses object mode.
        R>   N(   R   R9   R:   R   R7   (   R   R;   (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt$   test_gil_released_inside_lifted_loop‚   s    c           sP   t  t d t ƒt ƒ ‰  t  t d t d t ƒ‡  f d †  ƒ } |  j | ƒ d S(   sh   
        Releasing the GIL in the caller is sufficient to have it
        released in a callee.
        R8   R>   c           s   ˆ  |  | ƒ d  S(   N(    (   R   R+   (   t
   compiled_f(    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   caller   s    N(   R   R9   R:   R   R7   (   R   RB   (    (   RA   s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   test_gil_released_by_callerŠ   s    'c           sV   t  t d t d t ƒt ƒ ‰  t  t d t d t ƒ‡  f d †  ƒ } |  j | ƒ d S(   sR   
        Same, but with both caller and callee asking to release the GIL.
        R8   R>   c           s   ˆ  |  | ƒ d  S(   N(    (   R   R+   (   RA   (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyRB   š   s    N(   R   R9   R:   R   R7   (   R   RB   (    (   RA   s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt&   test_gil_released_by_caller_and_callee•   s    'c           sP   t  t d t d t ƒt ƒ ‰  t  t d t ƒ‡  f d †  ƒ } |  j | ƒ d S(   sP   
        When only the callee asks to release the GIL, it gets ignored.
        R8   R>   c           s   ˆ  |  | ƒ d  S(   N(    (   R   R+   (   RA   (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyRB   ¤   s    N(   R   R9   R:   R   R2   (   R   RB   (    (   RA   s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   test_gil_ignored_by_calleeŸ   s    !c         C  sz   t  j d t ƒ 2 } t  j d t j ƒ t t d t ƒt ƒ } Wd QX|  j	 t
 d „  | Dƒ ƒ | ƒ |  j | d ƒ d S(   sa   
        When the function is compiled in object mode, a warning is
        printed out.
        t   recordt   alwaysR>   Nc         s  s6   |  ], } | j  t j k o- d  t | j ƒ k Vq d S(   s:   Code running in object mode won't allow parallel executionN(   t   categoryR   t   NumbaWarningt   strt   message(   t   .0t   w(    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pys	   <genexpr>±   s   i   (   t   warningst   catch_warningsR:   t   simplefilterR   RI   R   R9   R   t
   assertTruet   anyR-   (   R   t   wlistR;   (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   test_object_mode©   s    (   t   __name__t
   __module__R   R-   R2   R7   R<   R   R?   R@   RC   RD   RE   RT   (    (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyR   E   s   									
	
t   __main__(/   t
   __future__R    t   ctypest   ctypes.utilt   ost   sysR"   RN   t   numpyR   t   numba.unittest_supportt   unittest_supportt   unittestt   numba.compilerR   R   t   numbaR   R   t   supportR   R   t	   pythonapiR   t   c_longt   restypet   argtypest   namet   windllt   kernel32t   SleepR	   t   c_uintt   NoneR
   t   CDLLt   utilt   find_libraryt   usleept   c_intR   R9   R   R   R   RU   t   main(    (    (    s3   lib/python2.7/site-packages/numba/tests/test_gil.pyt   <module>   s<   				
	
	s