Adapt GDB integration to newest patches
[bpt/guile.git] / libguile / async.h
1 /* classes: h_files */
2
3 #ifndef SCM_ASYNC_H
4 #define SCM_ASYNC_H
5
6 /* Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2008, 2009, 2011
7 * 2014 Free Software Foundation, Inc.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 3 of
12 * the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 * 02110-1301 USA
23 */
24
25 \f
26
27 #include "libguile/__scm.h"
28 #include "libguile/root.h"
29 #include "libguile/threads.h"
30
31 \f
32
33 SCM_API void scm_async_tick (void);
34 SCM_API void scm_switch (void);
35 SCM_API SCM scm_async (SCM thunk);
36 SCM_API SCM scm_async_mark (SCM a);
37 SCM_API SCM scm_system_async_mark (SCM a);
38 SCM_API SCM scm_system_async_mark_for_thread (SCM a, SCM thread);
39 SCM_INTERNAL void scm_i_queue_async_cell (SCM cell, scm_i_thread *);
40 SCM_INTERNAL int scm_i_setup_sleep (scm_i_thread *,
41 SCM obj, scm_i_pthread_mutex_t *m,
42 int fd);
43 SCM_INTERNAL void scm_i_reset_sleep (scm_i_thread *);
44 SCM_API SCM scm_run_asyncs (SCM list_of_a);
45 SCM_API SCM scm_noop (SCM args);
46 SCM_API SCM scm_call_with_blocked_asyncs (SCM proc);
47 SCM_API SCM scm_call_with_unblocked_asyncs (SCM proc);
48 SCM_API void *scm_c_call_with_blocked_asyncs (void *(*p) (void *d), void *d);
49 SCM_API void *scm_c_call_with_unblocked_asyncs (void *(*p) (void *d), void *d);
50 SCM_API void scm_dynwind_block_asyncs (void);
51 SCM_API void scm_dynwind_unblock_asyncs (void);
52
53 /* Critical sections */
54
55 /* XXX - every critical section needs to be examined whether the
56 requirements for SCM_CRITICAL_SECTION_START/END are fulfilled. See
57 the manual.
58 */
59
60 /* Defined in threads.c. */
61 SCM_INTERNAL scm_i_pthread_mutex_t scm_i_critical_section_mutex;
62
63 SCM_API void scm_critical_section_start (void);
64 SCM_API void scm_critical_section_end (void);
65
66 #ifdef BUILDING_LIBGUILE
67
68 # define SCM_CRITICAL_SECTION_START \
69 do { \
70 scm_i_pthread_mutex_lock (&scm_i_critical_section_mutex); \
71 SCM_I_CURRENT_THREAD->block_asyncs++; \
72 SCM_I_CURRENT_THREAD->critical_section_level++; \
73 } while (0)
74 # define SCM_CRITICAL_SECTION_END \
75 do { \
76 SCM_I_CURRENT_THREAD->critical_section_level--; \
77 SCM_I_CURRENT_THREAD->block_asyncs--; \
78 scm_i_pthread_mutex_unlock (&scm_i_critical_section_mutex); \
79 scm_async_tick (); \
80 } while (0)
81
82 # define scm_i_pthread_mutex_lock_block_asyncs(m) \
83 do \
84 { \
85 SCM_I_CURRENT_THREAD->block_asyncs++; \
86 scm_i_pthread_mutex_lock (m); \
87 } \
88 while (0)
89
90 # define scm_i_pthread_mutex_unlock_unblock_asyncs(m) \
91 do \
92 { \
93 scm_i_pthread_mutex_unlock (m); \
94 SCM_I_CURRENT_THREAD->block_asyncs--; \
95 } \
96 while (0)
97
98 #else /* !BUILDING_LIBGUILE */
99
100 # define SCM_CRITICAL_SECTION_START scm_critical_section_start ()
101 # define SCM_CRITICAL_SECTION_END scm_critical_section_end ()
102
103 #endif /* !BUILDING_LIBGUILE */
104
105 SCM_INTERNAL void scm_init_async (void);
106
107 #endif /* SCM_ASYNC_H */
108
109 /*
110 Local Variables:
111 c-file-style: "gnu"
112 End:
113 */