Changeset 11171

Show
Ignore:
Timestamp:
05/05/08 19:01:53 (6 years ago)
Author:
bto
Message:

invalidなロックをアンロックするときに、ちゃんとクリティカルセクションに閉じ込めた

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/php/misc/single_execution.php

    r11169 r11171  
    6363        } 
    6464 
     65        $this->unlockIfInvalid($key); 
     66 
    6567        $lock_directory = $this->lockDirectory($key); 
    66  
    67         if (!$this->isInvalidLock($lock_directory)) { 
    68             $this->unlock($key); 
    69         } 
    7068 
    7169        if (!$this->mkdir($lock_directory)) { 
     
    154152        $this->unlock($this->key); 
    155153        exit; 
     154    } 
     155 
     156    function unlockIfInvalid($key) 
     157    { 
     158        $common_key = 'common'; 
     159 
     160        // spin lock 
     161        $common_lock = $this->lockDirectory($common_key); 
     162        while (!$this->mkdir($common_lock)) { 
     163            usleep(10000); 
     164        } 
     165 
     166        // critical section 
     167        if (!$this->isInvalidLock($this->lockDirectory($key))) { 
     168            $this->unlock($key); 
     169        } 
     170 
     171        // unlock 
     172        $this->unlock($common_key); 
    156173    } 
    157174