bug fix: the in_store test did not work when NON_STANDARD was defined,

because in this case, the bit tested resided in user area
This commit is contained in:
ceriel 1989-11-30 17:29:00 +00:00
parent ac489d50a3
commit 5e2915d143
4 changed files with 21 additions and 16 deletions

View file

@ -9,9 +9,8 @@
#define MIN_SIZE (1<<LOG_MIN_SIZE) #define MIN_SIZE (1<<LOG_MIN_SIZE)
#define MAX_FLIST (LOG_MAX_SIZE - LOG_MIN_SIZE) #define MAX_FLIST (LOG_MAX_SIZE - LOG_MIN_SIZE)
#if ALIGNMENT != 1 && ALIGNMENT != 2 && ALIGNMENT != 4 && ALIGNMENT != 8 &&\ #if ALIGNMENT != 4 && ALIGNMENT != 8 && ALIGNMENT != 16
ALIGNMENT != 16 ALIGNMENT must be 4, 8, or 16
ALIGNMENT must be a (small) power of two !!!
#endif #endif
#define align(n) (((n) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1)) #define align(n) (((n) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1))

View file

@ -11,18 +11,14 @@ public link_free_chunk(), unlink_free_chunk();
public mallink *first_present(), *search_free_list(); public mallink *first_present(), *search_free_list();
#ifdef STORE #ifdef STORE
#define in_store(ml) ((size_type)_log_prev_of(ml) & 01) #define in_store(ml) ((size_type)_phys_prev_of(ml) & STORE_BIT)
#define set_store(ml, e) \ #define set_store(ml, e) \
(_log_prev_of(ml) = (mallink *) \ (_phys_prev_of(ml) = (mallink *) \
((e) ? (size_type) _log_prev_of(ml) | 01 : \ ((e) ? (size_type) _phys_prev_of(ml) | STORE_BIT : \
(size_type) _log_prev_of(ml) & ~01)) (size_type) _phys_prev_of(ml) & ~STORE_BIT))
#define log_prev_of(ml) (mallink *)((size_type)_log_prev_of(ml) & ~01) #endif
#define set_log_prev(ml,e) \
(_log_prev_of(ml) = (mallink *)((char *)e + in_store(ml)))
#else
#define set_log_prev(ml,e) (_log_prev_of(ml) = (e)) #define set_log_prev(ml,e) (_log_prev_of(ml) = (e))
#define log_prev_of(ml) (mallink *) (_log_prev_of(ml)) #define log_prev_of(ml) (mallink *) (_log_prev_of(ml))
#endif
#define set_log_next(ml,e) (_log_next_of(ml) = (e)) #define set_log_next(ml,e) (_log_next_of(ml) = (e))
#define log_next_of(ml) (mallink *) (_log_next_of(ml)) #define log_next_of(ml) (mallink *) (_log_next_of(ml))

View file

@ -96,6 +96,7 @@ malloc(n)
} }
p = SBRK((int)req); p = SBRK((int)req);
assert((size_type)p == align((size_type)p));
if (p == ILL_BREAK) { if (p == ILL_BREAK) {
req = n + mallink_size(); req = n + mallink_size();
p = SBRK((int)req); p = SBRK((int)req);

View file

@ -8,8 +8,17 @@
*/ */
publicdata mallink *ml_last; publicdata mallink *ml_last;
#define __free_of(ml) ((size_type)_phys_prev_of(ml) & 01) #define FREE_BIT 01
#define __phys_prev_of(ml) (mallink *)((size_type)_phys_prev_of(ml) & ~01) #ifdef STORE
#define STORE_BIT 02
#define BITS (FREE_BIT|STORE_BIT)
#else
#define BITS (FREE_BIT)
#endif
#define __bits(ml) ((size_type)_phys_prev_of(ml) & BITS)
#define __free_of(ml) ((size_type)_phys_prev_of(ml) & FREE_BIT)
#define __phys_prev_of(ml) (mallink *)((size_type)_phys_prev_of(ml) & ~FREE_BIT)
#define prev_size_of(ml) ((char *)(ml) - \ #define prev_size_of(ml) ((char *)(ml) - \
(char *)__phys_prev_of(ml) - \ (char *)__phys_prev_of(ml) - \
mallink_size() \ mallink_size() \
@ -45,8 +54,8 @@ public Error();
#define set_free(ml,e) \ #define set_free(ml,e) \
(_phys_prev_of(ml) = (mallink *) \ (_phys_prev_of(ml) = (mallink *) \
((e) ? (size_type) _phys_prev_of(ml) | 01 : \ ((e) ? (size_type) _phys_prev_of(ml) | FREE_BIT : \
(size_type) _phys_prev_of(ml) & ~01)) (size_type) _phys_prev_of(ml) & ~FREE_BIT))
#define free_of(ml) (__free_of(ml)) #define free_of(ml) (__free_of(ml))
#define coalesce_forw(ml,nxt) ( unlink_free_chunk(nxt), \ #define coalesce_forw(ml,nxt) ( unlink_free_chunk(nxt), \