
][\,                 @   s,  d  d d g 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 m	 Z	 m
 Z
 d d l Z d d l m Z d d l m Z d d	 l m Z m Z m Z m Z m Z d d
 l m Z Gd d    d  e  Z e   Z Gd d   d e  Z Gd d   d e  Z d S)QueueSimpleQueueJoinableQueue    N)EmptyFull   )
connection)context)debuginfoFinalizeregister_after_fork
is_exiting)ForkingPicklerc               @   s	  e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 d d d  Z d
 d 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   Z d  d!   Z e d" d#    Z e d$ d%    Z e d& d'    Z d S)(r   r   c            C   s   | d k r t  j j } n  | |  _ t j d d  \ |  _ |  _ | j   |  _	 t
 j   |  _ t j d k r{ d  |  _ n | j   |  _ | j |  |  _ d |  _ |  j   t j d k r t |  t j  n  d  S)Nr   duplexFwin32)_multiprocessingZSemLockZSEM_VALUE_MAX_maxsizer   Pipe_reader_writerLock_rlockosgetpid_opidsysplatform_wlockZBoundedSemaphore_sem_ignore_epipe_after_forkr   r   )selfmaxsizectx r%   ,/usr/lib/python3.4/multiprocessing/queues.py__init__$   s    		
zQueue.__init__c             C   sA   t  j |   |  j |  j |  j |  j |  j |  j |  j |  j	 f S)N)
r	   assert_spawningr    r   r   r   r   r   r   r   )r"   r%   r%   r&   __getstate__8   s    zQueue.__getstate__c          	   C   sD   | \ |  _  |  _ |  _ |  _ |  _ |  _ |  _ |  _ |  j   d  S)N)	r    r   r   r   r   r   r   r   r!   )r"   stater%   r%   r&   __setstate__=   s    6zQueue.__setstate__c             C   s   t  d  t j t j    |  _ t j   |  _ d  |  _ d  |  _	 d |  _
 d |  _ d  |  _ |  j j |  _ |  j j |  _ |  j j |  _ d  S)NzQueue._after_fork()F)r
   	threading	Conditionr   	_notemptycollectionsdeque_buffer_thread_jointhread_joincancelled_closed_closer   
send_bytes_send_bytesr   
recv_bytes_recv_bytespoll_poll)r"   r%   r%   r&   r!   B   s    
					zQueue._after_forkTNc          
   C   s   |  j  s t  |  j j | |  s. t  n  |  j j   z= |  j d  k rZ |  j   n  |  j j	 |  |  j j
   Wd  |  j j   Xd  S)N)r5   AssertionErrorr   acquirer   r.   r2   _start_threadr1   appendnotifyrelease)r"   objblocktimeoutr%   r%   r&   putO   s    	z	Queue.putc          
   C   s  | r> | d  k r> |  j   |  j   } Wd  QX|  j j   n | rW t j   | } n  |  j  j | |  su t  n  zp | r | t j   } | d k  s |  j |  r t  q n |  j   s t  n  |  j   } |  j j   Wd  |  j  j   Xt j	 |  S)Nr   )
r   r:   r   rB   timer>   r   r<   r   loads)r"   rD   rE   resZdeadliner%   r%   r&   get]   s&    
		z	Queue.getc             C   s   |  j  |  j j j   S)N)r   r   _semlockZ
_get_value)r"   r%   r%   r&   qsizeu   s    zQueue.qsizec             C   s   |  j    S)N)r<   )r"   r%   r%   r&   emptyy   s    zQueue.emptyc             C   s   |  j  j j   S)N)r   rK   _is_zero)r"   r%   r%   r&   full|   s    z
Queue.fullc             C   s   |  j  d  S)NF)rJ   )r"   r%   r%   r&   
get_nowait   s    zQueue.get_nowaitc             C   s   |  j  | d  S)NF)rF   )r"   rC   r%   r%   r&   
put_nowait   s    zQueue.put_nowaitc             C   s0   d |  _  |  j j   |  j r, |  j   n  d  S)NT)r5   r   closer6   )r"   r%   r%   r&   rR      s    		zQueue.closec             C   s3   t  d  |  j s t  |  j r/ |  j   n  d  S)NzQueue.join_thread())r
   r5   r=   r3   )r"   r%   r%   r&   join_thread   s    
	zQueue.join_threadc             C   s=   t  d  d |  _ y |  j j   Wn t k
 r8 Yn Xd  S)NzQueue.cancel_join_thread()T)r
   r4   r3   ZcancelAttributeError)r"   r%   r%   r&   cancel_join_thread   s    
	zQueue.cancel_join_threadc          
   C   s  t  d  |  j j   t j d t j d |  j |  j |  j |  j	 |  j
 j |  j f d d  |  _ d |  j _ t  d  |  j j   t  d  |  j t j   k } |  j r | r t |  j t j t j |  j  g d	 d |  _ n  t |  t j |  j |  j g d	 d |  _ d  S)NzQueue._start_thread()targetargsnameZQueueFeederThreadTzdoing self._thread.start()z... done self._thread.start()Zexitpriority   
   )r
   r1   clearr,   ZThreadr   _feedr.   r8   r   r   rR   r    r2   Zdaemonstartr   r   r   r4   r   _finalize_joinweakrefrefr3   _finalize_closer6   )r"   Zcreated_by_this_processr%   r%   r&   r?      s*    
		

	zQueue._start_threadc             C   sD   t  d  |    } | d  k	 r6 | j   t  d  n
 t  d  d  S)Nzjoining queue threadz... queue thread joinedz... queue thread already dead)r
   join)ZtwrZthreadr%   r%   r&   r_      s    
	
