Use macros to hide some of the ugly casting required in the previously

applied fix for pointers with the high bit set.
This commit is contained in:
Fred Fish 1991-12-08 02:17:29 +00:00
parent 1cc27b5ed3
commit e59622b438
2 changed files with 19 additions and 5 deletions

View File

@ -1,3 +1,8 @@
Sat Dec 7 18:13:11 1991 Fred Fish (fnf at cygnus.com)
* gmalloc.c: Use macros to hide some of the ugly casting required
in the previously applied fix for pointers with high bits set.
Sat Dec 7 16:49:35 1991 John Gilmore (gnu at cygnus.com)
* Makefile.in: Roll VERSION to 4.3.1.

View File

@ -270,6 +270,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define BLOCKSIZE (1 << BLOCKLOG)
#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
/* The difference between two pointers is a signed int. On machines where
the data addresses have the high bit set, we need to ensure that the
difference becomes an unsigned int when we are using the address as an
integral value. In addition, when using with the '%' operator, the
sign of the result is machine dependent for negative values, so force
it to be treated as an unsigned int. */
#define ADDR2UINT(addr) ((unsigned int) ((char *) (addr) - (char *) NULL))
#define RESIDUAL(addr) ((unsigned int) (ADDR2UINT (addr) % BLOCKSIZE))
/* Determine the amount of memory spanned by the initial heap table
(not an absolute limit). */
#define HEAP (INT_BIT > 16 ? 4194304 : 65536)
@ -558,8 +568,7 @@ DEFUN(__free, (ptr), PTR ptr)
it is the first free fragment of this block. */
prev = (struct list *) ptr;
_heapinfo[block].busy.info.frag.nfree = 1;
_heapinfo[block].busy.info.frag.first = (unsigned int)
(((unsigned int)((char *) ptr - (char *) NULL)) % BLOCKSIZE >> type);
_heapinfo[block].busy.info.frag.first = RESIDUAL (ptr) >> type;
prev->next = _fraghead[type].next;
prev->prev = &_fraghead[type];
prev->prev->next = prev;
@ -656,7 +665,7 @@ DEFUN(align, (size), size_t size)
unsigned int adj;
result = (*__morecore)(size);
adj = (unsigned int) ((unsigned int)((char *) result - (char *) NULL)) % BLOCKSIZE;
adj = RESIDUAL (result);
if (adj != 0)
{
adj = BLOCKSIZE - adj;
@ -769,8 +778,8 @@ DEFUN(malloc, (size), size_t size)
next->next->prev = next->prev;
block = BLOCK(result);
if (--_heapinfo[block].busy.info.frag.nfree != 0)
_heapinfo[block].busy.info.frag.first = (unsigned int)
(((unsigned int)((char *) next->next - (char *) NULL)) % BLOCKSIZE) >> log;
_heapinfo[block].busy.info.frag.first =
RESIDUAL (next->next) >> log;
/* Update the statistics. */
++_chunks_used;