This patch introduces a new keywork NAMESPACE which allow cgroups
to be created starting from a certain point as mentioned by the
administrator. This is provided via the configuration file.

Newer APIs will use this feature.

Changes from v1:
1. Attempted to fix the indentation
2. Change a variable name

Signed-off-by: Dhaval Giani <[email protected]>

---
 src/config.c             |   33 +++++++++++++++++++++++++++++++++
 src/lex.l                |   11 ++++++-----
 src/libcgroup-internal.h |    1 +
 src/parse.y              |   41 +++++++++++++++++++++++++++++++++++++++--
 4 files changed, 79 insertions(+), 7 deletions(-)

Index: libcg/src/lex.l
===================================================================
--- libcg.orig/src/lex.l
+++ libcg/src/lex.l
@@ -23,11 +23,12 @@ int line_no = 1;
 [ \t]  {/* DO NOTHING */}
 ^#.*[ \t]*  {/* Comments */}
 ^\*.*[ \t]* {/* Comments */}
-"mount"        {return MOUNT;}
-"task" {return TASK;}
-"admin"        {return ADMIN;}
-"perm" {return PERM;}
-"group"        {return GROUP;}
+"mount"                {return MOUNT;}
+"task"         {return TASK;}
+"admin"                {return ADMIN;}
+"perm"         {return PERM;}
+"group"                {return GROUP;}
+"namespace"    {return NAMESPACE;}
 [a-zA-Z0-9_\-\/\.]+ {yylval.name = strdup(yytext); return ID;}
 .      {return yytext[0];}
 %%
Index: libcg/src/parse.y
===================================================================
--- libcg.orig/src/parse.y
+++ libcg/src/parse.y
@@ -37,7 +37,7 @@ int yywrap(void)
 
 %}
 
-%token ID MOUNT GROUP PERM TASK ADMIN
+%token ID MOUNT GROUP PERM TASK ADMIN NAMESPACE
 
 %union {
        char *name;
@@ -47,6 +47,7 @@ int yywrap(void)
 %type <name> ID namevalue_conf
 %type <val> mountvalue_conf mount task_namevalue_conf admin_namevalue_conf
 %type <val> admin_conf task_conf task_or_admin group_conf group start
+%type <val> namespace namespace_conf
 %start start
 %%
 
@@ -58,7 +59,11 @@ start   : start group
        {
                $$ = $1;
        }
-        |
+        | start namespace
+       {
+               $$ = $1;
+       }
+       |
        {
                $$ = 1;
        }
@@ -266,5 +271,37 @@ mount   :       MOUNT '{' mountvalue_con
        }
         ;
 
+namespace_conf
+        :       ID '=' ID ';'
+       {
+               if (!cgroup_config_insert_into_namespace_table($1, $3)) {
+                       cgroup_config_cleanup_namespace_table();
+                       $$ = 0;
+                       return $$;
+               }
+               $$ = 1;
+       }
+        |       namespace_conf ID '=' ID ';'
+       {
+               if (!cgroup_config_insert_into_namespace_table($2, $4)) {
+                       cgroup_config_cleanup_namespace_table();
+                       $$ = 0;
+                       return $$;
+               }
+               $$ = 1;
+       }
+        ;
+
+namespace   :       NAMESPACE '{' namespace_conf '}'
+       {
+               $$ = $3;
+               if (!$$) {
+                       fprintf(stderr, "parsing failed at line number %d\n",
+                               line_no);
+                       $$ = 0;
+                       return $$;
+               }
+       }
+        ;
 
 %%
Index: libcg/src/config.c
===================================================================
--- libcg.orig/src/config.c
+++ libcg/src/config.c
@@ -59,8 +59,11 @@ extern int yyparse(void);
  * cgroup_table_index -> Where in the cgroup_table we are.
  */
 static struct cg_mount_table_s config_mount_table[CG_CONTROLLER_MAX];
+static struct cg_mount_table_s config_namespace_table[CG_CONTROLLER_MAX];
 static int config_table_index;
+static int namespace_table_index;
 static pthread_rwlock_t config_table_lock = PTHREAD_RWLOCK_INITIALIZER;
+static pthread_rwlock_t namespace_table_lock = PTHREAD_RWLOCK_INITIALIZER;
 static struct cgroup config_cgroup_table[MAX_CGROUPS];
 int cgroup_table_index;
 
@@ -352,6 +355,36 @@ void cgroup_config_cleanup_mount_table(v
 }
 
 /*
+ * The moment we have found the controller's information
+ * insert it into the config_mount_table.
+ */
+int cgroup_config_insert_into_namespace_table(char *name, char *nspath)
+{
+       if (namespace_table_index >= CG_CONTROLLER_MAX)
+               return 0;
+
+       pthread_rwlock_wrlock(&namespace_table_lock);
+
+       strcpy(config_namespace_table[namespace_table_index].name, name);
+       strcpy(config_namespace_table[namespace_table_index].path, nspath);
+       namespace_table_index++;
+
+       pthread_rwlock_unlock(&namespace_table_lock);
+       free(name);
+       free(nspath);
+       return 1;
+}
+
+/*
+ * Cleanup all the data from the config_mount_table
+ */
+void cgroup_config_cleanup_namespace_table(void)
+{
+       memset(&config_namespace_table, 0,
+                       sizeof(struct cg_mount_table_s) * CG_CONTROLLER_MAX);
+}
+
+/*
  * Start mounting the mount table.
  */
 int cgroup_config_mount_fs()
Index: libcg/src/libcgroup-internal.h
===================================================================
--- libcg.orig/src/libcgroup-internal.h
+++ libcg/src/libcgroup-internal.h
@@ -125,6 +125,7 @@ int cgroup_config_parse_controller_optio
 int cgroup_config_group_task_perm(char *perm_type, char *value);
 int cgroup_config_group_admin_perm(char *perm_type, char *value);
 int cgroup_config_insert_into_mount_table(char *name, char *mount_point);
+int cgroup_config_insert_into_namespace_table(char *name, char *mount_point);
 void cgroup_config_cleanup_mount_table(void);
 __END_DECLS
 



------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to