1*9c5db199SXin Li #include <Python.h>
2*9c5db199SXin Li #include <semaphore.h>
3*9c5db199SXin Li
4*9c5db199SXin Li
5*9c5db199SXin Li static int
parse_sem_t(PyObject * object,void * address)6*9c5db199SXin Li parse_sem_t(PyObject *object, void *address)
7*9c5db199SXin Li {
8*9c5db199SXin Li *((sem_t **)address) = PyLong_AsVoidPtr(object);
9*9c5db199SXin Li return 1;
10*9c5db199SXin Li }
11*9c5db199SXin Li
12*9c5db199SXin Li
13*9c5db199SXin Li static PyObject *
namedsem_sem_open(PyObject * self,PyObject * args)14*9c5db199SXin Li namedsem_sem_open(PyObject *self, PyObject *args)
15*9c5db199SXin Li {
16*9c5db199SXin Li const char *name;
17*9c5db199SXin Li int oflag;
18*9c5db199SXin Li unsigned int value;
19*9c5db199SXin Li sem_t *result;
20*9c5db199SXin Li
21*9c5db199SXin Li PyArg_ParseTuple(args, "siI", &name, &oflag, &value);
22*9c5db199SXin Li result = sem_open(name, oflag, 0600, value);
23*9c5db199SXin Li
24*9c5db199SXin Li return PyLong_FromVoidPtr(result);
25*9c5db199SXin Li }
26*9c5db199SXin Li
27*9c5db199SXin Li static PyObject *
namedsem_sem_close(PyObject * self,PyObject * args)28*9c5db199SXin Li namedsem_sem_close(PyObject *self, PyObject *args)
29*9c5db199SXin Li {
30*9c5db199SXin Li sem_t *sem;
31*9c5db199SXin Li int result;
32*9c5db199SXin Li
33*9c5db199SXin Li PyArg_ParseTuple(args, "O&", &parse_sem_t, &sem);
34*9c5db199SXin Li result = sem_close(sem);
35*9c5db199SXin Li
36*9c5db199SXin Li return Py_BuildValue("i", result);
37*9c5db199SXin Li }
38*9c5db199SXin Li
39*9c5db199SXin Li static PyObject *
namedsem_sem_unlink(PyObject * self,PyObject * args)40*9c5db199SXin Li namedsem_sem_unlink(PyObject *self, PyObject *args)
41*9c5db199SXin Li {
42*9c5db199SXin Li const char *name;
43*9c5db199SXin Li int result;
44*9c5db199SXin Li
45*9c5db199SXin Li PyArg_ParseTuple(args, "s", &name);
46*9c5db199SXin Li result = sem_unlink(name);
47*9c5db199SXin Li
48*9c5db199SXin Li return Py_BuildValue("i", result);
49*9c5db199SXin Li }
50*9c5db199SXin Li
51*9c5db199SXin Li static PyObject *
namedsem_sem_wait(PyObject * self,PyObject * args)52*9c5db199SXin Li namedsem_sem_wait(PyObject *self, PyObject *args)
53*9c5db199SXin Li {
54*9c5db199SXin Li sem_t *sem;
55*9c5db199SXin Li int result;
56*9c5db199SXin Li
57*9c5db199SXin Li PyArg_ParseTuple(args, "O&", &parse_sem_t, &sem);
58*9c5db199SXin Li result = sem_wait(sem);
59*9c5db199SXin Li
60*9c5db199SXin Li return Py_BuildValue("i", result);
61*9c5db199SXin Li }
62*9c5db199SXin Li
63*9c5db199SXin Li static PyObject *
namedsem_sem_post(PyObject * self,PyObject * args)64*9c5db199SXin Li namedsem_sem_post(PyObject *self, PyObject *args)
65*9c5db199SXin Li {
66*9c5db199SXin Li sem_t *sem;
67*9c5db199SXin Li int result;
68*9c5db199SXin Li
69*9c5db199SXin Li PyArg_ParseTuple(args, "O&", &parse_sem_t, &sem);
70*9c5db199SXin Li result = sem_post(sem);
71*9c5db199SXin Li
72*9c5db199SXin Li return Py_BuildValue("i", result);
73*9c5db199SXin Li }
74*9c5db199SXin Li
75*9c5db199SXin Li
76*9c5db199SXin Li static PyObject *
namedsem_sem_getvalue(PyObject * self,PyObject * args)77*9c5db199SXin Li namedsem_sem_getvalue(PyObject *self, PyObject *args)
78*9c5db199SXin Li {
79*9c5db199SXin Li sem_t *sem;
80*9c5db199SXin Li int sval;
81*9c5db199SXin Li
82*9c5db199SXin Li PyArg_ParseTuple(args, "O&", &parse_sem_t, &sem);
83*9c5db199SXin Li sem_getvalue(sem, &sval);
84*9c5db199SXin Li
85*9c5db199SXin Li return Py_BuildValue("i", sval);
86*9c5db199SXin Li }
87*9c5db199SXin Li
88*9c5db199SXin Li
89*9c5db199SXin Li
90*9c5db199SXin Li static PyMethodDef NamedsemMethods[] = {
91*9c5db199SXin Li {"sem_open", namedsem_sem_open, METH_VARARGS, "Execute sem_open()."},
92*9c5db199SXin Li {"sem_close", namedsem_sem_close, METH_VARARGS, "Execute sem_close()."},
93*9c5db199SXin Li {"sem_unlink", namedsem_sem_unlink, METH_VARARGS, "Execute sem_unlink()."},
94*9c5db199SXin Li {"sem_wait", namedsem_sem_wait, METH_VARARGS, "Execute sem_wait()."},
95*9c5db199SXin Li {"sem_post", namedsem_sem_post, METH_VARARGS, "Execute sem_post()."},
96*9c5db199SXin Li {"sem_getvalue", namedsem_sem_getvalue, METH_VARARGS, "Execute sem_getvalue()."},
97*9c5db199SXin Li {NULL, NULL, 0, NULL}
98*9c5db199SXin Li };
99*9c5db199SXin Li
100*9c5db199SXin Li PyMODINIT_FUNC
initnamedsem(void)101*9c5db199SXin Li initnamedsem(void) {
102*9c5db199SXin Li PyObject *module;
103*9c5db199SXin Li
104*9c5db199SXin Li module = Py_InitModule("namedsem", NamedsemMethods);
105*9c5db199SXin Li PyModule_AddIntConstant(module, "SEM_FAILED", (long)SEM_FAILED);
106*9c5db199SXin Li }
107