comparison src/alloc.c @ 83541:694bbb62a75d

Merged from emacs@sv.gnu.org Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-371 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-372 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-373 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-374 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-375 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-376 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-377 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-378 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-379 Merge from erc--emacs--21 * emacs@sv.gnu.org/emacs--devo--0--patch-380 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-381 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-382 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-383 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-384 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-385 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-386 Update from erc--emacs--22 * emacs@sv.gnu.org/emacs--devo--0--patch-387 Fix ERC bug introduced in last patch * emacs@sv.gnu.org/emacs--devo--0--patch-388 Update from erc--emacs--22 * emacs@sv.gnu.org/emacs--devo--0--patch-389 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-390 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-391 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-392 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-393 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-394 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-395 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-396 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-397 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-398 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-399 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-400 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-401 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-402 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-403 Rcirc update from Ryan Yeske * emacs@sv.gnu.org/emacs--devo--0--patch-404 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-405 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-406 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-407 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-408 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-409 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-410 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-411 Miscellaneous tq-related fixes. * emacs@sv.gnu.org/emacs--devo--0--patch-412 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-121 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-122 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-123 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-124 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-125 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-126 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-127 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-581
author Karoly Lorentey <lorentey@elte.hu>
date Sat, 14 Oct 2006 16:56:21 +0000
parents 02e39decdc84 07b45e10e844
children 6b25ef5cc276
comparison
equal deleted inserted replaced
83540:0c89a85addc3 83541:694bbb62a75d
76 #endif 76 #endif
77 #ifndef O_WRONLY 77 #ifndef O_WRONLY
78 #define O_WRONLY 1 78 #define O_WRONLY 1
79 #endif 79 #endif
80 80
81 #ifdef WINDOWSNT
82 #include <fcntl.h>
83 #include "w32.h"
84 #endif
85
81 #ifdef DOUG_LEA_MALLOC 86 #ifdef DOUG_LEA_MALLOC
82 87
83 #include <malloc.h> 88 #include <malloc.h>
84 /* malloc.h #defines this as size_t, at least in glibc2. */ 89 /* malloc.h #defines this as size_t, at least in glibc2. */
85 #ifndef __malloc_size_t 90 #ifndef __malloc_size_t
123 static pthread_mutex_t alloc_mutex; 128 static pthread_mutex_t alloc_mutex;
124 129
125 #define BLOCK_INPUT_ALLOC \ 130 #define BLOCK_INPUT_ALLOC \
126 do \ 131 do \
127 { \ 132 { \
128 pthread_mutex_lock (&alloc_mutex); \ 133 if (pthread_self () == main_thread) \
129 if (pthread_self () == main_thread) \ 134 BLOCK_INPUT; \
130 BLOCK_INPUT; \ 135 pthread_mutex_lock (&alloc_mutex); \
131 } \ 136 } \
132 while (0) 137 while (0)
133 #define UNBLOCK_INPUT_ALLOC \ 138 #define UNBLOCK_INPUT_ALLOC \
134 do \ 139 do \
135 { \ 140 { \
136 if (pthread_self () == main_thread) \ 141 pthread_mutex_unlock (&alloc_mutex); \
137 UNBLOCK_INPUT; \ 142 if (pthread_self () == main_thread) \
138 pthread_mutex_unlock (&alloc_mutex); \ 143 UNBLOCK_INPUT; \
139 } \ 144 } \
140 while (0) 145 while (0)
141 146
142 #else /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */ 147 #else /* SYSTEM_MALLOC || not HAVE_GTK_AND_PTHREAD */
143 148
4606 } 4611 }
4607 4612
4608 #endif /* GC_MARK_STACK != 0 */ 4613 #endif /* GC_MARK_STACK != 0 */
4609 4614
4610 4615
4616 /* Determine whether it is safe to access memory at address P. */
4617 int
4618 valid_pointer_p (p)
4619 void *p;
4620 {
4621 #ifdef WINDOWSNT
4622 return w32_valid_pointer_p (p, 16);
4623 #else
4624 int fd;
4625
4626 /* Obviously, we cannot just access it (we would SEGV trying), so we
4627 trick the o/s to tell us whether p is a valid pointer.
4628 Unfortunately, we cannot use NULL_DEVICE here, as emacs_write may
4629 not validate p in that case. */
4630
4631 if ((fd = emacs_open ("__Valid__Lisp__Object__", O_CREAT | O_WRONLY | O_TRUNC, 0666)) >= 0)
4632 {
4633 int valid = (emacs_write (fd, (char *)p, 16) == 16);
4634 emacs_close (fd);
4635 unlink ("__Valid__Lisp__Object__");
4636 return valid;
4637 }
4638
4639 return -1;
4640 #endif
4641 }
4611 4642
4612 /* Return 1 if OBJ is a valid lisp object. 4643 /* Return 1 if OBJ is a valid lisp object.
4613 Return 0 if OBJ is NOT a valid lisp object. 4644 Return 0 if OBJ is NOT a valid lisp object.
4614 Return -1 if we cannot validate OBJ. 4645 Return -1 if we cannot validate OBJ.
4615 This function can be quite slow, 4646 This function can be quite slow,
4618 int 4649 int
4619 valid_lisp_object_p (obj) 4650 valid_lisp_object_p (obj)
4620 Lisp_Object obj; 4651 Lisp_Object obj;
4621 { 4652 {
4622 void *p; 4653 void *p;
4623 #if !GC_MARK_STACK 4654 #if GC_MARK_STACK
4624 int fd;
4625 #else
4626 struct mem_node *m; 4655 struct mem_node *m;
4627 #endif 4656 #endif
4628 4657
4629 if (INTEGERP (obj)) 4658 if (INTEGERP (obj))
4630 return 1; 4659 return 1;
4632 p = (void *) XPNTR (obj); 4661 p = (void *) XPNTR (obj);
4633 if (PURE_POINTER_P (p)) 4662 if (PURE_POINTER_P (p))
4634 return 1; 4663 return 1;
4635 4664
4636 #if !GC_MARK_STACK 4665 #if !GC_MARK_STACK
4637 /* We need to determine whether it is safe to access memory at 4666 return valid_pointer_p (p);
4638 address P. Obviously, we cannot just access it (we would SEGV
4639 trying), so we trick the o/s to tell us whether p is a valid
4640 pointer. Unfortunately, we cannot use NULL_DEVICE here, as
4641 emacs_write may not validate p in that case. */
4642 if ((fd = emacs_open ("__Valid__Lisp__Object__", O_CREAT | O_WRONLY | O_TRUNC, 0666)) >= 0)
4643 {
4644 int valid = (emacs_write (fd, (char *)p, 16) == 16);
4645 emacs_close (fd);
4646 unlink ("__Valid__Lisp__Object__");
4647 return valid;
4648 }
4649
4650 return -1;
4651 #else 4667 #else
4652 4668
4653 m = mem_find (p); 4669 m = mem_find (p);
4654 4670
4655 if (m == MEM_NIL) 4671 if (m == MEM_NIL)
4656 return 0; 4672 {
4673 int valid = valid_pointer_p (p);
4674 if (valid <= 0)
4675 return valid;
4676
4677 if (SUBRP (obj))
4678 return 1;
4679
4680 return 0;
4681 }
4657 4682
4658 switch (m->type) 4683 switch (m->type)
4659 { 4684 {
4660 case MEM_TYPE_NON_LISP: 4685 case MEM_TYPE_NON_LISP:
4661 return 0; 4686 return 0;