OSDN Git Service

Rename cygWFMO to cygwait throughout and use the magic of polymorphism to "wait
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / sem.cc
1 /* sem.cc: XSI IPC interface for Cygwin.
2
3    Copyright 2003, 2004, 2009 Red Hat, Inc.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #include "winsup.h"
12 #include <unistd.h>
13
14 #include "sigproc.h"
15
16 #include "cygserver_sem.h"
17 #include "cygtls.h"
18
19 /*
20  * client_request_sem Constructors
21  */
22
23 client_request_sem::client_request_sem (int semid,
24                                         int semnum,
25                                         int cmd,
26                                         union semun *arg)
27   : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters))
28 {
29   _parameters.in.semop = SEMOP_semctl;
30   ipc_set_proc_info (_parameters.in.ipcblk);
31
32    _parameters.in.ctlargs.semid = semid;
33    _parameters.in.ctlargs.semnum = semnum;
34    _parameters.in.ctlargs.cmd = cmd;
35    _parameters.in.ctlargs.arg = arg;
36
37   msglen (sizeof (_parameters.in));
38 }
39
40 client_request_sem::client_request_sem (key_t key,
41                                         int nsems,
42                                         int semflg)
43   : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters))
44 {
45   _parameters.in.semop = SEMOP_semget;
46   ipc_set_proc_info (_parameters.in.ipcblk);
47
48   _parameters.in.getargs.key = key;
49   _parameters.in.getargs.nsems = nsems;
50   _parameters.in.getargs.semflg = semflg;
51
52   msglen (sizeof (_parameters.in));
53 }
54
55 client_request_sem::client_request_sem (int semid,
56                                         struct sembuf *sops,
57                                         size_t nsops)
58   : client_request (CYGSERVER_REQUEST_SEM, &_parameters, sizeof (_parameters))
59 {
60   _parameters.in.semop = SEMOP_semop;
61   ipc_set_proc_info (_parameters.in.ipcblk);
62
63   _parameters.in.opargs.semid = semid;
64   _parameters.in.opargs.sops = sops;
65   _parameters.in.opargs.nsops = nsops;
66
67   msglen (sizeof (_parameters.in));
68 }
69
70 /*
71  * XSI semaphore API.  These are exported by the DLL.
72  */
73
74 extern "C" int
75 semctl (int semid, int semnum, int cmd, ...)
76 {
77   union semun arg = {0};
78   if (cmd == IPC_STAT || cmd == IPC_SET || cmd == IPC_INFO || cmd == SEM_INFO
79       || cmd == GETALL || cmd == SETALL || cmd == SETVAL)
80     {
81       va_list ap;
82       va_start (ap, cmd);
83       arg = va_arg (ap, union semun);
84       va_end (ap);
85     }
86   syscall_printf ("semctl (semid = %d, semnum = %d, cmd = %d, arg.val = 0x%x)",
87                   semid, semnum, cmd, arg.val);
88   myfault efault;
89   if (efault.faulted (EFAULT))
90     return -1;
91   client_request_sem request (semid, semnum, cmd, &arg);
92   if (request.make_request () == -1 || request.retval () == -1)
93     {
94       syscall_printf ("-1 [%d] = semctl ()", request.error_code ());
95       set_errno (request.error_code ());
96       if (request.error_code () == ENOSYS)
97         raise (SIGSYS);
98       return -1;
99     }
100   return request.retval ();
101 }
102
103 extern "C" int
104 semget (key_t key, int nsems, int semflg)
105 {
106   syscall_printf ("semget (key = %U, nsems = %d, semflg = 0x%x)",
107                   key, nsems, semflg);
108   client_request_sem request (key, nsems, semflg);
109   if (request.make_request () == -1 || request.retval () == -1)
110     {
111       syscall_printf ("-1 [%d] = semget ()", request.error_code ());
112       set_errno (request.error_code ());
113       if (request.error_code () == ENOSYS)
114         raise (SIGSYS);
115       return -1;
116     }
117   return request.retval ();
118 }
119
120 extern "C" int
121 semop (int semid, struct sembuf *sops, size_t nsops)
122 {
123   syscall_printf ("semop (semid = %d, sops = %p, nsops = %d)",
124                   semid, sops, nsops);
125   myfault efault;
126   if (efault.faulted (EFAULT))
127     return -1;
128   client_request_sem request (semid, sops, nsops);
129   if (request.make_request () == -1 || request.retval () == -1)
130     {
131       syscall_printf ("-1 [%d] = semop ()", request.error_code ());
132       set_errno (request.error_code ());
133       if (request.error_code () == ENOSYS)
134         raise (SIGSYS);
135       return -1;
136     }
137   return request.retval ();
138 }