part of the series to convert to a thread aware as opposed to a thread safe model.
Signed-off-by: Dhaval Giani <[email protected]> --- include/libcgroup/deprecated.h | 12 +++++++ include/libcgroup/error.h | 1 include/libcgroup/groups.h | 3 - src/api.c | 66 +++++++++++++++++++++++++---------------- src/libcgroup.map | 1 5 files changed, 55 insertions(+), 28 deletions(-) Index: libcg/src/api.c =================================================================== --- libcg.orig/src/api.c +++ libcg/src/api.c @@ -1331,15 +1331,28 @@ int cgroup_create_cgroup(struct cgroup * int error = 0; int retval = 0; int ret; - - if (!cgroup_initialized) - return ECGROUPNOTINITIALIZED; + struct cgroup_context_s *cg_context; + int deprecated = 0; if (!cgroup) return ECGROUPNOTALLOWED; + if (!cgroup->context) { + pthread_rwlock_rdlock(&cg_mount_table_lock); + cgroup->context = cgroup_context; + deprecated = 1; + cgroup_dbg("WARNING: This is deprecated. Please utilize the " \ + "new context aware interfaces\n"); + } + + if (!cgroup->context->size) + return ECGROUPINVALCONTEXT; + + cg_context = cgroup->context; + for (i = 0; i < cgroup->index; i++) { - if (!cgroup_test_subsys_mounted(cgroup->controller[i]->name)) + if (!cgroup_test_subsys_context(cg_context, + cgroup->controller[i]->name)) return ECGROUPSUBSYSNOTMOUNTED; } @@ -1348,6 +1361,7 @@ int cgroup_create_cgroup(struct cgroup * last_errno = errno; return ECGOTHER; } + fts_path[1] = NULL; path = fts_path[0]; @@ -1357,7 +1371,7 @@ int cgroup_create_cgroup(struct cgroup * * data structure. If not, we fail. */ for (k = 0; k < cgroup->index; k++) { - if (!cg_build_path(cgroup->name, path, + if (!cg_build_path_context(cg_context, cgroup->name, path, cgroup->controller[k]->name)) continue; @@ -1366,19 +1380,16 @@ int cgroup_create_cgroup(struct cgroup * goto err; base = strdup(path); - if (!base) { last_errno = errno; error = ECGOTHER; goto err; } - if (!ignore_ownership) { - cgroup_dbg("Changing ownership of %s\n", fts_path[0]); - error = cg_chown_recursive(fts_path, - cgroup->control_uid, cgroup->control_gid); - } + cgroup_dbg("Changing ownership of %s\n", fts_path[0]); + error = cg_chown_recursive(fts_path, + cgroup->control_uid, cgroup->control_gid); if (error) goto err; @@ -1392,6 +1403,7 @@ int cgroup_create_cgroup(struct cgroup * error = ECGOTHER; goto err; } + error = cg_set_control_value(path, cgroup->controller[k]->values[j]->value); /* @@ -1409,26 +1421,30 @@ int cgroup_create_cgroup(struct cgroup * } } - if (!ignore_ownership) { - ret = snprintf(path, FILENAME_MAX, "%s/tasks", base); - if (ret < 0 || ret >= FILENAME_MAX) { - last_errno = errno; - error = ECGOTHER; - goto err; - } - error = chown(path, cgroup->tasks_uid, - cgroup->tasks_gid); - if (error) { - last_errno = errno; - error = ECGOTHER; - goto err; - } + ret = snprintf(path, FILENAME_MAX, "%s/tasks", base); + if (ret < 0 || ret >= FILENAME_MAX) { + last_errno = errno; + error = ECGOTHER; + goto err; } + + error = chown(path, cgroup->tasks_uid, cgroup->tasks_gid); + if (error) { + last_errno = errno; + error = ECGOTHER; + goto err; + } + free(base); base = NULL; } err: + if(deprecated) { + cgroup->context = NULL; + pthread_rwlock_unlock(&cg_mount_table_lock); + } + if (path) free(path); if (base) Index: libcg/include/libcgroup/error.h =================================================================== --- libcg.orig/include/libcgroup/error.h +++ libcg/include/libcgroup/error.h @@ -71,6 +71,7 @@ enum { ECGNAMESPACEPATHS, ECGNAMESPACECONTROLLER, ECGMOUNTNAMESPACE, + ECGROUPINVALCONTEXT, }; /** Index: libcg/include/libcgroup/deprecated.h =================================================================== --- libcg.orig/include/libcgroup/deprecated.h +++ libcg/include/libcgroup/deprecated.h @@ -21,6 +21,18 @@ __BEGIN_DECLS */ int cgroup_init(void); +/** + * Physically create a control group in kernel. The group is created in all + * hierarchies, which cover controllers added by cgroup_add_controller(). + * All parameters set by cgroup_add_value_* functions are written. + * The created groups has owner which was set by cgroup_set_uid_gid(). + * @param cgroup + * @param ignore_ownership When nozero, all errors are ignored when setting + * owner of the group and/or its tasks file. + * @todo what is ignore_ownership good for? + */ +int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership); + __END_DECLS #endif Index: libcg/include/libcgroup/groups.h =================================================================== --- libcg.orig/include/libcgroup/groups.h +++ libcg/include/libcgroup/groups.h @@ -172,9 +172,6 @@ void cgroup_free_controllers(struct cgro * All parameters set by cgroup_add_value_* functions are written. * The created groups has owner which was set by cgroup_set_uid_gid(). * @param cgroup - * @param ignore_ownership When nozero, all errors are ignored when setting - * owner of the group and/or its tasks file. - * @todo what is ignore_ownership good for? */ int cgroup_create_cgroup(struct cgroup *cgroup, int ignore_ownership); Index: libcg/src/libcgroup.map =================================================================== --- libcg.orig/src/libcgroup.map +++ libcg/src/libcgroup.map @@ -93,4 +93,5 @@ CGROUP_0.37 { cgroup_get_procs; cgroup_init_context; cgroup_free_context; + cgroup_create_cgroup_context; } CGROUP_0.36; ------------------------------------------------------------------------------ The Palm PDK Hot Apps Program offers developers who use the Plug-In Development Kit to bring their C/C++ apps to Palm for a share of $1 Million in cash or HP Products. Visit us here for more details: http://ad.doubleclick.net/clk;226879339;13503038;l? http://clk.atdmt.com/CRS/go/247765532/direct/01/ _______________________________________________ Libcg-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/libcg-devel
