enhmetafile added
[wine/multimedia.git] / ipc / shm_semaph.c
blob2dce9b1c685ec88942710a961b884dadeeb53486
1 /***************************************************************************
2 * Copyright 1995, Technion, Israel Institute of Technology
3 * Electrical Eng, Software Lab.
4 * Author: Michael Veksler.
5 ***************************************************************************
6 * File: shm_semaph.c
7 * Purpose: Handle semaphores for shared memory operations.
8 ***************************************************************************
9 */
10 #ifdef CONFIG_IPC
12 #define inline __inline__
13 #include <assert.h>
14 #include <unistd.h>
15 #include <sys/sem.h>
16 #include <errno.h>
17 #include "debug.h"
18 #include "shm_semaph.h"
20 DEFAULT_DEBUG_CHANNEL(sem)
21 #define SEM_READ 0
22 #define SEM_WRITE 1
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)
29 struct sembuf sop[2];
30 int ret;
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;
41 do {
42 ret=semop (semid,sop , 2);
43 } while (ret<0 && errno==EINTR); /* interrupted system call? */
45 if (ret<0)
46 WARN(sem,"(semid=%d,errno=%d): Failed semaphore lock for read\n",
47 semid, errno);
49 void shm_write_wait(shm_sem semid)
51 struct sembuf sop[3];
52 int ret;
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;
67 do {
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",
73 semid, errno);
75 void shm_write_signal(shm_sem semid)
77 struct sembuf sop[2];
78 int ret;
80 TRACE(sem,"(%d)\n",semid);
81 sop[0].sem_num=SEM_READ;
82 sop[0].sem_op=-1;
83 sop[0].sem_flg=IPC_NOWAIT | SEM_UNDO; /* no reason to wait */
85 sop[1].sem_num=SEM_WRITE;
86 sop[1].sem_op=-1;
87 sop[1].sem_flg=IPC_NOWAIT | SEM_UNDO; /* no reason to wait */
89 do {
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",
95 semid, errno);
98 void shm_read_signal(shm_sem semid)
100 struct sembuf sop[2];
101 int ret;
103 TRACE(sem,"(%d)\n",semid);
104 sop[0].sem_num=SEM_READ;
105 sop[0].sem_op=-1;
106 sop[0].sem_flg=IPC_NOWAIT | SEM_UNDO; /* no reason to wait */
108 do {
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",
114 semid, errno);
117 void shm_sem_init(shm_sem *sptr)
119 shm_sem semid;
120 union semun arg;
122 semid=semget (IPC_PRIVATE, 2, 0700 | IPC_CREAT);
124 arg.val=0;
125 semctl (semid, 0, SETVAL, arg);
126 semctl (semid, 1, SETVAL, arg);
127 *sptr=semid;
130 void shm_sem_done(shm_sem *semptr)
132 union semun arg;
134 semctl (*semptr, 0, IPC_RMID , arg);
135 semctl (*semptr, 1, IPC_RMID , arg);
137 *semptr= -1;
140 #endif /* CONFIG_IPC */