[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/5] libxl: add @count to libxl_gc
Signed-off-by: Lai Jiangshan <laijs@xxxxxxxxxxxxxx> --- tools/libxl/libxl_internal.c | 22 ++++++++-------------- tools/libxl/libxl_internal.h | 2 ++ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 1db48b6..a79d841 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -32,8 +32,6 @@ void libxl__alloc_failed(libxl_ctx *ctx, const char *func, void libxl__ptr_add(libxl__gc *gc, void *ptr) { - int i; - if (!libxl__gc_is_real(gc)) return; @@ -41,22 +39,17 @@ void libxl__ptr_add(libxl__gc *gc, void *ptr) return; /* fast case: we have space in the array for storing the pointer */ - for (i = 0; i < gc->alloc_maxsize; i++) { - if (!gc->alloc_ptrs[i]) { - gc->alloc_ptrs[i] = ptr; - return; - } - } + if (gc->count < gc->alloc_maxsize) + gc->alloc_ptrs[gc->count++] = ptr; + int new_maxsize = gc->alloc_maxsize * 2 + 25; assert(new_maxsize < INT_MAX / sizeof(void*) / 2); gc->alloc_ptrs = realloc(gc->alloc_ptrs, new_maxsize * sizeof(void *)); if (!gc->alloc_ptrs) libxl__alloc_failed(CTX, __func__, new_maxsize, sizeof(void*)); - gc->alloc_ptrs[gc->alloc_maxsize++] = ptr; - - while (gc->alloc_maxsize < new_maxsize) - gc->alloc_ptrs[gc->alloc_maxsize++] = 0; + gc->alloc_ptrs[gc->count++] = ptr; + gc->alloc_maxsize = new_maxsize; return; } @@ -68,7 +61,7 @@ void libxl__free_all(libxl__gc *gc) assert(libxl__gc_is_real(gc)); - for (i = 0; i < gc->alloc_maxsize; i++) { + for (i = 0; i < gc->count; i++) { ptr = gc->alloc_ptrs[i]; gc->alloc_ptrs[i] = NULL; free(ptr); @@ -76,6 +69,7 @@ void libxl__free_all(libxl__gc *gc) free(gc->alloc_ptrs); gc->alloc_ptrs = 0; gc->alloc_maxsize = 0; + gc->count = 0; } void *libxl__zalloc(libxl__gc *gc, int bytes) @@ -107,7 +101,7 @@ void *libxl__realloc(libxl__gc *gc, void *ptr, size_t new_size) if (ptr == NULL) { libxl__ptr_add(gc, new_ptr); } else if (new_ptr != ptr && libxl__gc_is_real(gc)) { - for (i = 0; i < gc->alloc_maxsize; i++) { + for (i = 0; i < gc->count; i++) { if (gc->alloc_ptrs[i] == ptr) { gc->alloc_ptrs[i] = new_ptr; break; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 1bd23ff..d2100d8 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -294,6 +294,7 @@ struct libxl__poller { struct libxl__gc { /* mini-GC */ + int count; int alloc_maxsize; /* -1 means this is the dummy non-gc gc */ void **alloc_ptrs; libxl_ctx *owner; @@ -438,6 +439,7 @@ struct libxl__ao { }; #define LIBXL_INIT_GC(gc,ctx) do{ \ + (gc).count = 0; \ (gc).alloc_maxsize = 0; \ (gc).alloc_ptrs = 0; \ (gc).owner = (ctx); \ -- 1.7.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |