Ë
    ùÇ:jY(  ã                  óÀ   — d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZ d dlmZ ddlmZ ddlmZmZmZ d	Zd
ZdZdZdZ G d„ de«      Zdd„Zdd„ZdgZy)é    )ÚannotationsN)Úsuppress)ÚEACCESÚEEXISTÚEPERMÚESRCH)ÚPathé   )ÚBaseFileLock)Úbreak_lock_fileÚensure_directory_existsÚraise_on_not_writable_filei   éW   i   g       @i   c                  ó’   — e Zd ZdZdd„Zdd„Zedd„«       Zedd„«       Zedd„«       Z	e
dd„«       Ze
dd„«       Zdd	„Zdd
„Zdd„Zy)ÚSoftFileLocka­  
    Portable file lock based on file existence.

    Unlike :class:`UnixFileLock <filelock.UnixFileLock>` and :class:`WindowsFileLock <filelock.WindowsFileLock>`, this
    lock does not use OS-level locking primitives. Instead, it creates the lock file with ``O_CREAT | O_EXCL`` and
    treats its existence as the lock indicator. This makes it work on any filesystem but leaves stale lock files behind
    if the process crashes without releasing the lock.

    To mitigate stale locks, the lock file contains the PID and hostname of the holding process. On contention, if the
    holder is on the same host and its PID no longer exists, the stale lock is broken automatically.

    c                ór  — t        | j                  «       t        | j                  «       t        j                  t        j
                  z  t        j                  z  t        j                  z  }t        t        dd «      x}�||z  }	 t        j                  | j                  || j                  «       «      }| j                  |«       || j                  _        y # t        $ rT}|j                  t         k(  s'|j                  t"        k(  rt$        j&                  dk(  s‚ | j)                  «        Y d }~y d }~ww xY w)NÚ
