B
    áÉ’\  ã               @   s8   d dl mZ d dlZd dlZd dlZG dd„ deƒZdS )é    )ÚMappingNc               @   sZ   e Zd Zddd„Zdd„ Zddd„Zdd
d„Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚConcurrentShelfé<   c             C   s*   || _ || _d | _| jdd}| ¡  d S )NT)Úwrite)Ú
_file_nameÚ_time_out_secondsÚ_locked_shelfÚ_openÚclose)ÚselfÚ	file_nameZtime_out_secondsÚshelf© r   úV/global/project/projectdirs/dasrepo/etalumis/pyprob_master_mar20/pyprob/concurrency.pyÚ__init__   s
    zConcurrentShelf.__init__c             C   s   | j d k	r| j  ¡  d S )N)r   r
   )r   r   r   r   Ú__del__   s    
zConcurrentShelf.__del__Fc          
   C   s˜   |rdnd}t   ¡ }x~t   ¡ | | jkr0tdƒ‚ytj| j|d}|S  tk
rŽ } z,dt|ƒkrzt  t	 
dd¡¡ t n|‚W d d }~X Y qX qW d S )NÚcÚrz=ConcurrentShelf time out, cannot gain access to shelf on disk)Úflagz+[Errno 11] Resource temporarily unavailableg{®Gáz„?g      Ð?)Útimer   ÚRuntimeErrorÚshelveÚopenr   Ú	ExceptionÚstrÚsleepÚrandomÚuniformÚnext)r   r   r   Ústartr   Úer   r   r   r	      s    zConcurrentShelf._openTc             C   s   | j |d| _d S )N)r   )r	   r   )r   r   r   r   r   Úlock$   s    zConcurrentShelf.lockc             C   s   | j d k	r| j  ¡  d | _ d S )N)r   r
   )r   r   r   r   Úunlock'   s    

zConcurrentShelf.unlockc          
   C   sh   | j d k	r| j | S |  ¡ }y|| }| ¡  W n. tk
r^ } z| ¡  |‚W d d }~X Y nX |S d S )N)r   r	   r
   r   )r   Úkeyr   Úvaluer    r   r   r   Ú__getitem__,   s    

zConcurrentShelf.__getitem__c          
   C   sj   | j d k	r|| j |< nP| jdd}y|||< | ¡  W n. tk
rd } z| ¡  |‚W d d }~X Y nX d S )NT)r   )r   r	   r
   r   )r   r#   r$   r   r    r   r   r   Ú__setitem__9   s    
zConcurrentShelf.__setitem__c          
   c   s~   | j d k	r"xn| j D ]
}|V  qW nX|  ¡ }y x|D ]
}|V  q2W | ¡  W n. tk
rx } z| ¡  |‚W d d }~X Y nX d S )N)r   r	   r
   r   )r   r$   r   r    r   r   r   Ú__iter__E   s    


zConcurrentShelf.__iter__c          
   C   sh   | j d k	rt| j ƒS |  ¡ }yt|ƒ}| ¡  W n. tk
r^ } z| ¡  |‚W d d }~X Y nX |S d S )N)r   Úlenr	   r
   r   )r   r   r$   r    r   r   r   Ú__len__S   s    

zConcurrentShelf.__len__N)r   )F)T)Ú__name__Ú
__module__Ú__qualname__r   r   r	   r!   r"   r%   r&   r'   r)   r   r   r   r   r      s   


r   )Úcollections.abcr   r   r   r   r   r   r   r   r   Ú<module>   s   