mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-28 02:35:28 +00:00
Basically re-use the gec lock code from flashrom package.
BUG=chrome-os-partner:12319
TEST=Build and run on link. Only build on snow.
while true; do ectool hello; done & ; run 10 instances.
; expect all instances runs okay.
Signed-off-by: Louis Yung-Chieh Lo <yjlou@chromium.org>
Change-Id: I11d5824f46810c6f5a04a564a81387cdea081697
Reviewed-on: https://gerrit.chromium.org/gerrit/29763
Reviewed-by: Randall Spangler <rspangler@chromium.org>
155 lines
4.3 KiB
C
155 lines
4.3 KiB
C
/*
|
|
* 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.
|
|
*
|
|
* Developer's note: 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__ */
|