nowait.phpt   [plain text]


--TEST--
sem_acquire with nowait
--SKIPIF--
<?php // vim600: ts=4 sw=4 syn=php fdm=marker
if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
	die("skip sysvsem and pcntl required");
}
?>
--FILE--
<?php
$SEMKEY	= ftok(__FILE__, 'P');  //  Semaphore key

$pid = pcntl_fork();

if ($pid) {
	echo "Parent.\n";

	pcntl_signal(SIGCHLD, SIG_IGN);

	// Get semaphore
	$sem_id = sem_get($SEMKEY, 1);
	if ($sem_id === FALSE) {
		echo "P: fail to get semaphore";
		exit;
	}
	echo "P: got semaphore $sem_id.\n";

	register_shutdown_function(function () use ($sem_id) {
		echo "P: cleanup.\n";
		sem_remove($sem_id);
	});
  
	// Acquire semaphore
	if (! sem_acquire($sem_id)) {
		echo "P: fail to acquire semaphore $sem_id.\n";
		sem_remove($sem_id);
		exit;
	}
	echo "P: success acquire semaphore $sem_id.\n";

	usleep(20000);

	echo "P: releases.\n";
	sem_release($sem_id);

	usleep(5000);

	// Acquire semaphore
	if (! sem_acquire($sem_id)) {
		echo "P: fail to acquire semaphore $sem_id.\n";
		sem_remove($sem_id);
		exit;
	}
	echo "P: success acquire semaphore $sem_id.\n";

	$status = null;
	pcntl_waitpid($pid, $status);

} else {
	usleep(10000);
	echo "Child.\n";

	// Get semaphore
	$sem_id = sem_get($SEMKEY, 1);
	if ($sem_id === FALSE) {
		echo "C: fail to get semaphore";
		exit;
	}
	echo "C: got semaphore $sem_id.\n";
  
	// Acquire semaphore
	if (! sem_acquire($sem_id)) {
		echo "C: fail to acquire semaphore $sem_id.\n";
		exit;
	}
	echo "C: success acquire semaphore $sem_id.\n";

	echo "C: releases.\n";
	sem_release($sem_id);

	usleep(10000);

	// Acquire semaphore
	if (! sem_acquire($sem_id, true)) {
		echo "C: fail to acquire semaphore $sem_id.\n";
		exit;
	}
	echo "C: success acquire semaphore $sem_id.\n";
}

?>
--EXPECTF--
Parent.
P: got semaphore Resource id #%i.
P: success acquire semaphore Resource id #%i.
Child.
C: got semaphore Resource id #%i.
P: releases.
C: success acquire semaphore Resource id #%i.
C: releases.
P: success acquire semaphore Resource id #%i.
C: fail to acquire semaphore Resource id #%i.
P: cleanup.