On 11/09/2011 11:12 AM, Dhaval Giani wrote:
> There is a lot of duplicated code in the wrappers. This is a hinderance
> when one wants to change the basic design and in general maintainence.
> 
> Remove the duplicated code.
> 
> Also add a test case to test the changes.
> 
> Signed-off-by: Dhaval Giani <dhaval.gi...@gmail.com>

Acked-By: Jan Safranek <jsafr...@redhat.com>

> ---
> 
> Changes from v1,
> 1. Correct return values for test case
> 2. Add a make check entry
> 
> Hopefully Jan can give it a run and confirm stuff works as expected!
> Thanks!
> 
> ---
>  src/wrapper.c        |  124 ++++++++++++-------------------------------------
>  tests/.gitignore     |    1 +
>  tests/Makefile.am    |    5 +-
>  tests/wrapper_test.c |   44 ++++++++++++++++++
>  4 files changed, 79 insertions(+), 95 deletions(-)
>  create mode 100644 tests/wrapper_test.c
> 
> diff --git a/src/wrapper.c b/src/wrapper.c
> index 90c8bc3..95be969 100644
> --- a/src/wrapper.c
> +++ b/src/wrapper.c
> @@ -15,6 +15,9 @@
>   * his mistake.
>   */
>  
> +#define _GNU_SOURCE
> +
> +#include <errno.h>
>  #include <libcgroup.h>
>  #include <libcgroup-internal.h>
>  #include <inttypes.h>
> @@ -150,123 +153,58 @@ int cgroup_add_value_string(struct cgroup_controller 
> *controller,
>  int cgroup_add_value_int64(struct cgroup_controller *controller,
>                                       const char *name, int64_t value)
>  {
> -     int i;
> -     unsigned ret;
> -     struct control_value *cntl_value;
> -
> -     if (!controller)
> -             return ECGINVAL;
> -
> -     if (controller->index >= CG_VALUE_MAX)
> -             return ECGMAXVALUESEXCEEDED;
> -
> -     for (i = 0; i < controller->index && i < CG_VALUE_MAX; i++) {
> -             if (!strcmp(controller->values[i]->name, name))
> -                     return ECGVALUEEXISTS;
> -     }
> -
> -     cntl_value = calloc(1, sizeof(struct control_value));
> -
> -     if (!cntl_value)
> -             return ECGCONTROLLERCREATEFAILED;
> -
> -     strncpy(cntl_value->name, name,
> -                     sizeof(cntl_value->name));
> -     ret = snprintf(cntl_value->value,
> -       sizeof(cntl_value->value), "%" PRId64, value);
> +     int ret;
> +     char *val;
>  
> -     if (ret >= sizeof(cntl_value->value)) {
> -             free(cntl_value);
> -             return ECGINVAL;
> +     ret = asprintf(&val, "%"PRId64, value);
> +     if (ret < 0) {
> +             last_errno = errno;
> +             return ECGOTHER;
>       }
>  
> -     controller->values[controller->index] = cntl_value;
> -     controller->index++;
> -
> -     return 0;
> +     ret = cgroup_add_value_string(controller, name, val);
> +     free(val);
>  
> +     return ret;
>  }
>  
>  int cgroup_add_value_uint64(struct cgroup_controller *controller,
>                                       const char *name, u_int64_t value)
>  {
> -     int i;
> -     unsigned ret;
> -     struct control_value *cntl_value;
> -
> -     if (!controller)
> -             return ECGINVAL;
> -
> -     if (controller->index >= CG_VALUE_MAX)
> -             return ECGMAXVALUESEXCEEDED;
> -
> -     for (i = 0; i < controller->index && i < CG_VALUE_MAX; i++) {
> -             if (!strcmp(controller->values[i]->name, name))
> -                     return ECGVALUEEXISTS;
> -     }
> -
> -     cntl_value = calloc(1, sizeof(struct control_value));
> -
> -     if (!cntl_value)
> -             return ECGCONTROLLERCREATEFAILED;
> -
> -     strncpy(cntl_value->name, name, sizeof(cntl_value->name));
> -     ret = snprintf(cntl_value->value, sizeof(cntl_value->value),
> -                                             "%" PRIu64, value);
> +     int ret;
> +     char *val;
>  
> -     if (ret >= sizeof(cntl_value->value)) {
> -             free(cntl_value);
> -             return ECGINVAL;
> +     ret = asprintf(&val, "%" PRIu64, value);
> +     if (ret < 0) {
> +             last_errno = errno;
> +             return ECGOTHER;
>       }
>  
> -     controller->values[controller->index] = cntl_value;
> -     controller->index++;
> -
> -     return 0;
> +     ret = cgroup_add_value_string(controller, name, val);
> +     free(val);
>  
> +     return ret;
>  }
>  
>  int cgroup_add_value_bool(struct cgroup_controller *controller,
>                                               const char *name, bool value)
>  {
> -     int i;
> -     unsigned ret;
> -     struct control_value *cntl_value;
> -
> -     if (!controller)
> -             return ECGINVAL;
> -
> -     if (controller->index >= CG_VALUE_MAX)
> -             return ECGMAXVALUESEXCEEDED;
> -
> -     for (i = 0; i < controller->index && i < CG_VALUE_MAX; i++) {
> -             if (!strcmp(controller->values[i]->name, name))
> -                     return ECGVALUEEXISTS;
> -     }
> -
> -     cntl_value = calloc(1, sizeof(struct control_value));
> -
> -     if (!cntl_value)
> -             return ECGCONTROLLERCREATEFAILED;
> -
> -     strncpy(cntl_value->name, name, sizeof(cntl_value->name));
> +     int ret;
> +     char *val;
>  
>       if (value)
> -             ret = snprintf(cntl_value->value,
> -                             sizeof(cntl_value->value), "1");
> +             val = strdup("1");
>       else
> -             ret = snprintf(cntl_value->value,
> -                             sizeof(cntl_value->value), "0");
> -
> -     if (ret >= sizeof(cntl_value->value)) {
> -             free(cntl_value);
> -             return ECGINVAL;
> +             val = strdup("0");
> +     if (!val) {
> +             last_errno = errno;
> +             return ECGOTHER;
>       }
>  
> -     controller->values[controller->index] = cntl_value;
> -     controller->index++;
> +     ret = cgroup_add_value_string(controller, name, val);
> +     free(val);
>  
> -     return 0;
> +     return ret;
>  }
>  
>  int cgroup_compare_controllers(struct cgroup_controller *cgca,
> diff --git a/tests/.gitignore b/tests/.gitignore
> index b6aeef7..803c49a 100644
> --- a/tests/.gitignore
> +++ b/tests/.gitignore
> @@ -12,3 +12,4 @@ setuid
>  test_named_hierarchy
>  walk_task
>  walk_test
> +wrapper_test
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 4cdcbf3..0b77b42 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -4,7 +4,7 @@ INCLUDES = -I$(top_srcdir)/include
>  LDADD = $(top_builddir)/src/.libs/libcgroup.la
>  
>  # compile the tests, but do not install them
> -noinst_PROGRAMS = libcgrouptest01 libcg_ba setuid walk_test read_stats 
> walk_task get_controller get_mount_point proctest get_all_controller 
> get_variable_names test_named_hierarchy get_procs
> +noinst_PROGRAMS = libcgrouptest01 libcg_ba setuid walk_test read_stats 
> walk_task get_controller get_mount_point proctest get_all_controller 
> get_variable_names test_named_hierarchy get_procs wrapper_test
>  
>  libcgrouptest01_SOURCES=libcgrouptest01.c test_functions.c libcgrouptest.h
>  libcg_ba_SOURCES=libcg_ba.cpp
> @@ -19,7 +19,8 @@ get_all_controller_SOURCES=get_all_controller.c
>  get_variable_names_SOURCES=get_variable_names.c
>  test_named_hierarchy_SOURCES=test_named_hierarchy.c
>  get_procs_SOURCES=get_procs.c
> +wrapper_test_SOURCES=wrapper_test.c
>  
>  EXTRA_DIST = runlibcgrouptest.sh
>  
> -TESTS = runlibcgrouptest.sh
> +TESTS = wrapper_test runlibcgrouptest.sh
> diff --git a/tests/wrapper_test.c b/tests/wrapper_test.c
> new file mode 100644
> index 0000000..257ece3
> --- /dev/null
> +++ b/tests/wrapper_test.c
> @@ -0,0 +1,44 @@
> +#include <libcgroup.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include "../src/libcgroup-internal.h"
> +
> +int main()
> +{
> +     struct cgroup *cgroup;
> +     struct cgroup_controller *cgc;
> +     int fail = 0;
> +
> +     cgroup = cgroup_new_cgroup("test");
> +     cgc = cgroup_add_controller(cgroup, "cpu");
> +
> +     cgroup_add_value_int64(cgc, "cpu.shares", 2048);
> +     cgroup_add_value_uint64(cgc, "cpu.something", 1000);
> +     cgroup_add_value_bool(cgc, "cpu.bool", 1);
> +
> +     if (!strcmp(cgroup->controller[0]->values[0]->name, "cpu.shares")) {
> +             if (strcmp(cgroup->controller[0]->values[0]->value, "2048")) {
> +                     printf("FAIL for add_value_int\n");
> +                     fail = 1;
> +             }
> +     }
> +
> +     if (!strcmp(cgroup->controller[0]->values[1]->name, "cpu.something")) {
> +             if (strcmp(cgroup->controller[0]->values[1]->value, "1000")) {
> +                     printf("FAIL for add_value_uint\n");
> +                     fail = 1;
> +             }
> +     }
> +
> +     if (!strcmp(cgroup->controller[0]->values[2]->name, "cpu.bool")) {
> +             if (strcmp(cgroup->controller[0]->values[2]->value, "1")) {
> +                     printf("FAIL for add_value_bool\n");
> +                     fail = 1;
> +             }
> +     }
> +
> +     if (!fail)
> +             printf("PASS!\n");
> +
> +     return fail;
> +}


------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to