U
    d?	                     @   s,   d dl Z d dlZd dlZG dd deZdS )    Nc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )Pidfilez    Manage a PID file. If a specific name is provided
    it and '"%s.oldpid" % name' will be used. Otherwise
    we create a temp file using os.mkstemp.
    c                 C   s   || _ d | _d S N)fnamepid)selfr    r   4/tmp/pip-unpacked-wheel-1tw_qy24/gunicorn/pidfile.py__init__   s    zPidfile.__init__c                 C   s   |   }|r2|t krd S d}t||| jf || _tj| j}|rbtj|sbtd| t	j
|d\}}t|d| j d | jrt|| j n|| _t| t| jd d S )Nz5Already running on PID %s (or pid file '%s' is stale)z'%s doesn't exist. Can't create pidfile.)dirz%s
zutf-8i  )validateosgetpidRuntimeErrorr   r   pathdirnameisdirtempfilemkstempwriteencoderenameclosechmod)r   r   ZoldpidmsgZfdirfdr   r   r   r   create   s"    
zPidfile.createc                 C   s   |    || _| | j d S r   )unlinkr   r   r   )r   r   r   r   r   r   /   s    zPidfile.renamec              	   C   s\   zBt | jd}t| pd}W 5 Q R X || jkr@t| j W n tk
rV   Y nX dS )z delete pidfilerr   N)openr   intreadr   r   r   	Exception)r   fZpid1r   r   r   r   4   s    
zPidfile.unlinkc                 C   s8  | j s
dS zt| j d}zt| }W n" tk
rL   Y W 5 Q R  W dS X z t|d |W W  5 Q R  W S  tk
r } zV|jd t	j
kr| W Y <W  5 Q R  W S |jd t	jkrW Y W 5 Q R  W dS  W 5 d}~X Y nX W 5 Q R X W nB tk
r2 } z"|jd t	jkr W Y 
dS  W 5 d}~X Y nX dS )z- Validate pidfile and make it stale if neededNr   r   )r   r   r   r    
ValueErrorr   killOSErrorargserrnoEPERMZESRCHIOErrorENOENT)r   r"   wpider   r   r   r   ?   s*    "
zPidfile.validateN)	__name__
__module____qualname____doc__r	   r   r   r   r   r   r   r   r   r      s   r   )r'   r   r   objectr   r   r   r   r   <module>   s   