Makefile.defs: version set 3.4.0-dev2
[sip-router] / lock_alloc.h
1 /* $Id$ */
2 /*
3  *
4  * Copyright (C) 2001-2003 FhG Fokus
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License 
24  * along with this program; if not, write to the Free Software 
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27
28 /*
29  *   ser locking library
30  *   WARNING: don't include this directly include instead locking.h!
31  * History:
32  * --------
33  *  2003-03-06  created by andrei (contains parts of the original locking.h)
34  *  2003-03-17  fixed cast warning in shm_free (forced to void*) (andrei)
35  *  2004-07-28  s/lock_set_t/gen_lock_set_t/ because of a type conflict
36  *              on darwin (andrei)
37  *
38 Implements: (see also locking.h)
39
40         simple locks:
41         -------------
42         gen_lock_t* lock_alloc();                - allocates a lock in shared mem.
43         void    lock_dealloc(gen_lock_t* lock);  - deallocates the lock's shared m.
44         
45         lock sets: [implemented only for FL & SYSV so far]
46         ----------
47         gen_lock_set_t* lock_set_alloc(no)               - allocs a lock set in shm.
48         void lock_set_dealloc(gen_lock_set_t* s);        - deallocs the lock set shm.
49
50 */
51
52 #ifndef _lock_alloc_h
53 #define _lock_alloc_h
54
55 /*shm_{malloc, free}*/
56 #include "mem/mem.h"
57 #ifdef SHM_MEM
58 #include "mem/shm_mem.h"
59 #else
60 #error "locking requires shared memory support"
61 #endif
62
63 #if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM)
64 /* simple locks*/
65 #define lock_alloc() shm_malloc(sizeof(gen_lock_t))
66 #define lock_dealloc(lock) shm_free((void*)lock)
67 /* lock sets */
68
69 inline static gen_lock_set_t* lock_set_alloc(int n)
70 {
71         gen_lock_set_t* ls;
72         ls=(gen_lock_set_t*)shm_malloc(sizeof(gen_lock_set_t)+n*sizeof(gen_lock_t));
73         if (ls==0){
74                 LOG(L_CRIT, "ERROR: lock_set_alloc (FL): could not allocate lock_set\n");
75         }else{
76                 ls->locks=(gen_lock_t*)((char*)ls+sizeof(gen_lock_set_t));
77                 ls->size=n;
78         }
79         return ls;
80 }
81
82 #define lock_set_dealloc(lock_set) shm_free((void*)lock_set)
83
84 #elif defined USE_SYSV_SEM
85
86 /*simple locks*/
87 #define lock_alloc() shm_malloc(sizeof(gen_lock_t))
88 #define lock_dealloc(lock) shm_free((void*)lock)
89 /* lock sets */
90
91 inline static gen_lock_set_t* lock_set_alloc(int n)
92 {
93         gen_lock_set_t* ls;
94         ls=(gen_lock_set_t*)shm_malloc(sizeof(gen_lock_set_t));
95         if (ls){
96                 ls->size=n;
97                 ls->semid=-1;
98         };
99         return ls;
100 }
101
102
103 #define lock_set_dealloc(lock_set) shm_free((void*)lock_set)
104
105
106 #else
107 #error "no locking method selected"
108 #endif
109
110
111 #endif