???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
ft`                 @   s   d dl mZ d dl mZ d dlmZmZmZ d dlm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Zd dlZd dlZd dlZejdZdd	 Zd
d Zdd Zdd Zdd ZG dd deZdS )    )absolute_import)unicode_literals)ProcessLockErrorThreadLockError	LockError)_)miscNdnfc             C   s6   t jj s2tj| jdj }tjj	t
j d|} | S )Nzutf-8Zlocks)r	   utilZ	am_i_roothashlibZsha1encodeZ	hexdigestospathjoinr   ZgetCacheDir)Zdir_Zhexdir r   /usr/lib/python3.6/lock.py_fit_lock_dir&   s    
r   c             C   s   t tjjt| dd| S )Nzdownload_lock.pidcachedir)ProcessLockr   r   r   r   )r   exit_on_lockr   r   r   build_download_lock/   s    r   c             C   s   t tjjt| dd| S )Nzmetadata_lock.pidZmetadata)r   r   r   r   r   )r   r   r   r   r   build_metadata_lock3   s    r   c             C   s   t tjjt| dd| S )Nzrpmdb_lock.pidZRPMDB)r   r   r   r   r   )Z
persistdirr   r   r   r   build_rpmdb_lock8   s    r   c             C   s   t tjjt| dd| S )Nzlog_lock.pidlog)r   r   r   r   r   )Zlogdirr   r   r   r   build_log_lock=   s    r   c               @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )r   Fc             C   s&   || _ d| _|| _|| _tj | _d S )Nr   )blockingcountdescriptiontarget	threadingRLockthread_lock)selfr   r   r   r   r   r   __init__C   s
    zProcessLock.__init__c             C   s2   | j jdds d| j }t||  jd7  _d S )NF)r   z'%s already locked by a different thread   )r!   acquirer   r   r   )r"   msgr   r   r   _lock_threadJ   s    
zProcessLock._lock_threadc              C   s>  t j| jt jt jB d}zytj|tjtjB  W n4 t	k
rh } z|j
t
jkrVdS  W Y d d }~X nX t j|d}t|dkrt j|t|jd |S yt|}W n* tk
r   td| j }t|Y nX ||kr|S t jd| t js*t j|dt j t j|d t j|t|jd |S |S t j| X d S )	Ni  r$      r   zutf-8zMalformed lock file found: %s.
Ensure no other dnf/yum process is running and remove the lock file manually or run systemd-tmpfiles --remove dnf.conf.z/proc/%d/stat)r   openr   O_CREATO_RDWRfcntlZflockZLOCK_EXZLOCK_NBOSErrorerrnoZEWOULDBLOCKreadlenwritestrr   int
ValueErrorr   r   accessF_OKlseekSEEK_SET	ftruncateclose)r"   pidfdeZold_pidr&   r   r   r   	_try_lockP   s6    zProcessLock._try_lockc             C   s   |  j d8  _ | jj  d S )Nr$   )r   r!   release)r"   r   r   r   _unlock_threadz   s    zProcessLock._unlock_threadc             C   s   t jjtjj| j | j  d}tj }| j	|}xp||kr|dkr| j
sl| j  d| j|f }t||||krtd| }tj| |}tjd | j	|}q6W d S )Nr$   z%s already locked by %dz*Waiting for process with pid %d to finish.r)   r)   )r	   r
   Z
ensure_dirr   r   dirnamer   r'   getpidr?   r   rA   r   r   r   loggerinfotimeZsleep)r"   Zprev_pidZmy_pidr<   r&   r   r   r   	__enter__~   s"    




zProcessLock.__enter__c             G   s"   | j dkrtj| j | j  d S )Nr$   )r   r   unlinkr   rA   )r"   Zexc_argsr   r   r   __exit__   s    
zProcessLock.__exit__N)F)	__name__
__module____qualname__r#   r'   r?   rA   rG   rI   r   r   r   r   r   B   s   
*r   )Z
__future__r   r   Zdnf.exceptionsr   r   r   Zdnf.i18nr   Zdnf.yumr   Zdnf.loggingr	   Zdnf.utilr/   r-   r   Zloggingr   r   rF   Z	getLoggerrD   r   r   r   r   r   objectr   r   r   r   r   <module>   s(   
	