]> git.mxchange.org Git - friendica.git/blob - include/lock.php
be6130e1d091ec5f74d969935e58c7f5ef2a0dd3
[friendica.git] / include / lock.php
1 <?php
2
3 // Provide some ability to lock a PHP function so that multiple processes
4 // can't run the function concurrently
5 // The function must have a line inserted into the 'lock' table with the
6 // function's name in the 'name' field
7 if(! function_exists('lock_function')) {
8 function lock_function($fn_name, $block = true, $wait_sec = 2) {
9         if( $wait_sec == 0 )
10                 $wait_sec = 2;  // don't let the user pick a value that's likely to crash the system
11
12         $got_lock = false;
13
14         do {
15                 q("LOCK TABLE lock WRITE");
16                 $r = q("SELECT locked FROM lock WHERE name = '%s' LIMIT 1",
17                         dbesc($fn_name)
18                 );
19
20                 if((count($r)) && (! $r[0]['locked'])) {
21                         q("UPDATE lock SET locked = 1 WHERE name = '%s' LIMIT 1",
22                                 dbesc($fn_name)
23                         );
24                         $got_lock = true;
25                 }
26                 elseif(! $r) { // the Boolean value for count($r) should be equivalent to the Boolean value of $r
27                         q("INSERT INTO lock ( name, locked ) VALUES ( '%s', 1 )",
28                                 dbesc($fn_name)
29                         );
30                         $got_lock = true;
31                 }
32
33                 q("UNLOCK TABLES");
34
35                 if(($block) && (! $got_lock))
36                         sleep($wait_sec);
37
38         } while(($block) && (! $got_lock));
39
40         logger('lock_function: function ' . $fn_name . ' with blocking = ' . $block . ' got_lock = ' . $got_lock, LOGGER_DEBUG);
41         
42         return $got_lock;
43 }}
44
45
46 if(! function_exists('block_on_function_lock')) {
47 function block_on_function_lock($fn_name, $wait_sec = 2) {
48         if( $wait_sec == 0 )
49                 $wait_sec = 2;  // don't let the user pick a value that's likely to crash the system
50
51         do {
52                 $r = q("SELECT locked FROM lock WHERE name = '%s' LIMIT 1",
53                                 dbesc(fn_name)
54                      );
55
56                 if(count($r) && $r[0]['locked'])
57                         sleep($wait_sec);
58
59         } while(count($r) && $r[0]['locked']);
60
61         return;
62 }}
63
64
65 if(! function_exists('unlock_function')) {
66 function unlock_function(fn_name) {
67         //$r = q("LOCK TABLE lock WRITE");
68         $r = q("UPDATE lock SET locked = 0 WHERE name = '%s' LIMIT 1",
69                         dbesc(fn_name)
70              );
71         //$r = q("UNLOCK TABLES");
72
73         logger('unlock_function: released lock for function ' . fn_name, LOGGER_DEBUG);
74
75         return;
76 }}