--- /dev/null
+<?php
+
+function mutex_lock ($name, $duration) {
+ while (true) {
+ $now = time();
+ $deleted_obsoletes = false;
+ db_insert('wfpl_mutexes', 'name,expires', $name, $now + $duration);
+ $id = db_auto_id();
+ $rows = db_get_assocs('wfpl_mutexes', 'id,name,expires', 'order by id');
+ $first_match = true;
+ foreach ($rows as $row) {
+ if ($row['expires'] < $now) {
+ if (!$deleted_obsoletes) {
+ db_delete('wfpl_mutexes', 'where expires < %i', $now);
+ $deleted_obsoletes = true;
+ }
+ } elseif ($row['name'] === $name) {
+ if ($row['id'] == $id) {
+ return $id;
+ } else {
+ break;
+ }
+ }
+ }
+ # not first
+ db_delete('wfpl_mutexes', 'where id=%i', $id);
+ sleep(1);
+ }
+}
+
+function mutex_unlock ($id) {
+ db_delete('wfpl_mutexes', 'where id=%i', $id);
+}