X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?p=php5-apc.git;a=blobdiff_plain;f=apc_sem.c;fp=apc_sem.c;h=0000000000000000000000000000000000000000;hp=e76ca2025e07cdb15f056c7d25adb5dc3480e29b;hb=a34ea625346aecd2d2b227b8ca4f114eaa607213;hpb=b0895ef8074c6dd090f9b0a65d58179941541756 diff --git a/apc_sem.c b/apc_sem.c deleted file mode 100644 index e76ca20..0000000 --- a/apc_sem.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | APC | - +----------------------------------------------------------------------+ - | Copyright (c) 2008 The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | http://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Daniel Cowgill | - +----------------------------------------------------------------------+ - - This software was contributed to PHP by Community Connect Inc. in 2002 - and revised in 2005 by Yahoo! Inc. to add support for PHP 5.1. - Future revisions and derivatives of this source code must acknowledge - Community Connect Inc. as the original contributor of this module by - leaving this note intact in the source code. - - All other licensing and usage conditions are those of the PHP Group. - - */ - -/* $Id: apc_sem.c,v 3.16.2.1 2008/05/11 18:57:00 rasmus Exp $ */ - -#include "apc_sem.h" -#include "apc.h" -#include "php.h" -#include -#include -#include -#include -#include - -#if HAVE_SEMUN -/* we have semun, no need to define */ -#else -#undef HAVE_SEMUN -union semun { - int val; /* value for SETVAL */ - struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ - unsigned short *array; /* array for GETALL, SETALL */ - /* Linux specific part: */ - struct seminfo *__buf; /* buffer for IPC_INFO */ -}; -#define HAVE_SEMUN 1 -#endif - -#ifndef SEM_R -# define SEM_R 0444 -#endif -#ifndef SEM_A -# define SEM_A 0222 -#endif - -/* always use SEM_UNDO, otherwise we risk deadlock */ -#define USE_SEM_UNDO - -#ifdef USE_SEM_UNDO -# define UNDO SEM_UNDO -#else -# define UNDO 0 -#endif - -int apc_sem_create(const char* pathname, int proj, int initval) -{ - int semid; - int perms; - union semun arg; - key_t key; - - perms = 0777; - - key = IPC_PRIVATE; - if (pathname != NULL) { - if ((key = ftok(pathname, proj)) < 0) { - apc_eprint("apc_sem_create: ftok(%s,%d) failed:", pathname, proj); - } - } - - if ((semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms)) >= 0) { - /* sempahore created for the first time, initialize now */ - arg.val = initval; - if (semctl(semid, 0, SETVAL, arg) < 0) { - apc_eprint("apc_sem_create: semctl(%d,...) failed:", semid); - } - } - else if (errno == EEXIST) { - /* sempahore already exists, don't initialize */ - if ((semid = semget(key, 1, perms)) < 0) { - apc_eprint("apc_sem_create: semget(%u,...) failed:", key); - } - /* insert here */ - } - else { - apc_eprint("apc_sem_create: semget(%u,...) failed:", key); - } - - return semid; -} - -void apc_sem_destroy(int semid) -{ - /* we expect this call to fail often, so we do not check */ - union semun arg; - semctl(semid, 0, IPC_RMID, arg); -} - -void apc_sem_lock(int semid) -{ - struct sembuf op; - - op.sem_num = 0; - op.sem_op = -1; - op.sem_flg = UNDO; - - if (semop(semid, &op, 1) < 0) { - if (errno != EINTR) { - apc_eprint("apc_sem_lock: semop(%d) failed:", semid); - } - } -} - -void apc_sem_unlock(int semid) -{ - struct sembuf op; - - op.sem_num = 0; - op.sem_op = 1; - op.sem_flg = UNDO; - - if (semop(semid, &op, 1) < 0) { - if (errno != EINTR) { - apc_eprint("apc_sem_unlock: semop(%d) failed:", semid); - } - } -} - -void apc_sem_wait_for_zero(int semid) -{ - struct sembuf op; - - op.sem_num = 0; - op.sem_op = 0; - op.sem_flg = UNDO; - - if (semop(semid, &op, 1) < 0) { - if (errno != EINTR) { - apc_eprint("apc_sem_waitforzero: semop(%d) failed:", semid); - } - } -} - -int apc_sem_get_value(int semid) -{ - union semun arg; - unsigned short val[1]; - - arg.array = val; - if (semctl(semid, 0, GETALL, arg) < 0) { - apc_eprint("apc_sem_getvalue: semctl(%d,...) failed:", semid); - } - return val[0]; -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: expandtab sw=4 ts=4 sts=4 fdm=marker - * vim<600: expandtab sw=4 ts=4 sts=4 - */