zQueue._finalize_joinc          
   C   sA   t  d  | j   z |  j t  | j   Wd  | j   Xd  S)Nztelling queue thread to quit)r
   r>   r@   	_sentinelrA   rB   )buffernotemptyr%   r%   r&   rb      s    

zQueue._finalize_closec             C   s  t  d  | j } | j } | j } |  j }	 t }
 t j d k rX | j } | j } n d  } y x |   z |  s~ |   n  Wd  |   Xy| xu |	   } | |
 k r t  d  |   d  St j	 |  } | d  k r | |  q |   z | |  Wd  |   Xq Wqd t
 k
 rYqd Xqd Wn t k
 r} zr | rYt | d d  t j k rYd  Sy3 t   rut d |  n d d  l } | j   Wn t k
 rYn XWYd  d  } ~ Xn Xd  S)Nz$starting thread to feed data to piper   z%feeder thread got sentinel -- exitingerrnor   zerror in queue thread: %s)r
   r>   rB   waitpopleftrd   r   r   r   dumps
IndexError	Exceptiongetattrrg   ZEPIPEr   r   	traceback	print_exc)re   rf   r7   Z	writelockrR   Zignore_epipeZnacquireZnreleaseZnwaitZbpopleftsentinelZwacquireZwreleaserC   ern   r%   r%   r&   r]      sV    
						
!	zQueue._feed)__name__
__module____qualname__r'   r)   r+   r!   rF   rJ   rL   rM   rO   rP   rQ   rR   rS   rU   r?   staticmethodr_   rb   r]   r%   r%   r%   r&   r   "   s$   &

c               @   sa   e  Z d  Z d d d  Z d d   Z d d   Z d d	 d
 d  Z d d   Z d d   Z d	 S)r   r   c            C   s;   t  j |  | d | | j d  |  _ | j   |  _ d  S)Nr$   r   )r   r'   Z	Semaphore_unfinished_tasksr-   _cond)r"   r#   r$   r%   r%   r&   r'     s    zJoinableQueue.__init__c             C   s   t  j |   |  j |  j f S)N)r   r)   rw   rv   )r"   r%   r%   r&   r)     s    zJoinableQueue.__getstate__c             C   s:   t  j |  | d  d   | d d   \ |  _ |  _ d  S)N   ry   )r   r+   rw   rv   )r"   r*   r%   r%   r&   r+   !  s    zJoinableQueue.__setstate__TNc          
   C   s   |  j  s t  |  j j | |  s. t  n  |  j j   |  j j   zJ |  j d  k rg |  j   n  |  j	 j
 |  |  j j   |  j j   Wd  |  j j   |  j j   Xd  S)N)r5   r=   r   r>   r   r.   rw   r2   r?   r1   r@   rv   rB   rA   )r"   rC   rD   rE   r%   r%   r&   rF   %  s    	zJoinableQueue.putc          
   C   si   |  j  j   zG |  j j d  s1 t d   n  |  j j j   rS |  j  j   n  Wd  |  j  j   Xd  S)NFz!task_done() called too many times)rw   r>   rv   
ValueErrorrK   rN   Z
notify_allrB   )r"   r%   r%   r&   	task_done6  s    zJoinableQueue.task_donec          
   C   sH   |  j  j   z& |  j j j   s2 |  j  j   n  Wd  |  j  j   Xd  S)N)rw   r>   rv   rK   rN   rh   rB   )r"   r%   r%   r&   rc   @  s
    zJoinableQueue.join)	rr   rs   rt   r'   r)   r+   rF   r{   rc   r%   r%   r%   r&   r     s   
c               @   sX   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d S)r   c            C   sj   t  j d d  \ |  _ |  _ | j   |  _ |  j j |  _ t j	 d k rW d  |  _
 n | j   |  _
 d  S)Nr   Fr   )r   r   r   r   r   r   r;   r<   r   r   r   )r"   r$   r%   r%   r&   r'   N  s    zSimpleQueue.__init__c             C   s   |  j    S)N)r<   )r"   r%   r%   r&   rM   W  s    zSimpleQueue.emptyc             C   s)   t  j |   |  j |  j |  j |  j f S)N)r	   r(   r   r   r   r   )r"   r%   r%   r&   r)   Z  s    zSimpleQueue.__getstate__c             C   s"   | \ |  _  |  _ |  _ |  _ d  S)N)r   r   r   r   )r"   r*   r%   r%   r&   r+   ^  s    zSimpleQueue.__setstate__c             C   s,   |  j   |  j j   } Wd  QXt j |  S)N)r   r   r9   r   rH   )r"   rI   r%   r%   r&   rJ   a  s    
zSimpleQueue.getc          	   C   sU   t  j |  } |  j d  k r1 |  j j |  n  |  j  |  j j |  Wd  QXd  S)N)r   rj   r   r   r7   )r"   rC   r%   r%   r&   rF   g  s
    
zSimpleQueue.putN)	rr   rs   rt   r'   rM   r)   r+   rJ   rF   r%   r%   r%   r&   r   L  s   	)__all__r   r   r,   r/   rG   r`   rg   Zqueuer   r   r    r   r	   utilr
   r   r   r   r   Z	reductionr   objectr   rd   r   r   r%   r%   r%   r&   <module>
   s"   (	
5