Commit | Line | Data |
---|---|---|
0f2d19dd JB |
1 | /* classes: h_files */ |
2 | ||
dee01b01 DH |
3 | #ifndef SCM_ROOT_H |
4 | #define SCM_ROOT_H | |
0f2d19dd | 5 | |
3b1df924 | 6 | /* Copyright (C) 1996,1998,2000,2001, 2002 Free Software Foundation, Inc. |
dee01b01 | 7 | * |
73be1d9e MV |
8 | * This library is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public | |
10 | * License as published by the Free Software Foundation; either | |
11 | * version 2.1 of the License, or (at your option) any later version. | |
dee01b01 | 12 | * |
73be1d9e | 13 | * This library is distributed in the hope that it will be useful, |
0f2d19dd | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
73be1d9e MV |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. | |
dee01b01 | 17 | * |
73be1d9e MV |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with this library; if not, write to the Free Software | |
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 | */ | |
d3a6bc94 | 22 | |
0f2d19dd JB |
23 | \f |
24 | ||
b4309c3c | 25 | #include "libguile/__scm.h" |
033c7f3d | 26 | #include "libguile/debug.h" |
e71575d9 | 27 | #include "libguile/throw.h" |
0f2d19dd JB |
28 | |
29 | \f | |
30 | ||
31 | #define scm_flo0 scm_sys_protects[0] | |
32 | #define scm_listofnull scm_sys_protects[1] | |
a44a9715 DH |
33 | #define scm_nullvect scm_sys_protects[2] |
34 | #define scm_nullstr scm_sys_protects[3] | |
35 | #define scm_keyword_obarray scm_sys_protects[4] | |
36 | #define scm_stand_in_procs scm_sys_protects[5] | |
37 | #define scm_object_whash scm_sys_protects[6] | |
38 | #define scm_permobjs scm_sys_protects[7] | |
39 | #define scm_asyncs scm_sys_protects[8] | |
40 | #define scm_protects scm_sys_protects[9] | |
41 | #define scm_properties_whash scm_sys_protects[10] | |
42 | #define scm_gc_registered_roots scm_sys_protects[11] | |
43 | #define scm_source_whash scm_sys_protects[12] | |
44 | #define SCM_NUM_PROTECTS 13 | |
0f2d19dd | 45 | |
33b001fd | 46 | SCM_API SCM scm_sys_protects[]; |
0f2d19dd JB |
47 | |
48 | \f | |
49 | ||
33b001fd | 50 | SCM_API scm_t_bits scm_tc16_root; |
010afa35 | 51 | |
f5710d53 MV |
52 | #define SCM_ROOTP(obj) SCM_SMOB_PREDICATE (scm_tc16_root, (obj)) |
53 | #define SCM_ROOT_STATE(root) ((scm_root_state *) SCM_SMOB_DATA (root)) | |
010afa35 MD |
54 | |
55 | typedef struct scm_root_state | |
0f2d19dd JB |
56 | { |
57 | SCM_STACKITEM * stack_base; | |
58 | jmp_buf save_regs_gc_mark; | |
59 | int errjmp_bad; | |
60 | ||
61 | SCM rootcont; | |
62 | SCM dynwinds; | |
d0f6ceb8 | 63 | |
033c7f3d | 64 | /* It is very inefficient to have this variable in the root state. */ |
92c2555f | 65 | scm_t_debug_frame *last_debug_frame; |
7b4e5a7a | 66 | |
0f2d19dd JB |
67 | SCM progargs; /* vestigial */ |
68 | SCM exitval; /* vestigial */ | |
69 | ||
70 | SCM cur_inp; | |
71 | SCM cur_outp; | |
72 | SCM cur_errp; | |
903073d5 | 73 | SCM cur_loadp; |
0f2d19dd | 74 | |
7b4e5a7a MV |
75 | SCM fluids; |
76 | ||
010afa35 MD |
77 | SCM handle; /* The root object for this root state */ |
78 | SCM parent; /* The parent root object */ | |
3b1df924 MV |
79 | |
80 | SCM active_asyncs; /* The thunks to be run at the next | |
81 | safe point */ | |
1ceead47 MV |
82 | SCM signal_asyncs; /* The pre-queued cells for signal handlers. |
83 | */ | |
8ee25fb9 MV |
84 | unsigned int block_asyncs; /* Non-zero means that asyncs should |
85 | not be run. */ | |
1ceead47 MV |
86 | unsigned int pending_asyncs; /* Non-zero means that asyncs might be pending. |
87 | */ | |
010afa35 | 88 | } scm_root_state; |
0f2d19dd JB |
89 | |
90 | #define scm_stack_base (scm_root->stack_base) | |
91 | #define scm_save_regs_gc_mark (scm_root->save_regs_gc_mark) | |
92 | #define scm_errjmp_bad (scm_root->errjmp_bad) | |
93 | ||
94 | #define scm_rootcont (scm_root->rootcont) | |
95 | #define scm_dynwinds (scm_root->dynwinds) | |
0f2d19dd | 96 | #define scm_progargs (scm_root->progargs) |
033c7f3d | 97 | #define scm_last_debug_frame (scm_root->last_debug_frame) |
0f2d19dd JB |
98 | #define scm_exitval (scm_root->exitval) |
99 | #define scm_cur_inp (scm_root->cur_inp) | |
100 | #define scm_cur_outp (scm_root->cur_outp) | |
101 | #define scm_cur_errp (scm_root->cur_errp) | |
903073d5 | 102 | #define scm_cur_loadp (scm_root->cur_loadp) |
3b1df924 | 103 | |
3d7f708f MV |
104 | #define scm_root ((scm_root_state *) SCM_THREAD_LOCAL_DATA) |
105 | #define scm_set_root(new_root) SCM_SET_THREAD_LOCAL_DATA (new_root) | |
0f2d19dd | 106 | |
010afa35 | 107 | \f |
0f2d19dd | 108 | |
33b001fd MV |
109 | SCM_API SCM scm_make_root (SCM parent); |
110 | SCM_API SCM scm_internal_cwdr (scm_t_catch_body body, | |
111 | void *body_data, | |
112 | scm_t_catch_handler handler, | |
113 | void *handler_data, | |
114 | SCM_STACKITEM *stack_start); | |
115 | SCM_API SCM scm_call_with_dynamic_root (SCM thunk, SCM handler); | |
116 | SCM_API SCM scm_dynamic_root (void); | |
117 | SCM_API SCM scm_apply_with_dynamic_root (SCM proc, SCM a1, SCM args, SCM handler); | |
118 | SCM_API void scm_init_root (void); | |
0f2d19dd | 119 | |
dee01b01 | 120 | #endif /* SCM_ROOT_H */ |
89e00824 ML |
121 | |
122 | /* | |
123 | Local Variables: | |
124 | c-file-style: "gnu" | |
125 | End: | |
126 | */ |