Skip to content

Commit

Permalink
Merge pull request #27 from JanVoracek/directory-lock
Browse files Browse the repository at this point in the history
Added lock implementor that uses mkdir
  • Loading branch information
arvenil committed May 31, 2016
2 parents 102d2ec + 7bc8d88 commit 8c0f5d1
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 0 deletions.
90 changes: 90 additions & 0 deletions src/NinjaMutex/Lock/DirectoryLock.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php
/**
* This file is part of ninja-mutex.
*
* (C) Kamil Dziedzic <arvenil@klecza.pl>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace NinjaMutex\Lock;

/**
* Lock implementor using mkdir
*
* @author Jan Voracek <jan@voracek.net>
*/
class DirectoryLock extends LockAbstract
{
protected $dirname;

/**
* @param string $dirname
*/
public function __construct($dirname)
{
parent::__construct();

$this->dirname = $dirname;
}

/**
* @param string $name
* @param bool $blocking
* @return bool
*/
protected function getLock($name, $blocking)
{
while (!@mkdir($this->getDirectoryPath($name))) {
if (!$blocking) {
return false;
}

usleep(rand(5000, 20000));
}

return true;
}

/**
* Release lock
*
* @param string $name name of lock
* @return bool
*/
public function releaseLock($name)
{
if (isset($this->locks[$name])) {
rmdir($this->getDirectoryPath($name));
unset($this->locks[$name]);

return true;
}

return false;
}

/**
* @param string $name
* @return string
*/
protected function getDirectoryPath($name)
{
return $this->dirname . DIRECTORY_SEPARATOR . $name . '.lock';
}

/**
* Check if lock is locked
*
* @param string $name name of lock
* @return bool
*/
public function isLocked($name)
{
if ($this->acquireLock($name, false)) {
return !$this->releaseLock($name);
}

return true;
}
}
19 changes: 19 additions & 0 deletions tests/NinjaMutex/AbstractTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*/
namespace NinjaMutex;

use NinjaMutex\Lock\DirectoryLock;
use NinjaMutex\Lock\FlockLock;
use NinjaMutex\Lock\MemcacheLock;
use NinjaMutex\Lock\MemcachedLock;
Expand Down Expand Up @@ -62,13 +63,15 @@ public function lockImplementorProvider()
$data = array(
// Just mocks
$this->provideFlockMockLock(),
$this->provideDirectoryMockLock(),
$this->provideMemcacheMockLock(),
$this->provideMemcachedMockLock(),
$this->provideMysqlMockLock(),
$this->providePredisRedisMockLock(),
$this->providePhpRedisMockLock(),
// Real locks
$this->provideFlockLock(),
$this->provideDirectoryLock(),
array($memcacheLockFabric->create()),
array($memcachedLockFabric->create()),
$this->provideMysqlLock(),
Expand Down Expand Up @@ -139,6 +142,14 @@ protected function provideFlockMockLock()
return array(new FlockLock(vfs\vfsStream::url('nfs/')));
}

/**
* @return array
*/
protected function provideDirectoryMockLock()
{
return array(new DirectoryLock(vfs\vfsStream::url('nfs/')));
}

/**
* @return array
*/
Expand Down Expand Up @@ -175,6 +186,14 @@ protected function provideFlockLock()
return array(new FlockLock('/tmp/mutex/'));
}

/**
* @return array
*/
protected function provideDirectoryLock()
{
return array(new DirectoryLock('/tmp/mutex/'));
}

/**
* @return array
*/
Expand Down

0 comments on commit 8c0f5d1

Please sign in to comment.