[spip-commit] inc_flock.php3 inc_invalideur.php3 1.4 1.11 1.5 1.12

From : fil@... , the 28th septembre 2004 21:12
  • 2004-09-28 21:12:58 — fil@... - [spip-commit] inc_flock.php3 inc_invalideur.php3 1.4 1.11 1.5 1.12

Update of /home/spip-cvs/spip/ecrire In directory alan:/tmp/cvs-serv20443/ecrire Modified Files: inc_flock.php3 inc_invalideur.php3  Log Message: retour � un flock() moins improbable Index: inc_flock.php3 =================================================================== RCS file: /home/spip-cvs/spip/ecrire/inc_flock.php3,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- inc_flock.php3 14 Sep 2004 22:43:51 -0000 1.4 +++ inc_flock.php3 28 Sep 2004 21:12:56 -0000 1.5 @@ -5,88 +5,7 @@  if (defined("_ECRIRE_INC_FLOCK")) return;  define("_ECRIRE_INC_FLOCK", "1");   -// flock() marche dans ce repertoire  j'ai le droit de flock() sur ce fichier -if (LOCK_UN!=3) { - define ('LOCK_SH', 1); - define ('LOCK_EX', 2); - define ('LOCK_UN', 3); - define ('LOCK_NB', 4); -} - -function test_flock ($fichier, $ecriture = false) { - static $flock = array(); - global $flag_flock; - if (!$flag_flock) - return false; - - preg_match('|(.*)/([^/]*)$|', $fichier, $match); - $dir = $match[1]; - if ($dir == '') - return false; // a la racine on ne fait que lire - - // premier appel pour ce $dir ? - if (!isset($flock[$dir])) { - // si un fichier d'etat flock est la et pas trop vieux -- id est: - // pas recopie depuis une autre installation ! -- c'est ok. - if (@file_exists("$dir/.flock_ok") - AND (filemtime("$dir/.flock_ok") > time() - 3600)) - $flock[$dir] = true; - else if (@file_exists("$dir/.flock_naze") - AND (filemtime("$dir/.flock_naze") > time() - 3600)) - $flock[$dir] = false; - - // pas d'infos de flock, on va tester - // MAIS attention on ne veut effectivement - // tester que les repertoires dans lesquels on ecrit - // Si on ne fait qu'y lire, pas necessaire (et pas - // forcement autorise) - else if ($ecrire) { - $fichiertest = $dir.'/' - .substr(uniqid(@getmypid(), true),-6).".tmp"; - if ($fp = @fopen($fichiertest, 'w')) { - if (@flock($fp, LOCK_SH)) { - @flock($fp, LOCK_UN); - $flock[$dir] = true; - @touch("$dir/.flock_ok"); - @unlink("$dir/.flock_naze"); - @fclose($fp); - spip_log("test $dir: flock ok"); - } else { - $flock[$dir] = false; - @touch("$dir/.flock_naze"); - @unlink("$dir/.flock_ok"); - spip_log("test $dir: flock naze"); - } - @unlink($fichiertest); - } else { - spip_log("test $dir: echec du test sur $fichiertest !"); - @touch("$dir/.flock_naze"); - @unlink("$dir/.flock_ok"); - } - } else - $flock[$dir] = false; - } - - return $flock[$dir]; -} - -// Si flock ne marche pas dans ce repertoire ou chez cet hebergeur, -// on renvoie OK pour ne pas bloquer -function spip_flock($filehandle, $mode, $fichier, $ecriture = false) { - if (!test_flock($fichier, $ecriture)) - return true; - - $r = flock($filehandle, $mode); - - // demande de verrou ==> risque de sleep ==> forcer la relecture de l'etat - if ($mode == LOCK_EX) - clearstatcache(); - - return $r; -} -  function spip_file_get_contents ($fichier) { -   if (substr($fichier, -3) != '.gz') {   if (function_exists('file_get_contents')   AND $GLOBALS['os_serveur'] !='windows') # windows retourne '' @@ -95,7 +14,6 @@   return join('', @file($fichier));   } else   return join('', @gzfile($fichier)); -  }    // options = array( @@ -111,7 +29,7 @@   if ($fl = @fopen($fichier, 'r')) {     // verrou lecture - while (!spip_flock($fl, LOCK_SH, $fichier)); + @flock($fl, LOCK_SH);     // a-t-il ete supprime par le locker ?   if (!@file_exists($fichier)) { @@ -123,7 +41,7 @@   $contenu = spip_file_get_contents($fichier);     // liberer le verrou - spip_flock($fl, LOCK_UN, $fichier); + @flock($fl, LOCK_UN);   @fclose($fl);     // Verifications @@ -158,7 +76,7 @@     // verrouiller le fichier destination   if ($fp = @fopen($fichier, 'a')) - while (!spip_flock($fp, LOCK_EX, $fichier, 'ecriture')); + @flock($fp, LOCK_EX);   else   return false;   @@ -176,7 +94,7 @@   #spip_log("$fputs $fichier ".spip_timer('ecrire_fichier'));     // liberer le verrou et fermer le fichier - spip_flock($fp, LOCK_UN, $fichier); + @flock($fp, LOCK_UN);   @fclose($fp);     return $ok; @@ -190,22 +108,17 @@   return;     // verrouiller le fichier destination - if ($flock = test_flock($fichier, 'ecriture')) { - if ($fp = @fopen($fichier, 'a')) - while (!spip_flock($fp, LOCK_EX, $fichier)); - else - return; - } + if ($fp = @fopen($fichier, 'a')) + @flock($fp, LOCK_EX); + else + return;     // supprimer   @unlink($fichier); - - // liberer le verrou - if ($flock) { - spip_flock($fp, LOCK_UN, $fichier); - @fclose($fp); - }   + // liberer le verrou + @flock($fp, LOCK_UN); + @fclose($fp);  }    ?> Index: inc_invalideur.php3 =================================================================== RCS file: /home/spip-cvs/spip/ecrire/inc_invalideur.php3,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- inc_invalideur.php3 28 Aug 2004 21:06:57 -0000 1.11 +++ inc_invalideur.php3 28 Sep 2004 21:12:56 -0000 1.12 @@ -62,7 +62,7 @@   if (preg_match(   "|^CACHE(/[0-9a-f])?(/[0-9]+)?/[^.][\-_\%0-9a-z]+\.[0-9a-f]+(\.gz)?$|i",   $cache)) { - // supprimer le fichier (avec spip_flock) + // supprimer le fichier (de facon propre)   supprimer_fichier($cache);   // et le fichier compagnon s'il existe   @unlink($cache.'.NEW');