- dba:p("LOCK TABLE `locks` WRITE");
- $lock = dba::select('locks', array('locked'), array('name' => $fn_name), array('limit' => 1));
-
- if ((dbm::is_result($lock)) AND !$lock['locked']) {
- dba::update('locks', array('locked' => true), array('name' => $fn_name));
- $got_lock = true;
+ dba::p("LOCK TABLE `locks` WRITE");
+ $lock = dba::select('locks', array('locked', 'pid'), array('name' => $fn_name), array('limit' => 1));
+
+ if (dbm::is_result($lock)) {
+ if ($lock['locked']) {
+ // When the process id isn't used anymore, we can safely claim the lock for us.
+ if (!posix_kill($lock['pid'], 0)) {
+ $lock['locked'] = false;
+ }
+ // We want to lock something that was already locked by us? So we got the lock.
+ if ($lock['pid'] == getmypid()) {
+ $got_lock = true;
+ }
+ }
+ if (!$lock['locked']) {
+ dba::update('locks', array('locked' => true, 'pid' => getmypid()), array('name' => $fn_name));
+ $got_lock = true;
+ }