diff options
Diffstat (limited to 'tests/disclaim_bench.c')
-rw-r--r-- | tests/disclaim_bench.c | 133 |
1 files changed, 76 insertions, 57 deletions
diff --git a/tests/disclaim_bench.c b/tests/disclaim_bench.c index df67bf4f..ea7ca094 100644 --- a/tests/disclaim_bench.c +++ b/tests/disclaim_bench.c @@ -1,10 +1,27 @@ -#include "gc_disclaim.h" -#include "atomic_ops.h" +/* + * Copyright (c) 2011 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + #include <assert.h> #include <stdlib.h> #include <stdio.h> #include <string.h> -#include <time.h> + +#include <time.h> // FIXME: It would be good not to use timing API by + // default (is it is not quite portable). + +#include "atomic_ops.h" +#include "gc_disclaim.h" static AO_t free_count = 0; @@ -16,11 +33,10 @@ struct testobj_s { void testobj_finalize(void *obj, void *carg) { -#define obj ((testobj_t)obj) AO_fetch_and_add1((AO_t *)carg); - assert(obj->i++ == 109); -#undef obj + assert(((testobj_t)obj)->i++ == 109); } + static struct GC_finalizer_closure fclos = { testobj_finalize, &free_count @@ -30,28 +46,33 @@ testobj_t testobj_new(int model) { testobj_t obj; switch (model) { - case 0: - obj = GC_malloc(sizeof(struct testobj_s)); - GC_register_finalizer_no_order(obj, testobj_finalize, &free_count, - NULL, NULL); - break; - case 1: - obj = GC_finalized_malloc(sizeof(struct testobj_s), &fclos); - break; - case 2: - obj = GC_malloc(sizeof(struct testobj_s)); - break; - default: - abort(); + case 0: + obj = GC_MALLOC(sizeof(struct testobj_s)); + GC_register_finalizer_no_order(obj, testobj_finalize, &free_count, + NULL, NULL); + break; + case 1: + obj = GC_finalized_malloc(sizeof(struct testobj_s), &fclos); + break; + case 2: + obj = GC_MALLOC(sizeof(struct testobj_s)); + break; + default: + exit(-1); } assert(obj->i == 0 && obj->keep_link == NULL); obj->i = 109; return obj; } - #define ALLOC_CNT (4*1024*1024) -#define KEEP_CNT ( 32*1024) +#define KEEP_CNT (32*1024) + +static char const *model_str[3] = { + "regular finalization", + "finalize on reclaim", + "no finalization" +}; int main(int argc, char **argv) { @@ -59,57 +80,55 @@ int main(int argc, char **argv) int model; testobj_t *keep_arr; double t; - static char const *model_str[3] = { - "regular finalization", - "finalize on reclaim", - "no finalization" - }; - GC_init(); + GC_INIT(); GC_init_finalized_malloc(); - /* Seed with time for distict usage patters over repeated runs. */ - srand48(time(NULL)); + /* Seed with time for distict usage patterns over repeated runs. */ + srand48(time(NULL)); // FIXME: not available on some targets - keep_arr = GC_malloc(sizeof(void *)*KEEP_CNT); + keep_arr = GC_MALLOC(sizeof(void *)*KEEP_CNT); if (argc == 1) { - char *buf = GC_malloc(strlen(argv[0]) + 3); - printf("\t\t\tfin. ratio time/s time/fin.\n"); - for (i = 0; i < 3; ++i) { - int st; - sprintf(buf, "%s %d", argv[0], i); - st = system(buf); - if (st != 0) - return st; - } - return 0; + char *buf = GC_MALLOC(strlen(argv[0]) + 3); + printf("\t\t\tfin. ratio time/s time/fin.\n"); + for (i = 0; i < 3; ++i) { + int st; + sprintf(buf, "%s %d", argv[0], i); // FIXME: Use snprintf + //FIXME: snprintf not available on WinCE + st = system(buf); // FIXME: is this available on all targets? + if (st != 0) + return st; + } + return 0; } if (argc == 2 && strcmp(argv[1], "--help") == 0) { - fprintf(stderr, - "Usage: %s FINALIZATION_MODEL\n" - "\t0 -- original finalization\n" - "\t1 -- finalization on reclaim\n" - "\t2 -- no finalization\n", argv[0]); - return 1; + fprintf(stderr, + "Usage: %s FINALIZATION_MODEL\n" + "\t0 -- original finalization\n" + "\t1 -- finalization on reclaim\n" + "\t2 -- no finalization\n", argv[0]); + return 1; } model = atoi(argv[1]); if (model < 0 || model > 2) - exit(2); - t = -clock(); + exit(2); + t = -clock(); // FIXME: not available on some targets? + // FIXME: don't use '-' on probably unsigned type for (i = 0; i < ALLOC_CNT; ++i) { - int k = lrand48() % KEEP_CNT; - keep_arr[k] = testobj_new(model); + int k = lrand48() % KEEP_CNT; // FIXME: not available on some targets + keep_arr[k] = testobj_new(model); } + GC_gcollect(); - t += clock(); - t /= CLOCKS_PER_SEC; + + t += clock(); // FIXME: not available on some targets? + t /= CLOCKS_PER_SEC; // FIXME: not available on some targets if (model < 2) - printf("%20s: %12.4lf %12lg %12lg\n", model_str[model], - free_count/(double)ALLOC_CNT, t, t/free_count); + printf("%20s: %12.4lf %12lg %12lg\n", model_str[model], + free_count/(double)ALLOC_CNT, t, t/free_count); else - printf("%20s: 0 %12lg N/A\n", - model_str[model], t); - + printf("%20s: 0 %12lg N/A\n", // FIXME: Use \t + model_str[model], t); return 0; } |