X-Git-Url: https://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=web%2FObj%2Fbrisk.phh;h=135d2999b7b8ceaa50786bed2337db31ff04a744;hb=f6a4ad0c8fed8ed0d3bab5fba9842cf00576c028;hp=2a2d9eb6ce32740184cab74a74641d463cd18603;hpb=8fe1e432c4661ebf186026f920d778d37dbe0953;p=brisk.git diff --git a/web/Obj/brisk.phh b/web/Obj/brisk.phh index 2a2d9eb..135d299 100644 --- a/web/Obj/brisk.phh +++ b/web/Obj/brisk.phh @@ -57,6 +57,7 @@ define(BAN_TIME, 3600); define(GARBAGE_TIMEOUT, 10); define(NICKSERV, "BriskServ"); +define(LOCK_SHARE_MAX, 10000); define(DBG_ONL2, 0x0001); define(DBG_ONLY, 0x0002); @@ -71,6 +72,7 @@ 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); @@ -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.5.6"; /* 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\': (tecnica) utilizzo di locking tipo lettori/scrittori al posto del locking esclusivo generico.', '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' => ' @@ -282,6 +284,67 @@ Copyright 2006-2009 Matteo Nasta
version '.$G_brisk_version.'

Copyright 2006-2009
Matteo Nastasi (aka mop)

'); +function mop_flush() +{ + flush(); + ob_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; + + $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); +} + $escinp_from = array( "\"" ); $escinp_to = array( """ ); @@ -892,13 +955,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; @@ -928,8 +998,9 @@ class User { $shm_sz = SHM_DIMS_U_MIN; if ($shm = shm_attach($tok, $shm_sz)) { - $user = @shm_get_var($shm, $tok); - + if (($user = @shm_get_var($shm, $tok)) == FALSE) { + break; + } if ($sess != FALSE && $user->sess != $sess) { break; } @@ -944,6 +1015,7 @@ class User { log_only("PUT_VAR FALLITA ".strlen(serialize($user))); log_only(serialize($user)); } + log_shme("User::save_data2"); } else { if ($sess != FALSE) { @@ -988,10 +1060,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); } @@ -1013,13 +1088,6 @@ class User { } // 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; @@ -1073,8 +1141,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"); @@ -1086,7 +1157,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; @@ -1137,7 +1208,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"); @@ -1225,7 +1297,6 @@ class Room { // externalized $this->garbage_timeout = time() + GARBAGE_TIMEOUT; Room::garbage_time_expire_set($curtime + GARBAGE_TIMEOUT); $ismod = TRUE; - } return ($ismod); } @@ -1925,7 +1996,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; @@ -2083,7 +2154,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 */ @@ -2104,7 +2175,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(); @@ -2267,7 +2338,7 @@ class Room { $shm_sz = SHM_DIMS_MIN; if ($shm = shm_attach($tok, $shm_sz)) { - $room = @shm_get_var($shm, $tok); + $room = @shm_get_var($shm, $tok); // CHECKED BELOW log_only("bri == ".($room == FALSE ? "FALSE" : "TRUE")." bri === ".($room === FALSE ? "FALSE" : "TRUE")." bri isset ".(isset($room) ? "TRUE" : "FALSE")); if (isset($room)) @@ -2279,6 +2350,8 @@ class Room { $room = Room::create(); + log_shme("Room::create"); + if (Room::save_data($room) == FALSE) return FALSE; @@ -2325,7 +2398,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); } @@ -2367,7 +2440,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; } @@ -2392,27 +2466,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) @@ -2421,7 +2484,7 @@ class Room { log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } @@ -2567,6 +2630,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; @@ -2864,6 +2937,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 & 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) @@ -3000,67 +3099,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); } }