]> git.mxchange.org Git - friendica.git/blobdiff - include/lock.php
repeated items from ostatus and diaspora are now using the share-element.
[friendica.git] / include / lock.php
index be6130e1d091ec5f74d969935e58c7f5ef2a0dd3..707e33609e32456b64c7e295b8786b3f1e0964f3 100644 (file)
@@ -2,29 +2,28 @@
 
 // Provide some ability to lock a PHP function so that multiple processes
 // can't run the function concurrently
-// The function must have a line inserted into the 'lock' table with the
-// function's name in the 'name' field
 if(! function_exists('lock_function')) {
-function lock_function($fn_name, $block = true, $wait_sec = 2) {
+function lock_function($fn_name, $block = true, $wait_sec = 2, $timeout = 30) {
        if( $wait_sec == 0 )
                $wait_sec = 2;  // don't let the user pick a value that's likely to crash the system
 
        $got_lock = false;
+       $start = time();
 
        do {
-               q("LOCK TABLE lock WRITE");
-               $r = q("SELECT locked FROM lock WHERE name = '%s' LIMIT 1",
+               q("LOCK TABLE locks WRITE");
+               $r = q("SELECT locked FROM locks WHERE name = '%s' LIMIT 1",
                        dbesc($fn_name)
                );
 
                if((count($r)) && (! $r[0]['locked'])) {
-                       q("UPDATE lock SET locked = 1 WHERE name = '%s' LIMIT 1",
+                       q("UPDATE locks SET locked = 1 WHERE name = '%s' LIMIT 1",
                                dbesc($fn_name)
                        );
                        $got_lock = true;
                }
                elseif(! $r) { // the Boolean value for count($r) should be equivalent to the Boolean value of $r
-                       q("INSERT INTO lock ( name, locked ) VALUES ( '%s', 1 )",
+                       q("INSERT INTO locks ( name, locked ) VALUES ( '%s', 1 )",
                                dbesc($fn_name)
                        );
                        $got_lock = true;
@@ -35,42 +34,42 @@ function lock_function($fn_name, $block = true, $wait_sec = 2) {
                if(($block) && (! $got_lock))
                        sleep($wait_sec);
 
-       } while(($block) && (! $got_lock));
+       } while(($block) && (! $got_lock) && ((time() - $start) < $timeout));
 
-       logger('lock_function: function ' . $fn_name . ' with blocking = ' . $block . ' got_lock = ' . $got_lock, LOGGER_DEBUG);
+       logger('lock_function: function ' . $fn_name . ' with blocking = ' . $block . ' got_lock = ' . $got_lock . ' time = ' . (time() - $start), LOGGER_DEBUG);
        
        return $got_lock;
 }}
 
 
 if(! function_exists('block_on_function_lock')) {
-function block_on_function_lock($fn_name, $wait_sec = 2) {
+function block_on_function_lock($fn_name, $wait_sec = 2, $timeout = 30) {
        if( $wait_sec == 0 )
                $wait_sec = 2;  // don't let the user pick a value that's likely to crash the system
 
+       $start = time();
+
        do {
-               $r = q("SELECT locked FROM lock WHERE name = '%s' LIMIT 1",
-                               dbesc(fn_name)
+               $r = q("SELECT locked FROM locks WHERE name = '%s' LIMIT 1",
+                               dbesc($fn_name)
                     );
 
                if(count($r) && $r[0]['locked'])
                        sleep($wait_sec);
 
-       } while(count($r) && $r[0]['locked']);
+       } while(count($r) && $r[0]['locked'] && ((time() - $start) < $timeout));
 
        return;
 }}
 
 
 if(! function_exists('unlock_function')) {
-function unlock_function(fn_name) {
-       //$r = q("LOCK TABLE lock WRITE");
-       $r = q("UPDATE lock SET locked = 0 WHERE name = '%s' LIMIT 1",
-                       dbesc(fn_name)
+function unlock_function($fn_name) {
+       $r = q("UPDATE locks SET locked = 0 WHERE name = '%s' LIMIT 1",
+                       dbesc($fn_name)
             );
-       //$r = q("UNLOCK TABLES");
 
-       logger('unlock_function: released lock for function ' . fn_name, LOGGER_DEBUG);
+       logger('unlock_function: released lock for function ' . $fn_name, LOGGER_DEBUG);
 
        return;
 }}