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