static int do_cg_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { int (*cg_write)(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi); char *error; dlerror(); /* Clear any existing error */ cg_write = (int (*)(const char *, const char *, size_t, off_t, struct fuse_file_info *)) dlsym(dlopen_handle, "cg_write"); error = dlerror(); if (error != NULL) { fprintf(stderr, "cg_write: %s\n", error); return -1; } return cg_write(path, buf, size, offset, fi); }
static PyObject * cc_write (PyObject *self, PyObject *args) { CCLibTicker ticker("cc_write"); int w = 0, l = 0, len = 0, ret = 0; int e, flush ; char * data ; if (!PyArg_ParseTuple(args, "iiis#i", &e, &w, &l, &data, &len, &flush)) { return NULL; } Py_BEGIN_ALLOW_THREADS ret = cg_write (e, w, l, data, len, flush) ; Py_END_ALLOW_THREADS return Py_BuildValue("i", ret); }
int cg_run_nowait(const char *cgroup, int (*fn)(const char *cgroup, void *arg), void *arg) { int pid; pid = fork(); if (pid == 0) { char buf[64]; snprintf(buf, sizeof(buf), "%d", getpid()); if (cg_write(cgroup, "cgroup.procs", buf)) exit(EXIT_FAILURE); exit(fn(cgroup, arg)); } return pid; }
int cg_run(const char *cgroup, int (*fn)(const char *cgroup, void *arg), void *arg) { int pid, retcode; pid = fork(); if (pid < 0) { return pid; } else if (pid == 0) { char buf[64]; snprintf(buf, sizeof(buf), "%d", getpid()); if (cg_write(cgroup, "cgroup.procs", buf)) exit(EXIT_FAILURE); exit(fn(cgroup, arg)); } else { waitpid(pid, &retcode, 0); if (WIFEXITED(retcode)) return WEXITSTATUS(retcode); else return -1; } }
static PyObject * cc_sendmulti (PyObject *self, PyObject *args) { int hlen = 0, dlen = 0, data_mod = 0, buffer_mod = 0; char *hids; char *pos; char *data ; if (!PyArg_ParseTuple(args, "s#s#ii", &hids, &hlen, &data, &dlen, &data_mod, &buffer_mod)) { return NULL; } hlen /= sizeof(int); int event = (data_mod == 0)? ITMC_DATA : ITMC_UNRDAT; pos = hids; Py_BEGIN_ALLOW_THREADS for(; hlen>0; hlen--) { cg_write(event, *(int *)pos, 0, data, dlen, buffer_mod); pos += sizeof(int); } Py_END_ALLOW_THREADS return Py_BuildValue("i", 0); }