O_NOFOLLOWÚwin32)r   Ú	lock_filer   ÚosÚO_WRONLYÚO_CREATÚO_EXCLÚO_TRUNCÚgetattrÚopenÚ
_open_modeÚ_write_lock_infoÚ_contextÚlock_file_fdÚOSErrorÚerrnor   r   ÚsysÚplatformÚ_try_break_stale_lock)ÚselfÚflagsÚ
o_nofollowÚfile_handlerÚ	exceptions        úc/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/filelock/_soft.pyÚ_acquirezSoftFileLock._acquire#   sñ   € Ü" 4§>¡>Ô2Ü §¡Ô/ä�K‰KÜ�j‰jñä�i‰iñô �j‰jñð 	ô "¤" l°DÓ9Ð9ˆJÐFØ�ZÑˆEð
	6ÜŸ7™7 4§>¡>°5¸$¿/¹/Ó:KÓLˆLð ×!Ñ! ,Ô/Ø)5ˆD�M‰MÕ&øô ò 	)à—‘¤6Ò)¨i¯o©oÄÒ.GÌCÏLÉLÐ\cÒLcàØ×&Ñ&×(Ñ(ûð	)ús   Â/C Ã	D6Ã"A
D1Ä1D6c                ó@  — t        t        t        «      5  t        | j                  «      \  }}}t        |«      }|€?t        j                  «       |z
  t        k\  rt        | j                  ||«       	 d d d «       y |\  }}}|t        j                  «       k7  r
	 d d d «       y | j                  |«      rAt        j                  dk7  s|€
	 d d d «       y | j                  |«      }|�||k(  r
	 d d d «       y t        | j                  ||«       d d d «       y # 1 sw Y   y xY w©Nr   )r   r!   Ú
ValueErrorÚ_read_lock_filer   Ú_parse_lock_holderÚtimeÚ_MALFORMED_LOCK_AGE_THRESHOLDr   ÚsocketÚgethostnameÚ_is_process_aliver#   r$   Ú_get_process_creation_time)	r&   ÚcontentÚmtimeÚinoÚholderÚpidÚhostnameÚcreation_timeÚactuals	            r+   r%   z"SoftFileLock._try_break_stale_lock:   s  € Ü”gœzÓ*ñ 	8Ü"1°$·.±.Ó"AÑˆG�U˜CÜ'¨Ó0ˆFàˆ~ô —9‘9“; Ñ&Ô*GÒGÜ# D§N¡N°E¸3Ô?Ø÷	8ð 	8ð ,2Ñ(ˆC�˜=Øœ6×-Ñ-Ó/Ò/Ø÷	8ð 	8ð  ×%Ñ% cÔ*Ü—<‘< 7Ò*¨mÐ.CØ÷%	8ð 	8ð& ×8Ñ8¸Ó=�Ø�> V¨}Ò%<Ø÷+	8ð 	8ô0 ˜DŸN™N¨E°3Ô7÷1	8÷ 	8ñ 	8ús$   •ADÁ;DÂ"'DÃDÃ4DÄDc                ó”  — t         j                  dk(  r\dd l}|j                  j                  }|j                  t        d| «      }|r|j                  |«       y|j                  «       t        k7  S 	 t        j                  | d«       y# t        $ r6}|j                  t        k(  rY d }~y|j                  t        k(  rY d }~y‚ d }~ww xY w)Nr   r   TF)r#   r$   ÚctypesÚwindllÚkernel32ÚOpenProcessÚ_WIN_SYNCHRONIZEÚCloseHandleÚGetLastErrorÚ_WIN_ERROR_INVALID_PARAMETERr   Úkillr!   r"   r   r   )r<   rA   rC   ÚhandleÚexcs        r+   r6   zSoftFileLock._is_process_aliveU   s¨   € ä�<‰<˜7Ò"Ûà—}‘}×-Ñ-ˆHØ×)Ñ)Ô*:¸A¸sÓCˆFÙØ×$Ñ$ VÔ,ØØ×(Ñ(Ó*Ô.JÑJÐJð	Ü�G‰G�C˜ŒOð øô ò 	Ø�y‰yœEÒ!ÜØ�y‰yœEÒ!ÜØûð	ús$   Á1B Â	CÂCÂ)CÃCÃCc           	     óp  — t         j                  dk7  ryddl}ddlm} |j                  j
                  }|j                  t        d| «      }|sy	 |j                  «       }|j                  «       }|j                  «       }|j                  «       }|j                  ||j                  |«      |j                  |«      |j                  |«      |j                  |«      «      s	 |j                  |«       y	 |j                  |«       |j                  dz  |j                  z  S # |j                  |«       w xY w)zRReturn the process creation FILETIME as an integer on Windows, ``None`` otherwise.r   Nr   )Úwintypesé    )r#   r$   rA   rM   rB   rC   rD   Ú&_WIN_PROCESS_QUERY_LIMITED_INFORMATIONÚFILETIMEÚGetProcessTimesÚbyrefrF   ÚdwHighDateTimeÚdwLowDateTime)	r<   rA   rM   rC   rJ   ÚcreationÚ	exit_timeÚkernel_timeÚ	user_times	            r+   r7   z'SoftFileLock._get_process_creation_timej   s  € ô �<‰<˜7Ò"ØÛÝ#à—=‘=×)Ñ)ˆØ×%Ñ%Ô&LÈaÐQTÓUˆÙØð	)Ø×(Ñ(Ó*ˆHØ ×)Ñ)Ó+ˆIØ"×+Ñ+Ó-ˆKØ ×)Ñ)Ó+ˆIØ×+Ñ+ØØ—‘˜XÓ&Ø—‘˜YÓ'Ø—‘˜[Ó)Ø—‘˜YÓ'ôð à× Ñ  Õ(ðð × Ñ  Ô(Ø×'Ñ'¨2Ñ-°×1GÑ1GÑGÐGøð × Ñ  Õ(ús   ÁBD" Ä"D5c                ót  — t        t        «      5  t        j                  «       › dt	        j
                  «       › d�}t        j                  dk(  r1t        j                  t        j                  «       «      x}�||› d�z  }t        j                  | |j                  «       «       d d d «       y # 1 sw Y   y xY w)Nú
