xref: /aosp_15_r20/external/autotest/utils/named_semaphore/namedsem.c (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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