]> sourceware.org Git - newlib-cygwin.git/blame - winsup/cygwin/sem.cc
* Merge in cygwin-64bit-branch.
[newlib-cygwin.git] / winsup / cygwin / sem.cc
CommitLineData
a6df500f 1/* sem.cc: XSI IPC interface for Cygwin.
1c001dd2 2
61522196 3 Copyright 2002, 2003, 2004, 2005, 2008, 2009, 2012 Red Hat, Inc.
1c001dd2
CS
4
5This file is part of Cygwin.
6
7This software is a copyrighted work licensed under the terms of the
8Cygwin license. Please consult the file "CYGWIN_LICENSE" for
9details. */
10
11#include "winsup.h"
a6df500f 12#include <unistd.h>
1c001dd2 13
a6df500f 14#include "sigproc.h"
1c001dd2 15
a6df500f 16#include "cygserver_sem.h"
893ac8e0 17#include "cygtls.h"
a6df500f
CV
18
19/*
20 * client_request_sem Constructors
21 */
22
23client_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
40client_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
55client_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}
a6df500f
CV
69
70/*
71 * XSI semaphore API. These are exported by the DLL.
72 */
1c001dd2
CS
73
74extern "C" int
75semctl (int semid, int semnum, int cmd, ...)
76{
a6df500f
CV
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 }
61522196
CV
86 syscall_printf ("semctl (semid = %d, semnum = %d, cmd = %d, arg = %p)",
87 semid, semnum, cmd, arg.buf);
893ac8e0
CF
88 myfault efault;
89 if (efault.faulted (EFAULT))
a6df500f
CV
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 ());
bd0e3521 96 if (request.error_code () == ENOSYS)
e3778517 97 raise (SIGSYS);
a6df500f
CV
98 return -1;
99 }
100 return request.retval ();
1c001dd2
CS
101}
102
103extern "C" int
104semget (key_t key, int nsems, int semflg)
105{
61522196 106 syscall_printf ("semget (key = %U, nsems = %d, semflg = %y)",
a6df500f
CV
107 key, nsems, semflg);
108 client_request_sem request (key, nsems, semflg);
109 if (request.make_request () == -1 || request.retval () == -1)
110 {
6b0d86c5 111 syscall_printf ("-1 [%d] = semget ()", request.error_code ());
a6df500f 112 set_errno (request.error_code ());
bd0e3521 113 if (request.error_code () == ENOSYS)
e3778517 114 raise (SIGSYS);
a6df500f
CV
115 return -1;
116 }
117 return request.retval ();
1c001dd2
CS
118}
119
120extern "C" int
121semop (int semid, struct sembuf *sops, size_t nsops)
122{
61522196 123 syscall_printf ("semop (semid = %d, sops = %p, nsops = %ld)",
a6df500f 124 semid, sops, nsops);
893ac8e0
CF
125 myfault efault;
126 if (efault.faulted (EFAULT))
a6df500f
CV
127 return -1;
128 client_request_sem request (semid, sops, nsops);
129 if (request.make_request () == -1 || request.retval () == -1)
130 {
6b0d86c5 131 syscall_printf ("-1 [%d] = semop ()", request.error_code ());
a6df500f 132 set_errno (request.error_code ());
bd0e3521 133 if (request.error_code () == ENOSYS)
e3778517 134 raise (SIGSYS);
a6df500f
CV
135 return -1;
136 }
137 return request.retval ();
1c001dd2 138}
This page took 0.371492 seconds and 5 git commands to generate.