Changeset 58
- Timestamp:
- 06/26/10 13:10:39 (3 years ago)
- Files:
-
- trunk/Makefile.am (modified) (2 diffs)
- trunk/configure.ac (modified) (1 diff)
- trunk/malloc.c (modified) (3 diffs)
- trunk/sol_compat.h (modified) (5 diffs)
- trunk/umem.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Makefile.am
r45 r58 2 2 noinst_PROGRAMS = umem_test umem_test2 umem_test3 3 3 4 libumem_la_LDFLAGS = -lpthread -ldl4 libumem_la_LDFLAGS = -lpthread 5 5 6 6 umem_test_SOURCES = umem_test.c … … 37 37 38 38 libumem_malloc_la_SOURCES = malloc.c 39 libumem_malloc_la_LDFLAGS = -lpthread - ldl -R$(libdir) -lumem39 libumem_malloc_la_LDFLAGS = -lpthread -R$(libdir) -lumem 40 40 41 41 man3_MANS = umem_alloc.3 umem_cache_create.3 umem_debug.3 trunk/configure.ac
r54 r58 22 22 ) 23 23 24 AC_CHECK_LIB(dl,dlopen) 24 25 25 26 AC_CHECK_HEADERS([sys/mman.h sys/sysmacros.h sys/time.h malloc.h]) trunk/malloc.c
r57 r58 227 227 } 228 228 229 int 230 posix_memalign(void **memptr, size_t alignment, size_t size) 231 { 232 *memptr = memalign(alignment, size); 233 if (*memptr) { 234 return 0; 235 } 236 return errno; 237 } 238 229 239 void * 230 240 valloc(size_t size) … … 398 408 return (malloc(newsize)); 399 409 410 if (newsize == 0) { 411 free(buf_arg); 412 return (NULL); 413 } 414 400 415 /* 401 416 * get the old data size without freeing the buffer … … 418 433 } 419 434 420 void __attribute__((constructor)) 421 __malloc_umem_init (void) 422 { 423 umem_startup(NULL, 0, 0, NULL, NULL); 424 } 425 435 trunk/sol_compat.h
r52 r58 110 110 111 111 #ifdef ECELERITY 112 # include " ec_atomic.h"112 # include "umem_atomic.h" 113 113 #else 114 114 # ifdef _WIN32 115 # define ec_atomic_inc(a) InterlockedIncrement(a)116 # define ec_atomic_inc64(a) InterlockedIncrement64(a)115 # define umem_atomic_inc(a) InterlockedIncrement(a) 116 # define umem_atomic_inc64(a) InterlockedIncrement64(a) 117 117 # elif defined(__MACH__) 118 118 # include <libkern/OSAtomic.h> 119 # define ec_atomic_inc(x) OSAtomicIncrement32Barrier((int32_t*)x)119 # define umem_atomic_inc(x) OSAtomicIncrement32Barrier((int32_t*)x) 120 120 # if !defined(__ppc__) 121 # define ec_atomic_inc64(x) OSAtomicIncrement64Barrier((int64_t*)x)121 # define umem_atomic_inc64(x) OSAtomicIncrement64Barrier((int64_t*)x) 122 122 # endif 123 123 # elif (defined(__i386__) || defined(__x86_64__)) && defined(__GNUC__) 124 static INLINE uint_t ec_atomic_cas(uint_t *mem, uint_t with, uint_t cmp)124 static INLINE uint_t umem_atomic_cas(uint_t *mem, uint_t with, uint_t cmp) 125 125 { 126 126 uint_t prev; … … 131 131 return prev; 132 132 } 133 static INLINE uint64_t ec_atomic_cas64(uint64_t *mem, uint64_t with,133 static INLINE uint64_t umem_atomic_cas64(uint64_t *mem, uint64_t with, 134 134 uint64_t cmp) 135 135 { … … 154 154 return prev; 155 155 } 156 static INLINE uint64_t ec_atomic_inc64(uint64_t *mem)156 static INLINE uint64_t umem_atomic_inc64(uint64_t *mem) 157 157 { 158 158 register uint64_t last; 159 159 do { 160 160 last = *mem; 161 } while ( ec_atomic_cas64(mem, last+1, last) != last);161 } while (umem_atomic_cas64(mem, last+1, last) != last); 162 162 return ++last; 163 163 } 164 # define ec_atomic_inc64 ec_atomic_inc64164 # define umem_atomic_inc64 umem_atomic_inc64 165 165 # else 166 166 # error no atomic solution for your platform 167 167 # endif 168 168 169 # ifndef ec_atomic_inc170 static INLINE uint_t ec_atomic_inc(uint_t *mem)169 # ifndef umem_atomic_inc 170 static INLINE uint_t umem_atomic_inc(uint_t *mem) 171 171 { 172 172 register uint_t last; 173 173 do { 174 174 last = *mem; 175 } while ( ec_atomic_cas(mem, last+1, last) != last);175 } while (umem_atomic_cas(mem, last+1, last) != last); 176 176 return ++last; 177 177 } 178 178 # endif 179 # ifndef ec_atomic_inc64179 # ifndef umem_atomic_inc64 180 180 /* yeah, it's not great. It's only used to bump failed allocation 181 181 * counts, so it is not critical right now. */ 182 182 extern pthread_mutex_t umem_ppc_64inc_lock; 183 static INLINE uint64_t ec_atomic_inc64(uint64_t *val)183 static INLINE uint64_t umem_atomic_inc64(uint64_t *val) 184 184 { 185 185 uint64_t rval; … … 190 190 return rval; 191 191 } 192 # define ec_atomic_inc64 ec_atomic_inc64192 # define umem_atomic_inc64 umem_atomic_inc64 193 193 # define NEED_64_LOCK 1 194 194 # endif … … 208 208 209 209 /* beware! umem only uses these atomic adds for incrementing by 1 */ 210 #define atomic_add_64(lvalptr, delta) ec_atomic_inc64(lvalptr)211 #define atomic_add_32_nv(a, b) ec_atomic_inc(a)210 #define atomic_add_64(lvalptr, delta) umem_atomic_inc64(lvalptr) 211 #define atomic_add_32_nv(a, b) umem_atomic_inc(a) 212 212 213 213 #ifndef NANOSEC trunk/umem.c
r56 r58 3194 3194 return (0); 3195 3195 } 3196 3197 void __attribute__((constructor)) 3198 __umem_init (void) 3199 { 3200 umem_startup(NULL, 0, 0, NULL, NULL); 3201 } 3202
