1994-06-24 14:02:31 +00:00
|
|
|
/* $Id$ */
|
1989-12-18 13:31:20 +00:00
|
|
|
/*
|
|
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
|
|
*/
|
|
|
|
/* This file essentially describes how the mallink info block
|
|
|
|
is implemented.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define MIN_SIZE (1<<LOG_MIN_SIZE)
|
|
|
|
#define MAX_FLIST (LOG_MAX_SIZE - LOG_MIN_SIZE)
|
|
|
|
#if ALIGNMENT != 4 && ALIGNMENT != 8 && ALIGNMENT != 16
|
|
|
|
#error ALIGNMENT must be 4, 8 or 16
|
|
|
|
#elif ALIGNMENT % _EM_LSIZE
|
|
|
|
/* since calloc() does it's initialization in longs */
|
|
|
|
#error ALIGNMENT must be a multiple of the long size
|
|
|
|
#endif
|
|
|
|
#define align(n) (((n) + (ALIGNMENT - 1)) & ~(ALIGNMENT - 1))
|
|
|
|
|
|
|
|
union _inf {
|
|
|
|
union _inf *ptr;
|
1990-08-24 17:05:53 +00:00
|
|
|
size_type ui;
|
1989-12-18 13:31:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef union _inf mallink;
|
|
|
|
#define MAL_NULL ((mallink *)0)
|
|
|
|
|
|
|
|
/* Access macros; only these macros know where to find values.
|
|
|
|
They are also lvalues.
|
|
|
|
*/
|
|
|
|
#ifndef NON_STANDARD
|
|
|
|
#define OFF_SET 0
|
|
|
|
#else /* def NON_STANDARD */
|
|
|
|
#define OFF_SET 2
|
|
|
|
#endif /* NON_STANDARD */
|
|
|
|
|
|
|
|
#define _log_prev_of(ml) ((ml)[-1+OFF_SET]).ptr
|
|
|
|
#define _log_next_of(ml) ((ml)[-2+OFF_SET]).ptr
|
|
|
|
#define _phys_prev_of(ml) ((ml)[-3+OFF_SET]).ptr
|
|
|
|
#define _this_size_of(ml) ((ml)[-4+OFF_SET]).ui
|
|
|
|
#ifndef CHECK
|
|
|
|
#define N_WORDS 4
|
|
|
|
#else /* ifdef CHECK */
|
|
|
|
#define _checksum_of(ml) ((ml)[-5+OFF_SET]).ui
|
|
|
|
#define _print_of(ml) ((ml)[-6+OFF_SET]).ui
|
|
|
|
#define _mark_of(ml) ((ml)[-7+OFF_SET]).ui
|
|
|
|
#define N_WORDS 7
|
|
|
|
#endif /* CHECK */
|
|
|
|
|
1990-08-24 17:05:53 +00:00
|
|
|
#define mallink_size() (size_t) \
|
1989-12-18 13:31:20 +00:00
|
|
|
align((N_WORDS - OFF_SET) * sizeof (mallink))
|
|
|
|
|
|
|
|
#ifdef CHECK
|
|
|
|
#define set_mark(ml,e) (_mark_of(ml) = (e))
|
|
|
|
#define mark_of(ml) (_mark_of(ml))
|
|
|
|
|
|
|
|
#define set_checksum(ml,e) (_checksum_of(ml) = (e))
|
|
|
|
#define checksum_of(ml) (_checksum_of(ml))
|
|
|
|
#endif /* CHECK */
|
|
|
|
|
|
|
|
#define new_mallink(ml) ( _log_prev_of(ml) = 0, \
|
|
|
|
_log_next_of(ml) = 0, \
|
|
|
|
_phys_prev_of(ml) = 0, \
|
|
|
|
_this_size_of(ml) = 0 )
|
|
|
|
|
|
|
|
#define block_of_mallink(ml) ((void *)ml)
|
|
|
|
#define mallink_of_block(addr) ((mallink *)addr)
|
|
|
|
|
|
|
|
#define public extern
|
|
|
|
#define publicdata extern
|
|
|
|
#ifndef EXTERN
|
|
|
|
#define private static
|
|
|
|
#define privatedata static
|
|
|
|
#else /* def EXTERN */
|
|
|
|
#define private extern
|
|
|
|
#define privatedata
|
|
|
|
#endif /* EXTERN */
|
|
|
|
|
|
|
|
#ifdef ASSERT
|
|
|
|
public m_assert(const char *fn, int ln);
|
|
|
|
#define assert(b) (!(b) ? m_assert(__FILE__, __LINE__) : 0)
|
|
|
|
#else /* ndef ASSERT */
|
|
|
|
#define assert(b) 0
|
|
|
|
#endif /* ASSERT */
|