Implementation of a read-write semaphore in PHP:
constREAD_ACCESS=0;
constWRITE_ACCESS=1;/**
* @access private
* @var resource - mutex semaphore
*/private$mutex;/**
* @access private
* @var resource - read/write semaphore
*/private$resource;/**
* @access private
* @var int
*/private$writers=0;/**
* @access private
* @var int
*/private$readers=0;/**
* Default constructor
*
* Initialize the read/write semaphore
*/public function__construct() {$mutex_key=ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php','m');$resource_key=ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php','r');$this->mutex=sem_get($mutex_key,1);$this->resource=sem_get($resource_key,1);
}/**
* Destructor
*
* Remove the read/write semaphore
*/public function__destruct() {sem_remove($this->mutex);sem_remove($this->resource);
}/**
* Request acess to the resource
*
* @param int $mode
* @return void
*/private functionrequest_access($access_type=self::READ_ACCESS) {
if ($access_type==self::WRITE_ACCESS) {sem_acquire($this->mutex);/* update the writers counter */$this->writers++;sem_release($this->mutex);sem_acquire($this->resource);
} else {sem_acquire($this->mutex);
if ($this->writers>0$this->readers==0) {sem_release($this->mutex);sem_acquire($this->resource);sem_acquire($this->mutex);
}/* update the readers counter */$this->readers++;sem_release($this->mutex);
}
}
private functionrequest_release($access_type=self::READ_ACCESS) {
if ($access_type==self::WRITE_ACCESS) {sem_acquire($this->mutex);/* update the writers counter */$this->writers--;sem_release($this->mutex);sem_release($this->resource);
} else {sem_acquire($this->mutex);/* update the readers counter */$this->readers--;
if ($this->readers==0)sem_release($this->resource);sem_release($this->mutex);
}
}/**
* Request read access to the resource
*
* @return void
*/public functionread_access() {$this->request_access(self::READ_ACCESS); }/**
* Release read access to the resource
*
* @return void
*/public functionread_release() {$this->request_release(self::READ_ACCESS); }/**
* Request write access to the resource
*
* @return void
*/public functionwrite_access() {$this->request_access(self::WRITE_ACCESS); }/**
* Release write access to the resource
*
* @return void
*/public functionwrite_release() {$this->request_release(self::WRITE_ACCESS); }
}?>