1 /***************************************************************************
2 * Copyright 1995, Technion, Israel Institute of Technology
3 * Electrical Eng, Software Lab.
4 * Author: Michael Veksler.
5 ***************************************************************************
7 * Purpose: Handle semaphores for shared memory operations.
8 ***************************************************************************
12 #define inline __inline__
18 #include "shm_semaph.h"
20 DEFAULT_DEBUG_CHANNEL(sem
)
24 /* IMPORTANT: Make sure that killed process will not lock everything.
25 * If possible, restrict usage of these functions.
27 void shm_read_wait(shm_sem semid
)
32 TRACE(sem
,"(%d)\n",semid
);
33 sop
[0].sem_num
=SEM_READ
;
34 sop
[0].sem_op
=1; /* add this read instance */
35 sop
[0].sem_flg
=SEM_UNDO
; /* undo in case process dies */
37 sop
[1].sem_num
=SEM_WRITE
;
38 sop
[1].sem_op
=0; /* wait until no writing instance exists */
39 sop
[1].sem_flg
=SEM_UNDO
;
42 ret
=semop (semid
,sop
, 2);
43 } while (ret
<0 && errno
==EINTR
); /* interrupted system call? */
46 WARN(sem
,"(semid=%d,errno=%d): Failed semaphore lock for read\n",
49 void shm_write_wait(shm_sem semid
)
54 TRACE(sem
,"(%d)\n",semid
);
55 sop
[0].sem_num
=SEM_READ
;
56 sop
[0].sem_op
=0; /* wait until no reading instance exist */
57 sop
[0].sem_flg
=SEM_UNDO
;
59 sop
[1].sem_num
=SEM_WRITE
;
60 sop
[1].sem_op
=1; /* writing is in progress - disable read */
61 sop
[1].sem_flg
=SEM_UNDO
; /* undo if process dies */
63 sop
[2].sem_num
=SEM_READ
;
64 sop
[2].sem_op
=1; /* disable new writes */
65 sop
[2].sem_flg
=SEM_UNDO
;
68 ret
=semop (semid
,sop
, 3);
69 } while (ret
<0 && errno
==EINTR
); /* interrupted system call? */
71 if (ret
<0) /* test for the error */
72 WARN(sem
,"(semid=%d,errno=%d): Failed semaphore lock for write\n",
75 void shm_write_signal(shm_sem semid
)
80 TRACE(sem
,"(%d)\n",semid
);
81 sop
[0].sem_num
=SEM_READ
;
83 sop
[0].sem_flg
=IPC_NOWAIT
| SEM_UNDO
; /* no reason to wait */
85 sop
[1].sem_num
=SEM_WRITE
;
87 sop
[1].sem_flg
=IPC_NOWAIT
| SEM_UNDO
; /* no reason to wait */
90 ret
=semop (semid
,sop
, 2);
91 } while (ret
<0 && errno
==EINTR
); /* interrupted system call? */
93 if (ret
<0) /* test for the error */
94 WARN(sem
,"(semid=%d,errno=%d): Failed semaphore unlock for write\n",
98 void shm_read_signal(shm_sem semid
)
100 struct sembuf sop
[2];
103 TRACE(sem
,"(%d)\n",semid
);
104 sop
[0].sem_num
=SEM_READ
;
106 sop
[0].sem_flg
=IPC_NOWAIT
| SEM_UNDO
; /* no reason to wait */
109 ret
=semop (semid
,sop
, 1);
110 } while (ret
<0 && errno
==EINTR
); /* interrupted system call? */
112 if (ret
<0) /* test for the error */
113 WARN(sem
,"(semid=%d,errno=%d): Failed semaphore unlock for read\n",
117 void shm_sem_init(shm_sem
*sptr
)
122 semid
=semget (IPC_PRIVATE
, 2, 0700 | IPC_CREAT
);
125 semctl (semid
, 0, SETVAL
, arg
);
126 semctl (semid
, 1, SETVAL
, arg
);
130 void shm_sem_done(shm_sem
*semptr
)
134 semctl (*semptr
, 0, IPC_RMID
, arg
);
135 semctl (*semptr
, 1, IPC_RMID
, arg
);
140 #endif /* CONFIG_IPC */