Changeset 386
- Timestamp:
- 05/15/2007 06:24:17 AM (20 months ago)
- Files:
-
- 1 modified
-
trunk/xc_malloc.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/xc_malloc.c
r381 r386 16 16 }; 17 17 18 /* {{{ _xc_malloc_shm_t */ 19 struct _xc_malloc_shm_t { 20 xc_shm_handlers_t *handlers; 21 xc_shmsize_t size; 22 xc_shmsize_t memoffset; 23 #ifdef HAVE_XCACHE_TEST 24 HashTable blocks; 25 #endif 26 }; 27 /* }}} */ 28 18 29 #define CHECK(x, e) do { if ((x) == NULL) { zend_error(E_ERROR, "XCache: " e); goto err; } } while (0) 19 30 31 static void *xc_add_to_blocks(xc_mem_t *mem, void *p, size_t size) /* {{{ */ 32 { 33 #ifdef HAVE_XCACHE_TEST 34 if (p) { 35 zend_hash_add(&mem->shm->blocks, (void *) &p, sizeof(p), (void *) &size, sizeof(size), NULL); 36 } 37 #endif 38 return p; 39 } 40 /* }}} */ 41 static void xc_del_from_blocks(xc_mem_t *mem, void *p) /* {{{ */ 42 { 43 #ifdef HAVE_XCACHE_TEST 44 zend_hash_del(&mem->shm->blocks, (void *) &p, sizeof(p)); 45 #endif 46 } 47 /* }}} */ 48 20 49 static XC_MEM_MALLOC(xc_malloc_malloc) /* {{{ */ 21 50 { 22 return malloc(size);51 return xc_add_to_blocks(mem, malloc(size), size); 23 52 } 24 53 /* }}} */ 25 54 static XC_MEM_FREE(xc_malloc_free) /* {{{ return block size freed */ 26 55 { 56 xc_del_from_blocks(mem, (void *) p); 27 57 free((void *) p); 28 58 return 0; … … 31 61 static XC_MEM_CALLOC(xc_malloc_calloc) /* {{{ */ 32 62 { 33 return calloc(memb, size);63 return xc_add_to_blocks(mem, calloc(memb, size), size); 34 64 } 35 65 /* }}} */ 36 66 static XC_MEM_REALLOC(xc_malloc_realloc) /* {{{ */ 37 67 { 38 return realloc((void *) p, size);68 return xc_add_to_blocks(mem, realloc((void *) p, size), size); 39 69 } 40 70 /* }}} */ 41 71 static XC_MEM_STRNDUP(xc_malloc_strndup) /* {{{ */ 42 72 { 43 char *p = malloc(len);73 char *p = xc_add_to_blocks(mem, malloc(len), len); 44 74 if (!p) { 45 75 return NULL; … … 107 137 /* }}} */ 108 138 109 /* {{{ _xc_malloc_shm_t */110 struct _xc_malloc_shm_t {111 xc_shm_handlers_t *handlers;112 xc_shmsize_t size;113 xc_shmsize_t memoffset;114 };115 /* }}} */116 117 139 static XC_SHM_CAN_READONLY(xc_malloc_can_readonly) /* {{{ */ 118 140 { … … 122 144 static XC_SHM_IS_READWRITE(xc_malloc_is_readwrite) /* {{{ */ 123 145 { 146 HashPosition pos; 147 size_t *psize; 148 char **ptr; 149 150 zend_hash_internal_pointer_reset_ex(&shm->blocks, &pos); 151 while (zend_hash_get_current_data_ex(&shm->blocks, (void **) &psize, &pos) == SUCCESS) { 152 zend_hash_get_current_key_ex(&shm->blocks, (void *) &ptr, NULL, NULL, 0, &pos); 153 if ((char *) p >= *ptr && (char *) p < *ptr + *psize) { 154 return 1; 155 } 156 zend_hash_move_forward_ex(&shm->blocks, &pos); 157 } 158 124 159 return 0; 125 160 } … … 144 179 { 145 180 free(shm); 181 #ifdef HAVE_XCACHE_TEST 182 zend_hash_destroy(&shm->blocks); 183 #endif 146 184 return; 147 185 } … … 153 191 shm->size = size; 154 192 193 #ifdef HAVE_XCACHE_TEST 194 zend_hash_init(&shm->blocks, 64, NULL, NULL, 1); 195 #endif 155 196 return shm; 156 197 err:

