X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/191ae1cf7cd2571277635b3b8e488e773ca5c9b9..b12f6e85a068462962d1bf012260e2b55aabd4e7:/src/alloc.c diff --git a/src/alloc.c b/src/alloc.c index c49d3b5bec..8aea81a0f7 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1,12 +1,12 @@ /* Storage allocation and gc for GNU Emacs Lisp interpreter. Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -127,21 +127,21 @@ extern __malloc_size_t __malloc_extra_blocks; static pthread_mutex_t alloc_mutex; -#define BLOCK_INPUT_ALLOC \ - do \ - { \ - if (pthread_self () == main_thread) \ - BLOCK_INPUT; \ - pthread_mutex_lock (&alloc_mutex); \ - } \ +#define BLOCK_INPUT_ALLOC \ + do \ + { \ + if (pthread_equal (pthread_self (), main_thread)) \ + BLOCK_INPUT; \ + pthread_mutex_lock (&alloc_mutex); \ + } \ while (0) -#define UNBLOCK_INPUT_ALLOC \ - do \ - { \ - pthread_mutex_unlock (&alloc_mutex); \ - if (pthread_self () == main_thread) \ - UNBLOCK_INPUT; \ - } \ +#define UNBLOCK_INPUT_ALLOC \ + do \ + { \ + pthread_mutex_unlock (&alloc_mutex); \ + if (pthread_equal (pthread_self (), main_thread)) \ + UNBLOCK_INPUT; \ + } \ while (0) #else /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */ @@ -266,7 +266,7 @@ Lisp_Object Vmemory_full; remapping on more recent systems because this is less important nowadays than in the days of small memories and timesharing. */ -EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = {1,}; +EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,}; #define PUREBEG (char *) pure #else /* HAVE_SHM */ @@ -1181,8 +1181,6 @@ emacs_blocked_free (ptr, ptr2) void *ptr; const void *ptr2; { - EMACS_INT bytes_used_now; - BLOCK_INPUT_ALLOC; #ifdef GC_MALLOC_CHECK @@ -1759,6 +1757,8 @@ init_strings () string_blocks = NULL; n_string_blocks = 0; string_free_list = NULL; + empty_unibyte_string = make_pure_string ("", 0, 0, 0); + empty_multibyte_string = make_pure_string ("", 0, 0, 1); } @@ -2482,6 +2482,9 @@ make_uninit_string (length) int length; { Lisp_Object val; + + if (!length) + return empty_unibyte_string; val = make_uninit_multibyte_string (length, length); STRING_SET_UNIBYTE (val); return val; @@ -2500,6 +2503,8 @@ make_uninit_multibyte_string (nchars, nbytes) if (nchars < 0) abort (); + if (!nbytes) + return empty_multibyte_string; s = allocate_string (); allocate_string_data (s, nchars, nbytes); @@ -3618,9 +3623,9 @@ mem_insert (start, end, type) { struct mem_node *c, *parent, *x; - if (start < min_heap_address) + if (min_heap_address == NULL || start < min_heap_address) min_heap_address = start; - if (end > max_heap_address) + if (max_heap_address == NULL || end > max_heap_address) max_heap_address = end; /* See where in the tree a node for START belongs. In this @@ -4259,9 +4264,14 @@ mark_maybe_pointer (p) { struct mem_node *m; - /* Quickly rule out some values which can't point to Lisp data. We - assume that Lisp data is aligned on even addresses. */ - if ((EMACS_INT) p & 1) + /* Quickly rule out some values which can't point to Lisp data. */ + if ((EMACS_INT) p % +#ifdef USE_LSB_TAG + 8 /* USE_LSB_TAG needs Lisp data to be aligned on multiples of 8. */ +#else + 2 /* We assume that Lisp data is aligned on even addresses. */ +#endif + ) return; m = mem_find (p);