X-Git-Url: https://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=web%2FObj%2Fbrisk.phh;h=f0e412b4ba502d94d2448d5593bdd71472e9c7d1;hb=6c5739418252ed58e037c78dc88171fee448d776;hp=8b126412119aa64766e1ebd9adc072aea3bd00dd;hpb=78f44060729d1f0c82a396aab1d05cbb75226d2d;p=brisk.git diff --git a/web/Obj/brisk.phh b/web/Obj/brisk.phh index 8b12641..f0e412b 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); @@ -135,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.5"; +$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\': quinta 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' => ' @@ -283,6 +284,70 @@ 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); +} + $escinp_from = array( "\"" ); $escinp_to = array( """ ); @@ -1083,6 +1148,7 @@ class Room { return ($ismod); } + webservers_check(); // FIXME BRISK4: include for each kind of table require_once("${G_base}briskin5/Obj/briskin5.phh"); @@ -1094,7 +1160,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; @@ -1736,7 +1802,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) { @@ -1933,7 +1999,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; @@ -2091,7 +2157,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 */ @@ -2112,7 +2178,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(); @@ -2183,7 +2249,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; } @@ -2300,7 +2366,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; } } @@ -2403,27 +2469,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) @@ -2432,7 +2487,7 @@ class Room { log_lock("UNLOCK room [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } @@ -2603,7 +2658,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 = ""; @@ -2629,7 +2684,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 = ""; @@ -2654,7 +2709,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 = ""; @@ -2679,7 +2734,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 = ""; @@ -2704,7 +2759,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 = ""; @@ -2729,7 +2784,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 = ""; @@ -2754,7 +2809,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 = ""; @@ -2779,8 +2834,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 = ""; @@ -2805,7 +2860,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 = ""; @@ -2830,7 +2885,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 = ""; @@ -2855,7 +2910,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 = ""; @@ -2875,7 +2930,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 = ""; @@ -2900,7 +2955,7 @@ function log_shme($log) if (( (BRISK_DEBUG | ($ssess == BRISK_SINGLE_SESS ? BRISK_SINGLE_DEBUG : 0) ) & DBG_SHME) == 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 = ""; @@ -3047,23 +3102,15 @@ function sharedmem_sz($tok) class Warrant { static $delta_t; - static 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); } @@ -3073,31 +3120,22 @@ class Warrant { log_lock("UNLOCK warrant [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } } class Poll { static $delta_t; - static 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); } @@ -3107,7 +3145,7 @@ class Poll { log_lock("UNLOCK poll [".(microtime(TRUE) - (self::$delta_t))."]"); - return (sem_release($res)); + file_unlock($res); } }