X-Git-Url: http://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=web%2FObj%2Fbrisk.phh;h=95ec8ab9bab5087c72899d3473aaf29b7e3ffb2d;hb=525cfe7d868bfaefdde9f769f52a50bcb6f1e9e9;hp=2ba7c1a642443da84aa819e89d4bab5231f8db89;hpb=e47ddcae6cc33ed9d2471a54936db7d8efd5d46a;p=brisk.git diff --git a/web/Obj/brisk.phh b/web/Obj/brisk.phh index 2ba7c1a..95ec8ab 100644 --- a/web/Obj/brisk.phh +++ b/web/Obj/brisk.phh @@ -23,60 +23,62 @@ */ -define(BRISK_CONF, "brisk.conf.pho"); -define(FTOK_PATH, "/var/lib/brisk"); -define(LEGAL_PATH, "/tmp/legal_brisk"); -define(PROXY_PATH, "/var/lib/brisk_proxy"); -define(TABLES_N, 36); -define(TABLES_AUTH_N, 4); -define(PLAYERS_N, 3); -define(MAX_POINTS, 5); -define(MAX_PLAYERS, (20 + (PLAYERS_N * TABLES_N))); -define(SHM_DIMS_MIN, (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS)); -define(SHM_DIMS_MAX, SHM_DIMS_MIN + 1048576); -define(SHM_DIMS_DLT, 65536); - -define(SHM_DIMS_U_MIN, 4096); -define(SHM_DIMS_U_MAX, 65536); -define(SHM_DIMS_U_DLT, 4096); - -define(COMM_N, 18); -define(COMM_GEN_N, 50); - -define(CHAT_N, 3); -define(CHAT_ILL_TIME, 6); - -define(SESS_LEN, 13); -define(STREAM_TIMEOUT, 20); -define(EXPIRE_TIME_RD, 180); -define(EXPIRE_TIME_SMAMMA, 360); -define(EXPIRE_TIME_WAG, 10); -define(WAKEUP_TIME, 12); +define('BRISK_CONF', "brisk.conf.pho"); +define('FTOK_PATH', "/var/lib/brisk"); +define('LEGAL_PATH', "/tmp/legal_brisk"); +define('PROXY_PATH', "/var/lib/brisk_proxy"); +define('TABLES_N', 36); +define('TABLES_AUTH_N', 4); +define('PLAYERS_N', 3); +define('MAX_POINTS', 5); +define('MAX_PLAYERS', (20 + (PLAYERS_N * TABLES_N))); +define('SHM_DIMS_MIN', (50000 + 10000 * TABLES_N + 15000 * MAX_PLAYERS)); +define('SHM_DIMS_MAX', SHM_DIMS_MIN + 1048576); +define('SHM_DIMS_DLT', 65536); + +define('SHM_DIMS_U_MIN', 4096); +define('SHM_DIMS_U_MAX', 65536); +define('SHM_DIMS_U_DLT', 4096); + +define('COMM_N', 18); +define('COMM_GEN_N', 50); + +define('CHAT_N', 3); +define('CHAT_ILL_TIME', 6); + +define('SESS_LEN', 13); +define('STREAM_TIMEOUT', 60); +define('EXPIRE_TIME_RD', 180); +define('EXPIRE_TIME_SMAMMA', 360); +define('EXPIRE_TIME_WAG', 10); +define('WAKEUP_TIME', 12); // BAN_TIME da allineare anche in commons.js -define(BAN_TIME, 3600); -define(GARBAGE_TIMEOUT, 10); -define(NICKSERV, "BriskServ"); - - -define(DBG_ONL2, 0x0001); -define(DBG_ONLY, 0x0002); -define(DBG_MAIN, 0x0004); -define(DBG_READ, 0x0008); -define(DBG_REA2, 0x0010); -define(DBG_SEND, 0x0020); -define(DBG_LOCK, 0x0040); -define(DBG_WRIT, 0x0080); -define(DBG_LOAD, 0x0100); -define(DBG_AUTH, 0x0200); -define(DBG_CRIT, 0x0400); -define(DBG_LMOP, 0x0800); -define(DBG_TRAC, 0x1000); +define('BAN_TIME', 3600); +define('GARBAGE_TIMEOUT', 10); +define('NICKSERV', "BriskServ"); + +define('LOCK_SHARE_MAX', 10000); + +define('DBG_ONL2', 0x0001); +define('DBG_ONLY', 0x0002); +define('DBG_MAIN', 0x0004); +define('DBG_READ', 0x0008); +define('DBG_REA2', 0x0010); +define('DBG_SEND', 0x0020); +define('DBG_LOCK', 0x0040); +define('DBG_WRIT', 0x0080); +define('DBG_LOAD', 0x0100); +define('DBG_AUTH', 0x0200); +define('DBG_CRIT', 0x0400); +define('DBG_LMOP', 0x0800); +define('DBG_TRAC', 0x1000); +define('DBG_SHME', 0x2000); // NOTE: BRISK DEBUG must be a numerical constant, not the result of operations on symbols -define(BRISK_DEBUG, 0xffffffbf); +define('BRISK_DEBUG', 0x0800); -define(BRISK_SINGLE_DEBUG,0); -define(BRISK_SINGLE_SESS, ""); -// define(DEBUGGING, "local"); +define('BRISK_SINGLE_DEBUG',0); +define('BRISK_SINGLE_SESS', ""); +define('DEBUGGING', "no-debugging"); require_once("$DOCUMENT_ROOT/Etc/".BRISK_CONF); @@ -134,12 +136,12 @@ $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi', $G_lng = langtolng($G_lang); $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 ); -$G_brisk_version = "3.5.3"; +$G_brisk_version = "3.6.3"; /* MLANG: ALL THE INFO STRINGS IN brisk.phh */ -$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NOVITA\': terza versione di test per la nuova gestione dei dati volatili, rivista gestione del ticker.', +$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NOVITA\': nuovo sistema di evidenziazione degli utenti registrati.', 'Se vuoi iscriverti alla Mailing List, cliccala!' ), - 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NEWS: third test version for the new volatile data management, ticker management refactored.', + 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NEWS: usage of reader/writer locking instead of generic exclusive locking.', 'If you want to subscribe our Mailing List, click it!' ) ); $G_room_help = array( 'it' => ' @@ -273,7 +275,7 @@ $G_room_about = array( 'it' => '
briscola chiamata in salsa ajax
version '.$G_brisk_version.'