r   )r   r!   r   Úgetpidr4   r5   r#   r$   r   r7   ÚwriteÚencode)ÚfdÚinfoÚcts      r+   r   zSoftFileLock._write_lock_info‡   s�   € ä”gÓñ 	(Ü—i‘i“k�] "¤V×%7Ñ%7Ó%9Ð$:¸"Ð=ˆDÜ�|‰|˜wÒ&´,×2YÑ2YÔZ\×ZcÑZcÓZeÓ2fÐ,f¨BÐ+sØ˜2˜$˜b˜	Ñ!�Ü�H‰H�R˜Ÿ™›Ô'÷		(÷ 	(ñ 	(ús   �BB.Â.B7c                óº   — t        t        t        «      5  t        t	        | j
                  «      d   «      }|�|d   cddd«       S 	 ddd«       y# 1 sw Y   yxY w)z¿
        The PID of the process holding this lock, read from the lock file.

        :returns: the PID as an integer, or ``None`` if the lock file does not exist or cannot be parsed

        r   N)r   r!   r/   r1   r0   r   )r&   r;   s     r+   r<   zSoftFileLock.pid�   sZ   € ô ”gœzÓ*ñ 	!Ü'¬¸¿¹Ó(GÈÑ(JÓKˆFØÐ!Ø˜a‘y÷	!ñ 	!à!÷	!ð ÷		!ð ús   •(AÁAc                ó  — t        t        t        «      5  t        t	        | j
                  «      d   «      }|�?|\  }}}|t        j                  «       k(  xr |t        j                  «       k(  cddd«       S 	 ddd«       y# 1 sw Y   yxY w)z©
        Whether this lock is held by the current process.

        :returns: ``True`` if the lock file exists and names the current process's PID and hostname

        r   NF)
r   r!   r/   r1   r0   r   r   r[   r4   r5   )r&   r;   r<   r=   Ú_s        r+   Úis_lock_held_by_uszSoftFileLock.is_lock_held_by_us�   s…   € ô ”gœzÓ*ñ 	OÜ'¬¸¿¹Ó(GÈÑ(JÓKˆFØÐ!Ø#)Ñ ��X˜qØœbŸi™i›kÑ)ÒN¨h¼&×:LÑ:LÓ:NÑ.N÷		Oñ 	Oà!÷	Oð
 ÷	Oð
 ús   •ABÂBc                ó’   — t        t        «      5  t        | j                  «      j	                  «        ddd«       y# 1 sw Y   yxY w)zNForcibly break the lock by removing the lock file, regardless of who holds it.N)r   r!   r	   r   Úunlink©r&   s    r+   Ú
break_lockzSoftFileLock.break_lock¬   s4   € ä”gÓñ 	*Ü�—‘Ó ×'Ñ'Ô)÷	*÷ 	*ñ 	*ús	   �$=½Ac                ó~  — | j                   j                  €J ‚t        j                  | j                   j                  «       d | j                   _        t        j
                  dk(  r| j                  «        y t        t        «      5  t        | j                  «      j                  «        d d d «       y # 1 sw Y   y xY wr.   )r   r    r   Úcloser#   r$   Ú_windows_unlink_with_retryr   r!   r	   r   rf   rg   s    r+   Ú_releasezSoftFileLock._release±   s„   € Ø�}‰}×)Ñ)Ð5Ð5Ð5Ü
�‰�—‘×+Ñ+Ô,Ø%)ˆ�‰Ô"Ü�<‰<˜7Ò"Ø×+Ñ+Õ-äœ'Ó"ñ .Ü�T—^‘^Ó$×+Ñ+Ô-÷.÷ .ñ .ús   Â$B3Â3B<c                ó"  — d}d}t        |«      D ]'  }	 t        | j                  «      j                  «         y  y # t        $ rJ}|j
                  t        t        hvrY d }~ y ||dz
  k  rt        j                  |«       |dz  }Y d }~Œyd }~ww xY w)Né
   gü©ñÒMbP?r
   é   )
