summaryrefslogtreecommitdiffstats
path: root/src/api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/api.c')
-rw-r--r--src/api.c106
1 files changed, 43 insertions, 63 deletions
diff --git a/src/api.c b/src/api.c
index a45802e..99e71fe 100644
--- a/src/api.c
+++ b/src/api.c
@@ -762,6 +762,43 @@ char *cg_build_path(char *name, char *path, char *type)
return path;
}
+static int __cgroup_attach_task_pid(char *path, pid_t tid)
+{
+ int ret = 0;
+ FILE *tasks = NULL;
+
+ tasks = fopen(path, "w");
+ if (!tasks) {
+ switch (errno) {
+ case EPERM:
+ return ECGROUPNOTOWNER;
+ case ENOENT:
+ return ECGROUPNOTEXIST;
+ default:
+ return ECGROUPNOTALLOWED;
+ }
+ }
+ ret = fprintf(tasks, "%d", tid);
+ if (ret < 0) {
+ last_errno = errno;
+ ret = ECGOTHER;
+ goto err;
+ }
+ ret = fflush(tasks);
+ if (ret) {
+ last_errno = errno;
+ ret = ECGOTHER;
+ goto err;
+ }
+ fclose(tasks);
+ return 0;
+err:
+ cgroup_dbg("Error writing tid %d to %s:%s\n",
+ tid, path, strerror(errno));
+ fclose(tasks);
+ return ret;
+}
+
/** cgroup_attach_task_pid is used to assign tasks to a cgroup.
* struct cgroup *cgroup: The cgroup to assign the thread to.
* pid_t tid: The thread to be assigned to the cgroup.
@@ -773,7 +810,6 @@ char *cg_build_path(char *name, char *path, char *type)
int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
{
char path[FILENAME_MAX];
- FILE *tasks = NULL;
int i, ret = 0;
if (!cgroup_initialized) {
@@ -789,37 +825,11 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
cg_mount_table[i].name))
continue;
strncat(path, "/tasks", sizeof(path) - strlen(path));
-
- tasks = fopen(path, "w");
- if (!tasks) {
- pthread_rwlock_unlock(&cg_mount_table_lock);
- switch (errno) {
- case EPERM:
- return ECGROUPNOTOWNER;
- case ENOENT:
- return ECGROUPNOTEXIST;
- default:
- return ECGROUPNOTALLOWED;
- }
- }
- ret = fprintf(tasks, "%d", tid);
- if (ret < 0) {
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- last_errno = errno;
- return ECGOTHER;
- }
-
- ret = fflush(tasks);
+ ret = __cgroup_attach_task_pid(path, tid);
if (ret) {
- last_errno = errno;
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- return ECGOTHER;
+ pthread_rwlock_unlock(&cg_mount_table_lock);
+ return ret;
}
- fclose(tasks);
}
pthread_rwlock_unlock(&cg_mount_table_lock);
} else {
@@ -835,40 +845,10 @@ int cgroup_attach_task_pid(struct cgroup *cgroup, pid_t tid)
if (!cg_build_path(cgroup->name, path,
cgroup->controller[i]->name))
continue;
-
strncat(path, "/tasks", sizeof(path) - strlen(path));
-
- tasks = fopen(path, "w");
- if (!tasks) {
- cgroup_dbg("fopen failed for %s:%s", path,
- strerror(errno));
-
- switch (errno) {
- case EPERM:
- return ECGROUPNOTOWNER;
- case ENOENT:
- return ECGROUPNOTEXIST;
- default:
- return ECGROUPNOTALLOWED;
- }
- }
- ret = fprintf(tasks, "%d", tid);
- if (ret < 0) {
- last_errno = errno;
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- return ECGOTHER;
- }
- ret = fflush(tasks);
- if (ret) {
- last_errno = errno;
- cgroup_dbg("Error writing tid %d to %s:%s\n",
- tid, path, strerror(errno));
- fclose(tasks);
- return ECGOTHER;
- }
- fclose(tasks);
+ ret = __cgroup_attach_task_pid(path, tid);
+ if (ret)
+ return ret;
}
}
return 0;