diff options
author | rwatson <rwatson@FreeBSD.org> | 2005-08-01 13:18:21 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2005-08-01 13:18:21 +0000 |
commit | 5032db6d57a3e8e30b4743d50494ce0fe47d0b96 (patch) | |
tree | 6861b8882f5a24ac61a27e8b26b5cdfc4d6acfcd /lib | |
parent | 05cc0ffa4ec239c44179d406376baa6a0cf25aaf (diff) | |
download | FreeBSD-src-5032db6d57a3e8e30b4743d50494ce0fe47d0b96.zip FreeBSD-src-5032db6d57a3e8e30b4743d50494ce0fe47d0b96.tar.gz |
Correct two libmemstat(3) bugs:
- Move memory_type_list flushing logic from memstat_mtl_free() to
_memstat_mtl_empty(), a libmemstat-internal function that can
be called from other parts of the library. Invoke
_memstat_mtl_empty() from memstat_mtl_free(), which also frees
the containing list structure.
Invoke _memstat_mtl_empty() instead of memstat_mtl_free() in
various error cases in memstat_malloc.c and memstat_uma.c, which
previously resulted in the list being freed prematurely.
- Reverse the order of updating the mt_kegfree and mt_free fields
of the memory_type in memstat_uma.c, otherwise keg free items
won't be counted properly for non-secondary zones.
MFC after: 3 days
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libmemstat/memstat.c | 9 | ||||
-rw-r--r-- | lib/libmemstat/memstat_internal.h | 1 | ||||
-rw-r--r-- | lib/libmemstat/memstat_malloc.c | 2 | ||||
-rw-r--r-- | lib/libmemstat/memstat_uma.c | 4 |
4 files changed, 12 insertions, 4 deletions
diff --git a/lib/libmemstat/memstat.c b/lib/libmemstat/memstat.c index f32541f..de8ae65 100644 --- a/lib/libmemstat/memstat.c +++ b/lib/libmemstat/memstat.c @@ -88,7 +88,7 @@ memstat_mtl_next(struct memory_type *mtp) } void -memstat_mtl_free(struct memory_type_list *list) +_memstat_mtl_empty(struct memory_type_list *list) { struct memory_type *mtp; @@ -96,6 +96,13 @@ memstat_mtl_free(struct memory_type_list *list) LIST_REMOVE(mtp, mt_list); free(mtp); } +} + +void +memstat_mtl_free(struct memory_type_list *list) +{ + + _memstat_mtl_empty(list); free(list); } diff --git a/lib/libmemstat/memstat_internal.h b/lib/libmemstat/memstat_internal.h index 838eaa6..7123518 100644 --- a/lib/libmemstat/memstat_internal.h +++ b/lib/libmemstat/memstat_internal.h @@ -116,6 +116,7 @@ struct memory_type_list { int mtl_error; }; +void _memstat_mtl_empty(struct memory_type_list *list); struct memory_type *_memstat_mt_allocate(struct memory_type_list *list, int allocator, const char *name); void _memstat_mt_reset_stats(struct memory_type *mtp); diff --git a/lib/libmemstat/memstat_malloc.c b/lib/libmemstat/memstat_malloc.c index 4170812..e94d005 100644 --- a/lib/libmemstat/memstat_malloc.c +++ b/lib/libmemstat/memstat_malloc.c @@ -175,7 +175,7 @@ retry: mtp = _memstat_mt_allocate(list, ALLOCATOR_MALLOC, mthp->mth_name); if (mtp == NULL) { - memstat_mtl_free(list); + _memstat_mtl_empty(list); free(buffer); list->mtl_error = MEMSTAT_ERROR_NOMEMORY; return (-1); diff --git a/lib/libmemstat/memstat_uma.c b/lib/libmemstat/memstat_uma.c index 6d5407c..f1fb710 100644 --- a/lib/libmemstat/memstat_uma.c +++ b/lib/libmemstat/memstat_uma.c @@ -176,7 +176,7 @@ retry: mtp = _memstat_mt_allocate(list, ALLOCATOR_UMA, uthp->uth_name); if (mtp == NULL) { - memstat_mtl_free(list); + _memstat_mtl_empty(list); free(buffer); list->mtl_error = MEMSTAT_ERROR_NOMEMORY; return (-1); @@ -218,8 +218,8 @@ retry: * items only in the primary zone. */ if (!(uthp->uth_zone_flags & UTH_ZONE_SECONDARY)) { - mtp->mt_free += mtp->mt_kegfree; mtp->mt_kegfree = uthp->uth_keg_free; + mtp->mt_free += mtp->mt_kegfree; } mtp->mt_free += mtp->mt_zonefree; } |