Úranger	   r   rf   r!   r"   r   r   r2   Úsleep)r&   Úmax_retriesÚretry_delayÚattemptrK   s        r+   rk   z'SoftFileLock._windows_unlink_with_retry»   s‡   € ØˆØˆÜ˜[Ó)ò 	ˆGð	Ü�T—^‘^Ó$×+Ñ+Ô-ñ ñ	øô ò %Ø—9‘9¤V¬U OÑ3ÝØ˜[¨1™_Ò,Ü—J‘J˜{Ô+Ø 1Ñ$�Kÿøð%ús   ”#;»	BÁB	Á""B	Â	BN)ÚreturnÚNone)r<   Úintru   Úbool)r<   rw   ru   ú
int | None)r^   rw   ru   rv   )ru   ry   )ru   rx   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r%   Ústaticmethodr6   r7   r   Úpropertyr<   rd   rh   rl   rk   © ó    r+   r   r      s†   „ ñó6ó.8ð6 òó ðð( òHó ðHð8 ò(ó ð(ð òó ðð òó ðó*ó
.ôr�   r   c           	     óF  — t        j                  | t         j                  t        t         dd«      z  t        t         dd«      z  «      }	 t        j                  |«      t        j
                  |t        dz   «      }}t        j                  |«       t        |«      t        k  rAt        t        «      5  |j                  d«      |j                  |j                  fcd d d «       S d |j                  |j                  fS # t        j                  |«       w xY w# 1 sw Y   Œ<xY w)Nr   r   Ú
O_NONBLOCKr
   zutf-8)r   r   ÚO_RDONLYr   ÚfstatÚreadÚ_MAX_LOCK_FILE_SIZErj   Úlenr   ÚUnicodeDecodeErrorÚdecodeÚst_mtimeÚst_ino)Úpathr^   ÚstÚdatas       r+   r0   r0   Ì   sÜ   € ô 
�‰�”r—{‘{¤W¬R°¸qÓ%AÑAÄGÌBÐP\Ð^_ÓD`Ñ`Ó	a€BðÜ—8‘8˜B“<¤§¡¨Ô-@À1Ñ-DÓ!EˆDˆä
�‰�ŒÜ
ˆ4ƒyÔ'Ò'ÜÔ(Ó)ñ 	@Ø—;‘;˜wÓ'¨¯©°b·i±iÐ?÷	@ñ 	@à�—‘˜bŸi™iÐ'Ð'øô	 	�‰��ú÷	@ð 	@ús   Á
2C= Â2(DÃ=DÄD c                ó  — | r+t        | j                  «       j                  «       x}«      dvry 	 t        |d   «      }t        |«      dk(  rt        |d   «      nd }d|cxk  rdk  sy  y ||d   |fS # t        $ r Y y w xY w)N>   ro   é   r   r‘   ro   r
   iÿÿÿ)rˆ   ÚstripÚ
splitlinesrw   r/   )r8   Úlinesr<   r>   s       r+   r1   r1   Ý   s”   € ñ ”c 7§=¡=£?×#=Ñ#=Ó#?Ð?˜%Ó@ÈÑNØðÜ�%˜‘(‹mˆÜ),¨U«°qªœ˜E !™Hœ¸dˆð �Ô �yÒ Øð !ØØ��a‘˜-Ð'Ð'øô ò Ùðús   °,A2 Á2	A>Á=A>)r�   Ústrru   ztuple[str | None, float, int])r8   z
str | Noneru   z"tuple[int, str, int | None] | None)Ú
__future__r   r   r4   r#   r2   Ú
contextlibr   r"   r   r   r   r   Úpathlibr	   Ú_apir   Ú_utilr   r   r   rE   rH   rO   r3   r‡   r   r0   r1   Ú__all__r€   r�   r+   ú<module>rœ      sl   ðÝ "ã 	Û Û 
Û Ý ß .Ó .Ý å ß WÑ WàÐ Ø!Ð Ø)/Ð &Ø #Ð ØÐ ôt�<ô tón(ó"(ð* ð�r�   