diff options
author | Adrian Lang <lang@cosmocode.de> | 2010-10-18 16:30:04 +0200 |
---|---|---|
committer | Adrian Lang <lang@cosmocode.de> | 2010-10-18 16:31:00 +0200 |
commit | 30b9fabab69e5f3d63eab09a96a9aa7c669b9f38 (patch) | |
tree | f87aee69cd3917a6d2d1c690529727ea1c6b8757 /inc/subscription.php | |
parent | 9208bd41ae8c41f3e5a2d993bf678f152b68b89c (diff) | |
download | rpg-30b9fabab69e5f3d63eab09a96a9aa7c669b9f38.tar.gz rpg-30b9fabab69e5f3d63eab09a96a9aa7c669b9f38.tar.bz2 |
Fix subscription locking
- use directories since working with them is atomic
- delete stale locks after 5 minutes
Diffstat (limited to 'inc/subscription.php')
-rw-r--r-- | inc/subscription.php | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/inc/subscription.php b/inc/subscription.php index f198402f9..78cb3ed0d 100644 --- a/inc/subscription.php +++ b/inc/subscription.php @@ -44,9 +44,26 @@ function subscription_filename($id) { * * @author Adrian Lang <lang@cosmocode.de> */ +function subscription_lock_filename ($id){ + global $conf; + return $conf['lockdir'].'/_subscr_' . $id . '.lock'; +} + function subscription_lock($id) { - $lockf = subscription_filename($id) . '.lock'; - return !file_exists($lockf) && touch($lockf); + // FIXME merge this with the indexer lock generation, abstract out + global $conf; + $lock = subscription_lock_filename($id); + while(!@mkdir($lock,$conf['dmode'])){ + usleep(50); + if(time()-@filemtime($lock) > 60*5){ + // looks like a stale lock - remove it + @rmdir($lock); + }else{ + return false; + } + } + if($conf['dperm']) chmod($lock, $conf['dperm']); + return true; } /** @@ -58,8 +75,8 @@ function subscription_lock($id) { * @author Adrian Lang <lang@cosmocode.de> */ function subscription_unlock($id) { - $lockf = subscription_filename($id) . '.lock'; - return file_exists($lockf) && unlink($lockf); + $lockf = subscription_lock_filename($id); + return @rmdir($lockf); } /** |