diff --git a/kalloc.c b/kalloc.c index 8499552..f5de41a 100644 --- a/kalloc.c +++ b/kalloc.c @@ -40,7 +40,8 @@ void *km_init2(void *km_par, size_t min_core_size) kmem_t *km; km = (kmem_t*)kcalloc(km_par, 1, sizeof(kmem_t)); km->par = km_par; - km->min_core_size = min_core_size > 0? min_core_size : 0x80000; + if (km_par) km->min_core_size = min_core_size > 0? min_core_size : ((kmem_t*)km_par)->min_core_size - 2; + else km->min_core_size = min_core_size > 0? min_core_size : 0x80000; return (void*)km; } @@ -183,6 +184,16 @@ void *krealloc(void *_km, void *ap, size_t n_bytes) // TODO: this can be made mo return q; } +void *krelocate(void *km, void *ap, size_t n_bytes) +{ + void *p; + if (km == 0 || ap == 0) return ap; + p = kmalloc(km, n_bytes); + memcpy(p, ap, n_bytes); + kfree(km, ap); + return p; +} + void km_stat(const void *_km, km_stat_t *s) { kmem_t *km = (kmem_t*)_km; @@ -203,3 +214,11 @@ void km_stat(const void *_km, km_stat_t *s) s->largest = s->largest > size? s->largest : size; } } + +void km_stat_print(const void *km) +{ + km_stat_t st; + km_stat(km, &st); + fprintf(stderr, "[km_stat] cap=%ld, avail=%ld, largest=%ld, n_core=%ld, n_block=%ld\n", + st.capacity, st.available, st.largest, st.n_blocks, st.n_cores); +} diff --git a/kalloc.h b/kalloc.h index 93bff5e..8cbfbd9 100644 --- a/kalloc.h +++ b/kalloc.h @@ -13,6 +13,7 @@ typedef struct { void *kmalloc(void *km, size_t size); void *krealloc(void *km, void *ptr, size_t size); +void *krelocate(void *km, void *ap, size_t n_bytes); void *kcalloc(void *km, size_t count, size_t size); void kfree(void *km, void *ptr); @@ -20,11 +21,16 @@ void *km_init(void); void *km_init2(void *km_par, size_t min_core_size); void km_destroy(void *km); void km_stat(const void *_km, km_stat_t *s); +void km_stat_print(const void *km); #ifdef __cplusplus } #endif +#define Kmalloc(km, type, cnt) ((type*)kmalloc((km), (cnt) * sizeof(type))) +#define Kcalloc(km, type, cnt) ((type*)kcalloc((km), (cnt), sizeof(type))) +#define Krealloc(km, type, ptr, cnt) ((type*)krealloc((km), (ptr), (cnt) * sizeof(type))) + #define KMALLOC(km, ptr, len) ((ptr) = (__typeof__(ptr))kmalloc((km), (len) * sizeof(*(ptr)))) #define KCALLOC(km, ptr, len) ((ptr) = (__typeof__(ptr))kcalloc((km), (len), sizeof(*(ptr)))) #define KREALLOC(km, ptr, len) ((ptr) = (__typeof__(ptr))krealloc((km), (ptr), (len) * sizeof(*(ptr)))) diff --git a/minimap.h b/minimap.h index ee7b613..ec07b3d 100644 --- a/minimap.h +++ b/minimap.h @@ -5,7 +5,7 @@ #include #include -#define MM_VERSION "2.24-r1164-dirty" +#define MM_VERSION "2.24-r1166-dirty" #define MM_F_NO_DIAG (0x001LL) // no exact diagonal hit #define MM_F_NO_DUAL (0x002LL) // skip pairs where query name is lexicographically larger than target name