blob: bd6fbd078f778d5e7f45ee3bcbac1c856fb7a97e [file] [log] [blame]
/*
* Copyright 2003 Sun Microsystems, Inc.
* Copyright 2010 Google, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This was open sourced by Sun Microsystems, which got it via Cobalt
* Networks. It has been fairly extensively modified since then.
*/
#ifndef CSEM_H__
#define CSEM_H__
#include <sys/ipc.h>
#include <time.h>
/* create a private key */
#define CSEM_PRIVATE IPC_PRIVATE
/*
* Create a new semaphore with the specified key, initialized to the
* specified value. If the key is CSEM_PRIVATE, a new private semaphore
* is allocated.
*
* Returns the sempahore ID (>= 0) on success.
* Returns < 0 on error, or if the key already exists.
*/
extern int csem_create(key_t key, unsigned val);
/*
* Fetch an existing semaphore with the specified key.
*
* Returns the sempahore ID (>= 0) on success.
* Returns < 0 on error, or if the key does not exist.
*/
extern int csem_get(key_t key);
/*
* Fetch or create a semaphore with the specified key. If the semaphore
* did not exist, it will be created with the specified value.
*
* Returns the sempahore ID (>= 0) on success.
* Returns < 0 on error.
*/
extern int csem_get_or_create(key_t key, unsigned val);
/*
* Destroy the semaphore.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_destroy(int sem_id);
/*
* Get the value of the semaphore.
*
* Returns the value (>= 0) on success.
* Returns < 0 on error.
*/
extern int csem_getval(int sem_id);
/*
* Set the value of the semaphore.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_setval(int sem_id, unsigned val);
/*
* Increment the semaphore.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_up(int sem_id);
/*
* Increment the semaphore. This operation will be undone when the
* process terminates.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_up_undo(int sem_id);
/*
* Decrement the semaphore, or block if sem == 0.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_down(int sem_id);
/*
* Decrement the semaphore, or block if sem == 0. This operation will be
* undone when the process terminates.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_down_undo(int sem_id);
/*
* Decrement the semaphore, or block with a timeout if sem == 0.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_down_timeout(int sem_id, struct timespec *timeout);
/*
* Decrement the semaphore, or block with a timeout if sem == 0. This
* operation will be undone when the process terminates.
*
* Returns 0 on success.
* Returns < 0 on error.
*/
extern int csem_down_timeout_undo(int sem_id, struct timespec *timeout);
/*
* Get the timestamp of the last csem_up()/csem_down() call.
*
* Returns sem_otime on success.
* Returns < 0 on error
*/
extern time_t csem_get_otime(int sem_id);
#endif /* CSEM_H__ */
/*
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for use
* in the design, construction, operation or maintenance of any nuclear
* facility.
*/