GPLization banner introduced to *.[hc] files
[sip-router] / mem / shm_mem.h
1 /* $Id$*
2  *
3  * shared mem stuff
4  *
5  * Copyright (C) 2001-2003 Fhg Fokus
6  *
7  * This file is part of ser, a free SIP server.
8  *
9  * ser is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version
13  *
14  * For a license to use the ser software under conditions
15  * other than those described here, or to purchase support for this
16  * software, please contact iptel.org by e-mail at the following addresses:
17  *    info@iptel.org
18  *
19  * ser is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License 
25  * along with this program; if not, write to the Free Software 
26  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27  */
28
29
30 #ifdef SHM_MEM
31
32 #ifndef shm_mem_h
33 #define shm_mem_h
34
35 #include <string.h>
36 #include <errno.h>
37 #include <sys/types.h>
38 #include <sys/ipc.h>
39
40 #ifndef SHM_MMAP
41
42 #include <sys/shm.h>
43
44 #endif
45
46 #include <sys/sem.h>
47 #include <string.h>
48 #include <errno.h>
49
50
51
52 #include "../dprint.h"
53
54 #ifdef VQ_MALLOC
55 #       include "vq_malloc.h"
56         extern struct vqm_block* shm_block;
57 #       define MY_MALLOC vqm_malloc
58 #       define MY_FREE vqm_free
59 #       define MY_STATUS vqm_status
60 #elif defined F_MALLOC
61 #       include "f_malloc.h"
62         extern struct fm_block* shm_block;
63 #       define MY_MALLOC fm_malloc
64 #       define MY_FREE fm_free
65 #       define MY_STATUS fm_status
66 #else
67 #       include "q_malloc.h"
68         extern struct qm_block* shm_block;
69 #       define MY_MALLOC qm_malloc
70 #       define MY_FREE qm_free
71 #       define MY_STATUS qm_status
72 #endif
73
74 #ifdef FAST_LOCK
75 #include "../fastlock.h"
76         
77         extern fl_lock_t* mem_lock;
78 #else
79 extern  int shm_semid;
80 #endif
81
82
83 int shm_mem_init();
84 void shm_mem_destroy();
85
86
87 #ifdef FAST_LOCK
88
89 #define shm_lock()    get_lock(mem_lock)
90 #define shm_unlock()  release_lock(mem_lock)
91
92 #else
93 /* inline functions (do not move them to *.c, they won't be inlined anymore) */
94 static inline void shm_lock()
95 {
96
97         struct sembuf sop;
98         int ret;
99         
100         sop.sem_num=0;
101         sop.sem_op=-1; /*down*/
102         sop.sem_flg=0 /*SEM_UNDO*/;
103 again:
104         ret=semop(shm_semid, &sop, 1);
105
106         switch(ret){
107                 case 0: /*ok*/
108                         break;
109                 case EINTR: /*interrupted by signal, try again*/
110                         DBG("sh_lock: interrupted by signal, trying again...\n");
111                         goto again;
112                 default:
113                         LOG(L_ERR, "ERROR: sh_lock: error waiting on semaphore: %s\n",
114                                         strerror(errno));
115         }
116 }
117
118
119
120 static inline void shm_unlock()
121 {
122         struct sembuf sop;
123         int ret;
124         
125         sop.sem_num=0;
126         sop.sem_op=1; /*up*/
127         sop.sem_flg=0 /*SEM_UNDO*/;
128 again:
129         ret=semop(shm_semid, &sop, 1);
130         /*should ret immediately*/
131         switch(ret){
132                 case 0: /*ok*/
133                         break;
134                 case EINTR: /*interrupted by signal, try again*/
135                         DBG("sh_lock: interrupted by signal, trying again...\n");
136                         goto again;
137                 default:
138                         LOG(L_ERR, "ERROR: sh_lock: error waiting on semaphore: %s\n",
139                                         strerror(errno));
140         }
141 }
142
143 /* ret -1 on erro*/
144 #endif
145
146
147
148 #ifdef DBG_QM_MALLOC
149
150 #define shm_malloc_unsafe(_size ) \
151         MY_MALLOC(shm_block, (_size), __FILE__, __FUNCTION__, __LINE__ )
152
153
154 inline static void* _shm_malloc(unsigned int size, 
155         char *file, char *function, int line )
156 {
157         void *p;
158         
159         shm_lock();\
160         p=MY_MALLOC(shm_block, size, file, function, line );
161         shm_unlock();
162         return p; 
163 }
164
165 #define shm_malloc( _size ) _shm_malloc((_size), \
166         __FILE__, __FUNCTION__, __LINE__ )
167
168
169
170 #define shm_free_unsafe( _p  ) \
171         MY_FREE( shm_block, (_p), __FILE__, __FUNCTION__, __LINE__ )
172
173 #define shm_free(_p) \
174 do { \
175                 shm_lock(); \
176                 shm_free_unsafe( (_p)); \
177                 shm_unlock(); \
178 }while(0)
179
180 void* _shm_resize( void*, unsigned int, char*, char*, unsigned int);
181 #define shm_resize(_p, _s ) \
182         _shm_resize( (_p), (_s),   __FILE__, __FUNCTION__, __LINE__)
183
184
185
186 #else
187
188
189 #define shm_malloc_unsafe(_size) MY_MALLOC(shm_block, (_size))
190
191 inline static void* shm_malloc(unsigned int size)
192 {
193         void *p;
194         
195         shm_lock();
196         p=shm_malloc_unsafe(size);
197         shm_unlock();
198          return p; 
199 }
200
201
202 void* _shm_resize( void*, unsigned int);
203
204 #define shm_free_unsafe( _p ) MY_FREE(shm_block, (_p))
205
206 #define shm_free(_p) \
207 do { \
208                 shm_lock(); \
209                 shm_free_unsafe( _p ); \
210                 shm_unlock(); \
211 }while(0)
212
213
214
215 #define shm_resize(_p, _s) _shm_resize( (_p), (_s))
216
217
218 #endif
219
220
221 #define shm_status() \
222 do { \
223                 /*shm_lock();*/ \
224                 MY_STATUS(shm_block); \
225                 /*shm_unlock();*/ \
226 }while(0)
227
228
229
230
231 #endif
232
233 #endif
234