|
@@ -44,11 +44,62 @@ extern int shm_semid;
|
|
|
|
|
|
int shm_mem_init();
|
|
int shm_mem_init();
|
|
void shm_mem_destroy();
|
|
void shm_mem_destroy();
|
|
-inline void shm_lock();
|
|
|
|
-inline void shm_unlock();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+/* inline functions (do not move them to *.c, they won't be inlined anymore) */
|
|
|
|
+static inline void shm_lock()
|
|
|
|
+{
|
|
|
|
+ struct sembuf sop;
|
|
|
|
+
|
|
|
|
+ sop.sem_num=0;
|
|
|
|
+ sop.sem_op=-1; /*down*/
|
|
|
|
+ sop.sem_flg=0 /*SEM_UNDO*/;
|
|
|
|
+again:
|
|
|
|
+ semop(shm_semid, &sop, 1);
|
|
|
|
+#if 0
|
|
|
|
+ switch(ret){
|
|
|
|
+ case 0: /*ok*/
|
|
|
|
+ break;
|
|
|
|
+ case EINTR: /*interrupted by signal, try again*/
|
|
|
|
+ DBG("sh_lock: interrupted by signal, trying again...\n");
|
|
|
|
+ goto again;
|
|
|
|
+ default:
|
|
|
|
+ LOG(L_ERR, "ERROR: sh_lock: error waiting on semaphore: %s\n",
|
|
|
|
+ strerror(errno));
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static inline void shm_unlock()
|
|
|
|
+{
|
|
|
|
+ struct sembuf sop;
|
|
|
|
+
|
|
|
|
+ sop.sem_num=0;
|
|
|
|
+ sop.sem_op=1; /*up*/
|
|
|
|
+ sop.sem_flg=0 /*SEM_UNDO*/;
|
|
|
|
+again:
|
|
|
|
+ semop(shm_semid, &sop, 1);
|
|
|
|
+#if 0
|
|
|
|
+ /*should ret immediately*/
|
|
|
|
+ switch(ret){
|
|
|
|
+ case 0: /*ok*/
|
|
|
|
+ break;
|
|
|
|
+ case EINTR: /*interrupted by signal, try again*/
|
|
|
|
+ DBG("sh_lock: interrupted by signal, trying again...\n");
|
|
|
|
+ goto again;
|
|
|
|
+ default:
|
|
|
|
+ LOG(L_ERR, "ERROR: sh_lock: error waiting on semaphore: %s\n",
|
|
|
|
+ strerror(errno));
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* ret -1 on erro*/
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
#ifdef DBG_QM_MALLOC
|
|
#ifdef DBG_QM_MALLOC
|
|
|
|
|