From 441174202f21deff8366a8060b9e4eed4e7c29aa Mon Sep 17 00:00:00 2001 From: "Kim F. Storm" Date: Sun, 12 Jan 2003 15:40:23 +0000 Subject: [PATCH] (pure_alloc): Rewritten and simplified. --- src/ChangeLog | 7 ++++--- src/alloc.c | 44 ++++++++++++++++---------------------------- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 77468a9d14c..ff63eb318a3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,8 +1,9 @@ 2003-01-12 Kim F. Storm - * alloc.c (pure_alloc): Corrected last change; now align the - pointer and adjust the size rather than aligning the size and - adjusting the pointer. Use a goto to handle overflow exception. + * alloc.c (pure_alloc): Fixed 2003-01-10 changed (caused spurious + crashes). Code rewritten and simplified. Now directly aligns the + pointer and recalculates pure_bytes_used, rather than aligning the + size and adjusting the pointer. 2003-01-11 Kim F. Storm diff --git a/src/alloc.c b/src/alloc.c index f19c2328899..281288e69db 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3831,46 +3831,34 @@ pure_alloc (size, type) size_t size; int type; { - size_t nbytes; POINTER_TYPE *result; - char *beg; - - again: - beg = purebeg; - result = (POINTER_TYPE *) (beg + pure_bytes_used); - nbytes = ALIGN (size, sizeof (EMACS_INT)); + size_t alignment = sizeof (EMACS_INT); /* Give Lisp_Floats an extra alignment. */ if (type == Lisp_Float) { - POINTER_TYPE *orig = result; - size_t alignment; #if defined __GNUC__ && __GNUC__ >= 2 alignment = __alignof (struct Lisp_Float); #else alignment = sizeof (struct Lisp_Float); #endif - /* Make sure result is correctly aligned for a - Lisp_Float, which might need stricter alignment than - EMACS_INT. */ - result = (POINTER_TYPE *)ALIGN((EMACS_UINT)result, alignment); - nbytes += (char *)result - (char *)orig; - } - - if (pure_bytes_used + nbytes > pure_size) - { - /* Don't allocate a large amount here, - because it might get mmap'd and then its address - might not be usable. */ - purebeg = (char *) xmalloc (10000); - pure_size = 10000; - pure_bytes_used_before_overflow += pure_bytes_used; - pure_bytes_used = 0; - goto again; } - pure_bytes_used += nbytes; - return result; + again: + result = (POINTER_TYPE *) ALIGN ((EMACS_UINT)purebeg + pure_bytes_used, alignment); + pure_bytes_used = ((char *)result - (char *)purebeg) + size; + + if (pure_bytes_used <= pure_size) + return result; + + /* Don't allocate a large amount here, + because it might get mmap'd and then its address + might not be usable. */ + purebeg = (char *) xmalloc (10000); + pure_size = 10000; + pure_bytes_used_before_overflow += pure_bytes_used - size; + pure_bytes_used = 0; + goto again; } -- 2.39.2