diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 4 | ||||
| -rw-r--r-- | src/alloc.c | 17 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 999dbf373d5..6b3a832e840 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2004-12-07 Jan Dj,Ad(Brv <jan.h.d@swipnet.se> | ||
| 2 | |||
| 3 | * alloc.c: Add comment about the reason for (UN)BLOCK_INPUT_ALLOC. | ||
| 4 | |||
| 1 | 2004-12-07 Stefan <monnier@iro.umontreal.ca> | 5 | 2004-12-07 Stefan <monnier@iro.umontreal.ca> |
| 2 | 6 | ||
| 3 | * eval.c (init_eval_once): Increase max_specpdl_size to 1000. | 7 | * eval.c (init_eval_once): Increase max_specpdl_size to 1000. |
diff --git a/src/alloc.c b/src/alloc.c index 4f3a0d6f2c4..0ea389117ba 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -91,6 +91,23 @@ extern __malloc_size_t __malloc_extra_blocks; | |||
| 91 | 91 | ||
| 92 | #if ! defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) | 92 | #if ! defined (SYSTEM_MALLOC) && defined (HAVE_GTK_AND_PTHREAD) |
| 93 | 93 | ||
| 94 | /* When GTK uses the file chooser dialog, different backends can be loaded | ||
| 95 | dynamically. One such a backend is the Gnome VFS backend that gets loaded | ||
| 96 | if you run Gnome. That backend creates several threads and also allocates | ||
| 97 | memory with malloc. | ||
| 98 | |||
| 99 | If Emacs sets malloc hooks (! SYSTEM_MALLOC) and the emacs_blocked_* | ||
| 100 | functions below are called from malloc, there is a chance that one | ||
| 101 | of these threads preempts the Emacs main thread and the hook variables | ||
| 102 | end up in a inconsistent state. So we have a mutex to prevent that (note | ||
| 103 | that the backend handles concurrent access to malloc within its own threads | ||
| 104 | but Emacs code running in the main thread is not included in that control). | ||
| 105 | |||
| 106 | When UNBLOCK_INPUT is called, revoke_input_signal may be called. If this | ||
| 107 | happens in one of the backend threads we will have two threads that tries | ||
| 108 | to run Emacs code at once, and the code is not prepared for that. | ||
| 109 | To prevent that, we only call BLOCK/UNBLOCK from the main thread. */ | ||
| 110 | |||
| 94 | static pthread_mutex_t alloc_mutex; | 111 | static pthread_mutex_t alloc_mutex; |
| 95 | pthread_t main_thread; | 112 | pthread_t main_thread; |
| 96 | 113 | ||