- more tcp stuff (uses locking.h, hashtables, mostly untested)
[sip-router] / locking.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  *
31  *  2002-12-16 created by andrei
32  *
33  *
34 Implements:
35
36         lock_t* lock_alloc();                    - allocates a lock in shared mem.
37         lock_t* lock_init(lock_t* lock);         - inits the lock
38         void    lock_destroy(lock_t* lock);      - removes the lock (e.g sysv rmid)
39         void    lock_dealloc(lock_t* lock);      - deallocates the lock's shared m.
40         void    lock_get(lock_t* lock);          - lock (mutex down)
41         void    lock_release(lock_t* lock);      - unlock (mutex up)
42 */
43
44 #ifndef _locking_h
45 #define _locking_h
46
47
48 #ifdef FAST_LOCK
49 #include "fastlock.h"
50
51 typedef fl_lock_t lock_t;
52
53 #define lock_alloc() shm_malloc(sizeof(lock_t))
54 #define lock_destroy(lock) /* do nothing */ 
55 #define lock_dealloc(lock) shm_free(lock)
56
57 inline static lock_t* lock_init(lock_t* lock)
58 {
59         init_lock(*lock);
60         return lock;
61 }
62
63 #define lock_get(lock) get_lock(lock)
64 #define lock_release(lock) release_lock(lock)
65
66
67
68 #elif defined USE_PTHREAD_MUTEX
69 #include <pthread.h>
70
71 typedef pthread_mutex_t lock_t;
72
73 #define lock_alloc() shm_malloc(sizeof(lock_t))
74 #define lock_destroy(lock) /* do nothing */ 
75 #define lock_dealloc(lock) shm_free(lock)
76
77 inline static lock_t* lock_init(lock_t* lock)
78 {
79         if (pthread_mutex_init(lock, 0)==0) return lock;
80         else return 0;
81 }
82
83 #define lock_get(lock) pthread_mutex_lock(lock)
84 #define lock_release(lock) pthread_mutex_unlock(lock)
85
86
87
88 #elif defined USE_POSIX_SEM
89 #include <semaphore.h>
90
91 typedef sem_t lock_t;
92
93 #define lock_alloc() shm_malloc(sizeof(lock_t))
94 #define lock_destroy(lock) /* do nothing */ 
95 #define lock_dealloc(lock) shm_free(lock)
96
97 inline static lock_t* lock_init(lock_t* lock)
98 {
99         if (sem_init(lock, 1, 1)<0) return 0;
100         return lock;
101 }
102
103 #define lock_get(lock) sem_wait(lock)
104 #define lock_release(lock) sem_post(lock)
105
106
107 #elif defined USE_SYSV_SEM
108 #include <sys/ipc.h>
109 #include <sys/sem.h>
110
111 #if ((defined(HAVE_UNION_SEMUN) || defined(__GNU_LIBRARY__) )&& !defined(_SEM_SEMUN_UNDEFINED)) 
112         
113         /* union semun is defined by including sem.h */
114 #else
115         /* according to X/OPEN we have to define it ourselves */
116         union semun {
117                 int val;                      /* value for SETVAL */
118                 struct semid_ds *buf;         /* buffer for IPC_STAT, IPC_SET */
119                 unsigned short int *array;    /* array for GETALL, SETALL */
120                 struct seminfo *__buf;        /* buffer for IPC_INFO */
121         };
122 #endif
123
124 typedef int lock_t;
125
126 #define lock_alloc() shm_malloc(sizeof(lock_t))
127 #define lock_dealloc(lock) shm_free(lock)
128
129
130 inline static lock_t* lock_init(lock_t* lock)
131 {
132         union semun su;
133         
134         *lock=semget(IPC_PRIVATE, 1, 0700);
135         if (*lock==-1) return 0;
136         su.val=1;
137         if (semctl(*lock, 0, SETVAL, su)==-1){
138                 /* init error*/
139                 return 0;
140         }
141         return lock;
142 }
143
144 inline static void lock_destroy(lock_t* lock)
145 {
146         semctl(*lock, 0, IPC_RMID, (union semun)(int)0);
147 }
148
149 #define lock_dealloc(lock) shm_free(lock)
150
151 inline static void lock_get(lock_t* lock)
152 {
153         struct sembuf sop;
154
155         sop.sem_num=0;
156         sop.sem_op=-1; /* down */
157         sop.sem_flg=0; /*SEM_UNDO*/
158         semop(*lock, &sop, 1);
159 }
160
161 inline static void lock_release(lock_t* lock)
162 {
163         struct sembuf sop;
164         
165         sop.sem_num=0;
166         sop.sem_op=1; /* up */
167         sop.sem_flg=0; /* SEM_UNDO*/
168         semop(*lock, &sop, 1);
169 }
170
171 #else
172 #error "no locking method selected"
173 #endif
174
175
176 /*shm_{malloc, free}*/
177 #include "mem/mem.h"
178 #ifdef SHM_MEM
179 #include "mem/shm_mem.h"
180 #else
181 #error "locking requires shared memroy support"
182 #endif
183
184 #endif