JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
add db_upgrade(), persistent_invalidate_cache()
[wfpl.git] / mutex.php
diff --git a/mutex.php b/mutex.php
new file mode 100644 (file)
index 0000000..f6f4672
--- /dev/null
+++ b/mutex.php
@@ -0,0 +1,33 @@
+<?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);
+}