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