Mercurial > emacs
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; |
