public link_free_chunk(), unlink_free_chunk();
public mallink *first_present(), *search_free_list();
+#ifdef STORE
+#define in_store(ml) ((size_type)_log_prev_of(ml) & 01)
+#define set_store(ml, e) \
+ (_log_prev_of(ml) = (mallink *) \
+ ((e) ? (size_type) _log_prev_of(ml) | 01 : \
+ (size_type) _log_prev_of(ml) & ~01))
+#define log_prev_of(ml) (mallink *)((size_type)_log_prev_of(ml) & ~01)
+#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 log_prev_of(ml) (mallink *) (_log_prev_of(ml))
+#endif
#define set_log_next(ml,e) (_log_next_of(ml) = (e))
#define log_next_of(ml) (mallink *) (_log_next_of(ml))
+
#define ILL_BREAK (char *)(-1) /* funny failure value */
#endif
extern char *SBRK();
+privatedata char *freed;
#ifdef STORE
#define MAX_STORE 32
private do_free(), Xfree(), sell_out();
privatedata mallink *store[MAX_STORE];
-privatedata char *freed;
#endif STORE
char *
if (ml = *stp) {
*stp = log_next_of(ml);
+ set_store(ml, 0);
check_mallinks("malloc fast exit");
return block_of_mallink(ml);
}
#ifdef STORE
freed = 0;
- if (free_of(ml))
+ if (free_of(ml) || in_store(ml))
return; /* user frees free block */
if (size_of(ml) <= MAX_STORE*MIN_SIZE) {
/* return to store */
set_log_next(ml, *stp);
*stp = ml;
+ set_store(ml, 1);
check_mallinks("free fast exit");
}
else {
while (ml) {
*stp = log_next_of(ml);
+ set_store(ml, 0);
do_free(ml);
ml = *stp;
}