X-Git-Url: http://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;ds=inline;f=web%2FObj%2Fbrisk.phh;h=3bbb37d93fb3f4781e09e1245b0bdd5d03412347;hb=ae53188392e4dfbe044cf9d9a33e07697358d212;hp=a5bec276d13ecb9383ac991c12b105c4e2427932;hpb=ff3c49ff3cbad45961f1a8d5264f587598134556;p=brisk.git
diff --git a/web/Obj/brisk.phh b/web/Obj/brisk.phh
index a5bec27..3bbb37d 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.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' => '
@@ -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);
}
@@ -3047,67 +3102,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);
}
}