3 ÓXj.ã@s†ddlZddlZddlZddlZddlmZmZddlmZddlZGdd„de ƒZ Gdd„dƒZ dd „Z e d kr‚eje ƒp~dƒdS) éN)Ú EWOULDBLOCKÚEEXIST)Úbstrc@seZdZdZdS)ÚLockfileLockedExceptionz$thrown ONLY when pid file is locked.N)Ú__name__Ú __module__Ú __qualname__Ú__doc__©r r ú!/usr/lib/python3.6/rhnLockfile.pyrsrc@s*eZdZdZd dd„Zdd„Zdd„ZdS) ÚLockfilezïclass that provides simple access to a PID-style lockfile. methods: __init__(lockfile), acquire(), and release() NOTE: currently acquires upon init The *.pid file will be acquired, or an LockfileLockedException is raised. NcCs"tjjtjjtjj|ƒƒƒ|_||_|js4tjƒ|_tjj|jƒ}tjj |ƒs–ytj |ƒWn8t k r”t j ƒd}t|dƒrŽ|jtkrŽn‚YnXtj|jtjtjBtjBtjBtjBdƒ|_tj|jƒ}tj|jƒ sì|jtjƒk�rtj|jƒt d|jtjƒ|j|jfƒ‚|jƒdS)zlcreate (if need be), and acquire lock on lockfile lockfile example: '/var/run/up2date.pid' éÚerrnoi€zSrefusing to use lockfile %s: not a regular file owned by uid %d (mode 0o%o, uid %d)N) ÚosÚpathÚabspathÚ expanduserÚ expandvarsÚlockfileÚpidÚgetpidÚdirnameÚexistsÚmakedirsÚOSErrorÚsysÚexc_infoÚhasattrrrÚopenÚO_RDWRÚO_CREATÚO_SYNCÚ O_NOFOLLOWÚ O_CLOEXECÚfÚfstatÚstatÚS_ISREGÚst_modeÚst_uidÚgeteuidÚcloseÚacquire)ÚselfrrrÚeÚstr r r Ú__init__%s0    $  zLockfile.__init__c Cs ytj|jtjtjBƒWnDtk r^tjƒdjt krXt d|j dtjƒdƒ‚n‚YnXtj|jtj dƒt j|jdƒt j|jtt|jƒdƒƒdS)z5acquire the lock; else raise LockfileLockedException.r zcannot acquire lock on %s.NérÚ )ÚfcntlÚflockr$ZLOCK_EXZLOCK_NBÚIOErrorrrrrrrZF_SETFDrÚ ftruncateÚwriterÚstrr)r-r r r r,^szLockfile.acquirec Cs~y4tj|jƒ}tj|jƒ}|j|jko0|j|jk}Wntk rLd}YnX|r^tj|jƒt j |jt j ƒtj |jƒdS)NF) rr%r$ÚlstatrÚst_devÚst_inorÚunlinkr3r4ZLOCK_UNr+)r-Zfd_stZpath_stZ same_inoder r r Úreleaseos     zLockfile.release)N)rrrr r0r,r=r r r r r s 9r c Cszy tdƒ}Wn6tk rBtjjdtjƒdƒtjd ƒYn4Xtdƒtdƒddl}|j dƒ|j ƒtd ƒdS) z test codez ./test.pidz%s r zlock acquired z...sleeping for 10 secondsrNé zlock released éÿÿÿÿ) r rrÚstderrr7rÚexitÚprintÚtimeZsleepr=)ÚLrCr r r Úmain„s  rEÚ__main__)rrr&r3rrrZrhn.i18nrÚ Exceptionrr rErrAr r r r Ús h