123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- /*
- * $Id$
- *
- * Copyright (C) 2006 iptelorg GmbH
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- /*
- * atomic operations init
- */
- /*
- * History:
- * --------
- * 2006-03-08 created by andrei
- * 2007-05-11 added lock_set support (andrei)
- */
- /*!
- * \file
- * \brief SIP-router core ::
- * \ingroup core
- * Module: \ref core
- */
- #include "atomic_ops_init.h"
- #include "atomic_ops.h"
- #if defined ATOMIC_OPS_USE_LOCK || defined ATOMIC_OPS_USE_LOCK_SET || \
- defined MEMBAR_USES_LOCK
- #include "locking.h"
- #endif
- #ifdef MEMBAR_USES_LOCK
- gen_lock_t* __membar_lock=0; /* init in atomic_ops.c */
- #endif
- #ifdef ATOMIC_OPS_USE_LOCK_SET
- gen_lock_set_t* _atomic_lock_set=0;
- #elif defined ATOMIC_OPS_USE_LOCK
- gen_lock_t* _atomic_lock=0;
- #endif
- /* returns 0 on success, -1 on error */
- int init_atomic_ops()
- {
-
- #ifdef MEMBAR_USES_LOCK
- if ((__membar_lock=lock_alloc())==0){
- goto error;
- }
- if (lock_init(__membar_lock)==0){
- lock_dealloc(__membar_lock);
- __membar_lock=0;
- goto error;
- }
- _membar_lock; /* start with the lock "taken" so that we can safely use
- unlock/lock sequences on it later */
- #endif
- #ifdef ATOMIC_OPS_USE_LOCK_SET
- if ((_atomic_lock_set=lock_set_alloc(_ATOMIC_LS_SIZE))==0){
- goto error;
- }
- if (lock_set_init(_atomic_lock_set)==0){
- lock_set_dealloc(_atomic_lock_set);
- _atomic_lock_set=0;
- goto error;
- }
- #elif defined ATOMIC_OPS_USE_LOCK
- if ((_atomic_lock=lock_alloc())==0){
- goto error;
- }
- if (lock_init(_atomic_lock)==0){
- lock_dealloc(_atomic_lock);
- _atomic_lock=0;
- goto error;
- }
- #endif /* ATOMIC_OPS_USE_LOCK_SET/ATOMIC_OPS_USE_LOCK */
- return 0;
- #if defined MEMBAR_USES_LOCK || defined ATOMIC_OPS_USE_LOCK || \
- defined ATOMIC_OPS_USE_LOCK_SET
- error:
- destroy_atomic_ops();
- return -1;
- #endif
- }
- void destroy_atomic_ops()
- {
- #ifdef MEMBAR_USES_LOCK
- if (__membar_lock!=0){
- lock_destroy(__membar_lock);
- lock_dealloc(__membar_lock);
- __membar_lock=0;
- }
- #endif
- #ifdef ATOMIC_OPS_USE_LOCK_SET
- if (_atomic_lock_set!=0){
- lock_set_destroy(_atomic_lock_set);
- lock_set_dealloc(_atomic_lock_set);
- _atomic_lock_set=0;
- }
- #elif defined ATOMIC_OPS_USE_LOCK
- if (_atomic_lock!=0){
- lock_destroy(_atomic_lock);
- lock_dealloc(_atomic_lock);
- _atomic_lock=0;
- }
- #endif /* ATOMIC_OPS_USE_LOCK_SET / ATOMIC_OPS_USE_LOCK*/
- }
|