-Copyright 2006-2009 Matteo Nastasi (aka mop)

', +Copyright 2006-2012 Matteo Nastasi (aka mop)

', 'en' => '
@@ -282,6 +284,79 @@ Copyright 2006-2009 Matteo Nasta
version '.$G_brisk_version.'

Copyright 2006-2009
Matteo Nastasi (aka mop)

'); +function mop_flush() +{ + ob_flush(); + flush(); +} + +function file_lock($fname, $is_exclusive) +{ + if (($res = @fopen($fname, "r+")) == FALSE) { + return (FALSE); + } + + if (flock($res, ($is_exclusive ? LOCK_EX : LOCK_SH)) == FALSE) { + fclose($res); + return (FALSE); + } + + return ($res); +} + +function file_unlock($res) +{ + if ($res != FALSE) { + flock($res, LOCK_UN); + fclose($res); + } +} + +function webservers_exceeded() +{ + return(file_exists(PROXY_PATH."/webservers_exceded.flag")); +} + +function webservers_check() +{ + GLOBAL $G_webserver_max; + + /* FIXME: check all procs expirations */ + return (10); + + $ct = 0; + + $dh = opendir('/proc'); + while (($file = readdir($dh)) !== false) { + if (preg_match('/[0-9]+/', $file)) { + $cmdline = explode("\0", file_get_contents('/proc/'.$file.'/cmdline')); + // echo "xxx".$cmdline[0].$n; + if (strstr('/usr/sbin/apache2', $cmdline[0]) != FALSE) { + // echo "yyy".$cmdline[0].$n; + $ct++; + } + } + } + closedir($dh); + + if ($ct >= $G_webserver_max) { + touch(PROXY_PATH."/webservers_exceded.flag"); + } + else { + unlink(PROXY_PATH."/webservers_exceded.flag"); + } + return ($ct); +} + +$escpush_from = array("\\", "\""); +$escpush_to = array("\\\\", "\\\""); +function escpush($s) +{ + GLOBAL $escpush_from, $escpush_to; + + return str_replace($escpush_from, $escpush_to, $s); +} + $escinp_from = array( "\"" ); $escinp_to = array( """ ); @@ -583,37 +658,39 @@ class Table { // User flags -define(USER_FLAG_AUTH, 0x02); +define('USER_FLAG_AUTH', 0x02); -define(USER_FLAG_MAP_AUTH, 0x0c); -define(USER_FLAG_LISTAUTH, 0x04); -define(USER_FLAG_ISOLAUTH, 0x08); +define('USER_FLAG_MAP_AUTH', 0x0c); +define('USER_FLAG_LISTAUTH', 0x04); +define('USER_FLAG_ISOLAUTH', 0x08); -define(USER_FLAG_DBFAILED, 0x10); +define('USER_FLAG_DBFAILED', 0x10); // user status -define(USER_FLAG_S_NORM, 0x000); // done -define(USER_FLAG_S_PAU, 0x100); // done -define(USER_FLAG_S_OUT, 0x200); // done -define(USER_FLAG_S_DOG, 0x300); // done -define(USER_FLAG_S_EAT, 0x400); // done -define(USER_FLAG_S_WRK, 0x500); // done -define(USER_FLAG_S_SMK, 0x600); // done -define(USER_FLAG_S_EYE, 0x700); // done -define(USER_FLAG_S_RABB, 0x800); // done -define(USER_FLAG_S_SOCC, 0x900); // done -define(USER_FLAG_S_BABY, 0xa00); // done -define(USER_FLAG_S_MOP, 0xb00); // done - -define(USER_FLAG_S_ALL, 0xf00); // done +define('USER_FLAG_S_NORM', 0x000); // done +define('USER_FLAG_S_PAU', 0x100); // done +define('USER_FLAG_S_OUT', 0x200); // done +define('USER_FLAG_S_DOG', 0x300); // done +define('USER_FLAG_S_EAT', 0x400); // done +define('USER_FLAG_S_WRK', 0x500); // done +define('USER_FLAG_S_SMK', 0x600); // done +define('USER_FLAG_S_EYE', 0x700); // done +define('USER_FLAG_S_RABB', 0x800); // done +define('USER_FLAG_S_SOCC', 0x900); // done +define('USER_FLAG_S_BABY', 0xa00); // done +define('USER_FLAG_S_MOP', 0xb00); // done + +define('USER_FLAG_S_ALL', 0xf00); // done /* type of user normal, supporter etc ... */ -define(USER_FLAG_TY_ALL, 0xff0000); // done -define(USER_FLAG_TY_NORM, 0x010000); // done -define(USER_FLAG_TY_SUPER, 0x020000); // done +define('USER_FLAG_TY_ALL', 0xff0000); // done +define('USER_FLAG_TY_NORM', 0x010000); // done +define('USER_FLAG_TY_SUPER', 0x020000); // done // ... other usefull status ... -define(USER_FLAG_TY_SUSPEND, 0x400000); // done -define(USER_FLAG_TY_DISABLE, 0x800000); // done +define('USER_FLAG_TY_SUSPEND', 0x400000); // done +define('USER_FLAG_TY_DISABLE', 0x800000); // done + +define('RD_STREAM_TIMEOUT', 4); class User { var $idx; // index in the users array when you are in game @@ -629,6 +706,16 @@ class User { var $subst; // substatus for each status var $step; // step of the current status var $trans_step; // step to enable transition between pages (disable == -1) + + var $rd_socket; // socket handle of push stream + var $rd_endtime; // end time for push stream + var $rd_stat; // actual status of push stream + var $rd_subst; // actual substatus of push stream + var $rd_step; // actual step of push stream + var $rd_from; // referer + var $rd_scristp; // current script step (for each session) + var $rd_tout; // if no message are sent after RD_STREAM_TIMEOUT secs we send a keepalive from server + var $comm; // commands array // var $asta_card; // // var $asta_pnt; // @@ -672,6 +759,16 @@ class User { $thiz->step = 1; $thiz->trans_step = -1; $thiz->comm = array(); + + $thiz->rd_socket = NULL; + $thiz->rd_endtime = -1; + $thiz->rd_stat = -1; + $thiz->rd_subst = ""; + $thiz->rd_step = -1; + $thiz->rd_from = ""; + $thiz->rd_scristp = -1; + $thiz->rd_tout = -1; + $thiz->asta_card = -2; $thiz->asta_pnt = -1; $thiz->handpt = -1; @@ -804,6 +901,52 @@ class User { return ($thiz); } + function rd_data_set($curtime, $stat, $subst, $step, $from) + { + $this->rd_endtime = $curtime + STREAM_TIMEOUT; + $this->rd_stat = $stat; + $this->rd_subst = $subst; + $this->rd_step = $step; + $this->rd_from = $from; + $this->rd_scristp = 0; + $this->rd_tout = $curtime + RD_STREAM_TIMEOUT; + } + + function rd_socket_get() { + return ($this->rd_socket); + } + + function rd_socket_set($sock) { + $this->rd_socket = $sock; + } + + function rd_tout_get() + { + return ($this->rd_tout); + } + + function rd_tout_set($tm) + { + $this->rd_tout = $tm; + } + + function rd_tout_is_expired($tm) + { + // printf("rd_tout %d tm %d\n", $this->rd_tout, $tm); + return ($this->rd_tout < $tm); + } + + function rd_endtime_is_expired($tm) + { + // printf("rd_endtime %d tm %d\n", $this->rd_tout, $tm); + return ($this->rd_endtime < $tm); + } + + function rd_tout_reset($tm) + { + $this->rd_tout = $tm + RD_STREAM_TIMEOUT; + } + function idx_get() { return ($this->idx); } @@ -820,7 +963,7 @@ class User { if (validate_sess($this->sess)) { if (file_exists(PROXY_PATH) == FALSE) mkdir(PROXY_PATH, 0775, TRUE); - $fp = fopen(PROXY_PATH."/".$this->sess.".stat", 'w'); + $fp = @fopen(PROXY_PATH."/".$this->sess.".stat", 'w'); fwrite($fp, sprintf("%s\n",$this->stat)); fclose($fp); } @@ -842,6 +985,7 @@ class User { return TRUE; } + function save_step() { do { @@ -892,13 +1036,20 @@ class User { return (FALSE); } + static function unproxy_step($sess) { + log_rd2("UNPROXY: ".PROXY_PATH."/".$sess.".step"); + if (file_exists(PROXY_PATH) == FALSE) + return; + @unlink(PROXY_PATH."/".$sess.".step"); + } + function reset() { $curtime = time(); log_legal($curtime, $this, "STAT:LOGOUT", ''); $tmp_sess = $this->sess; $this->sess = ""; - step_unproxy($tmp_sess); + self::unproxy_step($tmp_sess); $this->name = ""; // OK here while (array_pop($this->comm) != NULL); $this->step = 0; @@ -945,6 +1096,7 @@ class User { log_only("PUT_VAR FALLITA ".strlen(serialize($user))); log_only(serialize($user)); } + log_shme("User::save_data2"); } else { if ($sess != FALSE) { @@ -989,10 +1141,13 @@ class User { break; // log_only("PUT_VAR DI ".strlen(serialize($user))); - if (shm_put_var($shm, $tok, $user) != FALSE) { + if (@shm_put_var($shm, $tok, $user) != FALSE) { shm_detach($shm); if ($user->sess != "") $user->save_step(); + + log_shme("User::save_data"); + log_main("User[".$id."] saved."); return (TRUE); } @@ -1010,17 +1165,17 @@ class User { return (FALSE); } + function myname_innerHTML() + { + $class_id = ($this->flags & USER_FLAG_AUTH) + 1; + + return (sprintf('$("myname").innerHTML = "%s";', $class_id, + xcape($this->name,ENT_COMPAT,"UTF-8"))); + } } // end class User -function step_unproxy($sess) { - log_rd2("UNPROXY: ".PROXY_PATH."/".$sess.".step"); - if (file_exists(PROXY_PATH) == FALSE) - mkdir(PROXY_PATH); - @unlink(PROXY_PATH."/".$sess.".step"); -} - class Room { static $delta_t; @@ -1074,8 +1229,11 @@ class Room { $curtime = time(); // externalized if ($force || $this->garbage_timeout < $curtime) { - if ($force || Room::garbage_time_is_expired($curtime)) { + if (!$force && !Room::garbage_time_is_expired($curtime)) { + return ($ismod); + } + webservers_check(); // FIXME BRISK4: include for each kind of table require_once("${G_base}briskin5/Obj/briskin5.phh"); @@ -1087,7 +1245,7 @@ class Room { if ($table_cur->player_n == PLAYERS_N) { log_main("PLAYERS == N TABLE ".$table_idx); - if (($sem = Bin5::lock_data($table_idx)) != FALSE) { + if (($sem = Bin5::lock_data(TRUE, $table_idx)) != FALSE) { log_main("bin5 lock data success"); $no_recovery = FALSE; @@ -1138,7 +1296,8 @@ class Room { $this->room_join_wakeup($user_cur, FALSE, 0); $table_cur->table_token = ""; $table_cur->wakeup_time = $curtime + WAKEUP_TIME; - Bin5::destroy_data($table_idx); + + $bri->destroy_data($table_idx); } else { log_main("gm:: save_data"); @@ -1226,7 +1385,6 @@ class Room { // externalized $this->garbage_timeout = time() + GARBAGE_TIMEOUT; Room::garbage_time_expire_set($curtime + GARBAGE_TIMEOUT); $ismod = TRUE; - } return ($ismod); } @@ -1262,9 +1420,8 @@ class Room { } $ret .= sprintf('subst = "%s";', $user->subst); - $itin = ($user->flags & USER_FLAG_AUTH ? "" : ""); - $itou = ($user->flags & USER_FLAG_AUTH ? "" : ""); - $ret .= sprintf('$("myname").innerHTML = "%s%s%s";', $itin, xcape($user->name), $itou); + $ret .= $user->myname_innerHTML(); + for ($i = 0 ; $i < TABLES_N ; $i++) { $ret .= $this->table_content($user, $i); @@ -1337,7 +1494,7 @@ class Room { $ret = "gst.st = ".($user_cur->step+1)."; ".($remove_wagon ? sprintf("tra.rem(%d);",$table_idx) : ""); if ($from_table && ($user_cur->table == $table_idx || $user->idx_get() == $i)) { - $ret .= 'gst.st_loc++; the_end=true; window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|'; + $ret .= 'gst.st_loc++; hstm.stop(); window.onunload = null; window.onbeforeunload = null; document.location.assign("index.php");|'; // $ret .= 'gst.st_loc++; document.location.assign("index.php");|'; log_main("DOCUMENT.index.php: from table"); } @@ -1505,9 +1662,7 @@ class Room { $ret .= $this->table_content($user_cur, $table_idx); if ($user->idx_get() == $i) { - $itin = ($user->flags & USER_FLAG_AUTH ? "" : ""); - $itou = ($user->flags & USER_FLAG_AUTH ? "" : ""); - $ret .= sprintf('$("myname").innerHTML = "%s%s%s: ";', $itin, xcape($user->name), $itou); + $ret .= $user->myname_innerHTML(); } $user_cur->comm[$user_cur->step % COMM_N] = $ret; $user_cur->step_inc(); @@ -1729,7 +1884,7 @@ class Room { if ($user_cur->sess == '') continue; - if ($user_cur->name == $name_new) + if (strcasecmp($user_cur->name,$name_new) == 0) break; } if ($i < MAX_PLAYERS) { @@ -1926,7 +2081,7 @@ class Room { if ($table_cur->player_n == PLAYERS_N) { log_main("PLAYERS == N TABLE ".$table_idx); - if (($sem = Bin5::lock_data($table_idx)) != FALSE) { + if (($sem = Bin5::lock_data(TRUE, $table_idx)) != FALSE) { log_main("bin5 lock data success"); $no_recovery = FALSE; @@ -2084,7 +2239,7 @@ class Room { log_auth("XXX", sprintf("TROVATO A QUESTO PUNTO [%d] sess [%s] name [%s]", $idx, $sess, $name_new)); - /* there is another user logged with your account and you and him have authenticated => che new user + /* there is another user logged with your account and you and him have authenticated => new user get the session of the old user */ if ($ghost > -1 && $ghost_auth && ($authenticate != FALSE)) { /* swap session */ @@ -2105,7 +2260,7 @@ class Room { if ($ghost_user->stat == "table" && $this->table[$table_idx]->player_n == PLAYERS_N) { // FIXME BRISK4: include for each kind of table require_once("${G_base}briskin5/Obj/briskin5.phh"); - if (($brisem = Bin5::lock_data($table_idx)) != FALSE) { + if (($brisem = Bin5::lock_data(TRUE, $table_idx)) != FALSE) { if (($bri = Bin5::load_data($table_idx)) != FALSE) { if ($bri->the_end != TRUE) { $bri->user[$ghost_user->table_pos]->step_inc(); @@ -2176,7 +2331,7 @@ class Room { if (strcmp("", $this->user[$i]->sess) == 0) continue; - if (strcmp($this->user[$i]->name, $ghostname) == 0) { + if (strcasecmp($this->user[$i]->name, $ghostname) == 0) { $ghostname = ''; break; } @@ -2228,11 +2383,7 @@ class Room { if ($user_cur->stat == 'room') { $user_cur->comm[$user_cur->step % COMM_N] = "gst.st = ".($user_cur->step+1)."; ".$this->standup_content($user_cur); if ($user->idx_get() == $i) { - $itin = ($user->flags & USER_FLAG_AUTH ? "" : ""); - $itou = ($user->flags & USER_FLAG_AUTH ? "" : ""); - - $user_cur->comm[$user_cur->step % COMM_N] .= sprintf('$("myname").innerHTML = "%s%s%s: ";', - $itin, xcape($user->name), $itou); + $user_cur->comm[$user_cur->step % COMM_N] .= $user->myname_innerHTML(); } log_main("FROM STANDUP: NAME: ".$user_cur->name." SENDED: ".$user_cur->comm[$user_cur->step % COMM_N]); @@ -2280,6 +2431,8 @@ class Room { $room = Room::create(); + log_shme("Room::create"); + if (Room::save_data($room) == FALSE) return FALSE; @@ -2291,7 +2444,7 @@ class Room { for ($i = 0 ; $i < MAX_PLAYERS ; $i++) { if (($room->user[$i] = User::load_data($i, FALSE)) == FALSE) { - log_crit("Bin5_user::load_data failed"); + log_crit("User::load_data failed"); break; } } @@ -2326,7 +2479,7 @@ class Room { break; // log_only("PUT_VAR DI ".strlen(serialize($room))); - if (shm_put_var($shm, $tok, $room) != FALSE) { + if (@shm_put_var($shm, $tok, $room) != FALSE) { shm_detach($shm); return (TRUE); } @@ -2368,7 +2521,8 @@ class Room { break; // log_only("PUT_VAR DI ".strlen(serialize($room))); - if (shm_put_var($shm, $tok, $room) != FALSE) { + if (@shm_put_var($shm, $tok, $room) != FALSE) { + log_shme("Room::save_data"); $ret = TRUE; break; } @@ -2393,27 +2547,16 @@ class Room { return ($ret); } - static function lock_data() + static function lock_data($is_exclusive) { - GLOBAL $sess; - - // echo "LOCK: ".FTOK_PATH."/main"; - // exit; - if (($tok = @ftok(FTOK_PATH."/main", "B")) == -1) { - return (FALSE); - } - // echo "FTOK ".$tok."
"; - if (($res = sem_get($tok)) == FALSE) { - return (FALSE); - } - if (sem_acquire($res)) { + if (($res = file_lock(FTOK_PATH."/main", $is_exclusive)) != FALSE) { self::$delta_t = microtime(TRUE); log_lock("LOCK room [".self::$delta_t."]"); - + return ($res); } - else - return (FALSE); + + return (FALSE); } static function unlock_data($res) @@ -2422,7 +2565,7 @@ class Room { log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } @@ -2568,6 +2711,16 @@ function btrace_line($ar) return ($ret); } +function trace_ftok($id, $add) +{ + // NOTE: without space to use sed to substitute "= @ftok(" with "= @ftok(" + $tok=@ftok($id, $add); + + log_shme($tok.": ".$id." + ".$add); + + return ($tok); +} + function log_mop($step, $log) { GLOBAL $sess, $PHP_SELF; @@ -2583,7 +2736,7 @@ function log_mop($step, $log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LMOP) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2609,7 +2762,7 @@ function log_only2($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONL2) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2634,7 +2787,7 @@ function log_crit($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_CRIT) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2659,7 +2812,7 @@ function log_only($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_ONLY) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2684,7 +2837,7 @@ function log_main($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_MAIN) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2709,7 +2862,7 @@ function log_rd($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_READ) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2734,7 +2887,7 @@ function log_rd2($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_REA2) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2759,8 +2912,8 @@ function log_send($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SEND) == 0) return; - - if (BRISK_DEBUG & DBG_TRAC) + + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2785,7 +2938,7 @@ function log_lock($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOCK) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2810,7 +2963,7 @@ function log_wr($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_WRIT) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2835,7 +2988,7 @@ function log_load($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_LOAD) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2855,7 +3008,7 @@ function log_auth($sess, $log) if (( (BRISK_DEBUG | ($sess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_AUTH) == 0) return; - if (BRISK_DEBUG & DBG_TRAC) + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) $btrace = btrace_line(debug_backtrace()); else $btrace = ""; @@ -2865,6 +3018,32 @@ function log_auth($sess, $log) } } +function log_shme($log) +{ + GLOBAL $sess, $PHP_SELF; + + if (BRISK_SINGLE_SESS == "" && (BRISK_DEBUG & DBG_SHME) == 0) + return; + + if (isset($sess) == FALSE) + $ssess = "XXXX"; + else + $ssess = $sess; + + if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 0) + return; + + if ((BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_TRAC) + $btrace = btrace_line(debug_backtrace()); + else + $btrace = ""; + if (($fp = @fopen(LEGAL_PATH."/brisk.log", 'a')) != FALSE) { + fwrite($fp, sprintf("SHME: [%s] [%s] [%s]\n", $ssess, $log, $btrace)); + fclose($fp); + } +} + + // function log_legal($curtime, $sess, $name, $where, $mesg) function log_legal($curtime, $user, $where, $mesg) @@ -3001,67 +3180,50 @@ function sharedmem_sz($tok) class Warrant { static $delta_t; - function lock_data() + static function lock_data($is_exclusive) { - GLOBAL $sess; - - if (($tok = @ftok(FTOK_PATH."/warrant", "B")) == -1) { - return (FALSE); - } - // echo "FTOK ".$tok."
"; - if (($res = sem_get($tok)) == FALSE) { - return (FALSE); - } - if (sem_acquire($res)) { - self::$delta_t = microtime(TRUE); - log_lock("LOCK warrant [".self::$delta_t."]"); - return ($res); - } - else + if (($res = file_lock(FTOK_PATH."/warrant", $is_exclusive)) != FALSE) { + self::$delta_t = microtime(TRUE); + log_lock("LOCK warrant [".self::$delta_t."]"); + + return ($res); + } + return (FALSE); } - function unlock_data($res) + static function unlock_data($res) { GLOBAL $sess; log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } } class Poll { static $delta_t; - function lock_data() + static function lock_data($is_exclusive) { - GLOBAL $sess; - - if (($tok = @ftok(FTOK_PATH."/poll", "B")) == -1) { - return (FALSE); - } - // echo "FTOK ".$tok."
"; - if (($res = sem_get($tok)) == FALSE) { - return (FALSE); - } - if (sem_acquire($res)) { - self::$delta_t = microtime(TRUE); - log_lock("LOCK poll [".self::$delta_t."]"); - - return ($res); - } - else + if (($res = file_lock(FTOK_PATH."/poll", $is_exclusive)) != FALSE) { + self::$delta_t = microtime(TRUE); + log_lock("LOCK poll [".self::$delta_t."]"); + + return ($res); + } + return (FALSE); } - function unlock_data($res) + static function unlock_data($res) { GLOBAL $sess; log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } }