2 Commits
0.1.2 ... 0.1.3

Author SHA1 Message Date
4652e464b9 Semaphores fully implemented 2018-04-15 20:48:22 +02:00
612cfc2035 Bugfixed SharedMemoryBlock, added tests 2018-04-15 20:31:35 +02:00
5 changed files with 67 additions and 7 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
/vendor/
/composer.lock
/doc

View File

@ -8,18 +8,25 @@ use NoccyLabs\Ipc\Key\KeyInterface;
class Semaphore
{
public function __construct(KeyInterface $key, int $max)
{
protected $resource;
public function __construct(KeyInterface $key, int $max, $perm = 0660, $autorelease = 1)
{
$this->resource = sem_get($key->getKey(), $max, $perm, $autorelease);
}
public function acquire(float $timeout)
public function destroy()
{
sem_remove($this->resource);
}
public function release()
public function acquire(float $timeout = 0):bool
{
return sem_acquire($this->resource, true);
}
public function release():bool
{
return sem_release($this->resource);
}
}

View File

@ -29,7 +29,7 @@ class SharedMemoryBlock
*/
public function __construct(KeyInterface $key, string $flags, int $memsize, int $perm = 0666)
{
if (!($shm_resource = shmop_open($key->getKey(), $memsize, $perm))) {
if (!($shm_resource = shmop_open($key->getKey(), $flags, $perm, $memsize))) {
throw new \RuntimeException("Unable to attach shm resource {$key}");
}

View File

@ -0,0 +1,27 @@
<?php
namespace NoccyLabs\Ipc\Sem;
use NoccyLabs\Ipc\Key\FileKey;
class SemaphoreTest extends \PhpUnit\Framework\TestCase
{
public function testCreatingAndAquiringSemaphore()
{
$key = new FileKey(__FILE__);
$sem = new Semaphore($key, 2);
$this->assertTrue($sem->acquire());
$this->assertTrue($sem->acquire());
$this->assertFalse($sem->acquire());
$this->assertTrue($sem->release());
$this->assertTrue($sem->acquire());
$this->assertFalse($sem->acquire());
$this->assertTrue($sem->release());
$this->assertTrue($sem->release());
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace NoccyLabs\Ipc\Shm;
use NoccyLabs\Ipc\Key\FileKey;
class SharedMemoryBlockTest extends \PhpUnit\Framework\TestCase
{
public function testWritingAndReading()
{
$key = new FileKey(__DIR__);
$shm = new SharedMemoryBlock($key, SharedMemoryBlock::FLAG_CREATE, 64);
$this->assertEquals(11, $shm->write("Hello World", 0));
$this->assertEquals("Hello World", $shm->read(11, 0));
$this->assertEquals(3, $shm->write("foo", 2));
$this->assertEquals("Hefoo World", $shm->read(11, 0));
$shm->destroy();
}
}