ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro.xs
Revision: 1.6
Committed: Sat Jul 14 22:14:21 2001 UTC (22 years, 9 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +0 -0 lines
State: FILE REMOVED
Log Message:
*** empty log message ***

File Contents

# Content
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 typedef struct coro {
6 U8 dowarn;
7
8 PERL_SI *curstackinfo;
9 AV *curstack;
10 AV *mainstack;
11 SV **stack_sp;
12 SV **curpad;
13 SV **stack_base;
14 SV **stack_max;
15 SV **tmps_stack;
16 I32 tmps_floor;
17 I32 tmps_ix;
18 I32 tmps_max;
19 I32 *markstack;
20 I32 *markstack_ptr;
21 I32 *markstack_max;
22 I32 *scopestack;
23 I32 scopestack_ix;
24 I32 scopestack_max;
25 ANY *savestack;
26 I32 savestack_ix;
27 I32 savestack_max;
28 OP **retstack;
29 I32 retstack_ix;
30 I32 retstack_max;
31
32 SV *proc;
33 } *Coro;
34
35 #define SAVE(c) \
36 c->dowarn = PL_dowarn; \
37 c->curstackinfo = PL_curstackinfo; \
38 c->curstack = PL_curstack; \
39 c->mainstack = PL_mainstack; \
40 c->stack_sp = PL_stack_sp; \
41 c->curpad = PL_curpad; \
42 c->stack_base = PL_stack_base; \
43 c->stack_max = PL_stack_max; \
44 c->tmps_stack = PL_tmps_stack; \
45 c->tmps_floor = PL_tmps_floor; \
46 c->tmps_ix = PL_tmps_ix; \
47 c->tmps_max = PL_tmps_max; \
48 c->markstack = PL_markstack; \
49 c->markstack_ptr = PL_markstack_ptr; \
50 c->markstack_max = PL_markstack_max; \
51 c->scopestack = PL_scopestack; \
52 c->scopestack_ix = PL_scopestack_ix; \
53 c->scopestack_max = PL_scopestack_max;\
54 c->savestack = PL_savestack; \
55 c->savestack_ix = PL_savestack_ix; \
56 c->savestack_max = PL_savestack_max; \
57 c->retstack = PL_retstack; \
58 c->retstack_ix = PL_retstack_ix; \
59 c->retstack_max = PL_retstack_max;
60
61 #define LOAD(c) \
62 PL_dowarn = c->dowarn; \
63 PL_curstackinfo = c->curstackinfo; \
64 PL_curstack = c->curstack; \
65 PL_mainstack = c->mainstack; \
66 PL_stack_sp = c->stack_sp; \
67 PL_curpad = c->curpad; \
68 PL_stack_base = c->stack_base; \
69 PL_stack_max = c->stack_max; \
70 PL_tmps_stack = c->tmps_stack; \
71 PL_tmps_floor = c->tmps_floor; \
72 PL_tmps_ix = c->tmps_ix; \
73 PL_tmps_max = c->tmps_max; \
74 PL_markstack = c->markstack; \
75 PL_markstack_ptr = c->markstack_ptr; \
76 PL_markstack_max = c->markstack_max; \
77 PL_scopestack = c->scopestack; \
78 PL_scopestack_ix = c->scopestack_ix; \
79 PL_scopestack_max = c->scopestack_max;\
80 PL_savestack = c->savestack; \
81 PL_savestack_ix = c->savestack_ix; \
82 PL_savestack_max = c->savestack_max; \
83 PL_retstack = c->retstack; \
84 PL_retstack_ix = c->retstack_ix; \
85 PL_retstack_max = c->retstack_max;
86
87 /* this is an EXACT copy of S_nuke_stacks in perl.c, which is unfortunately static */
88 STATIC void
89 S_nuke_stacks(pTHX)
90 {
91 while (PL_curstackinfo->si_next)
92 PL_curstackinfo = PL_curstackinfo->si_next;
93 while (PL_curstackinfo) {
94 PERL_SI *p = PL_curstackinfo->si_prev;
95 /* curstackinfo->si_stack got nuked by sv_free_arenas() */
96 Safefree(PL_curstackinfo->si_cxstack);
97 Safefree(PL_curstackinfo);
98 PL_curstackinfo = p;
99 }
100 Safefree(PL_tmps_stack);
101 Safefree(PL_markstack);
102 Safefree(PL_scopestack);
103 Safefree(PL_savestack);
104 Safefree(PL_retstack);
105 }
106
107 MODULE = Coro PACKAGE = Coro
108
109 PROTOTYPES: ENABLE
110
111 Coro
112 _newprocess(proc)
113 SV * proc
114 PROTOTYPE: &
115 CODE:
116 Coro coro;
117
118 New (0, coro, 1, struct coro);
119
120 coro->mainstack = 0; /* actual work is done inside _transfer */
121 coro->proc = SvREFCNT_inc (proc);
122
123 RETVAL = coro;
124 OUTPUT:
125 RETVAL
126
127 void
128 _transfer(prev,next)
129 Coro prev
130 Coro next
131 CODE:
132
133 PUTBACK;
134 SAVE (prev);
135
136 if (next->mainstack) /* this is, in theory, unnecessary overhead */
137 {
138 LOAD (next);
139 SPAGAIN;
140 }
141 else
142 {
143 init_stacks ();
144
145 ERRSV = newSVsv(&PL_sv_undef);
146 DEFSV = newSVsv(&PL_sv_undef);
147
148 SPAGAIN;
149 PUSHMARK(SP);
150 PUTBACK;
151 call_sv (next->proc, G_VOID | G_DISCARD | G_EVAL);
152
153 exit (0);
154
155 /*SPAGAIN;
156 SAVE (next);
157
158 LOAD (prev);
159 SPAGAIN;*/
160 }
161
162 void
163 DESTROY(coro)
164 Coro coro
165 CODE:
166
167 if (coro->mainstack)
168 {
169 struct coro temp;
170
171 PUTBACK;
172 SAVE((&temp));
173 LOAD(coro);
174
175 S_nuke_stacks ();
176 SvREFCNT_dec (ERRSV);
177 SvREFCNT_dec (DEFSV);
178
179 LOAD((&temp));
180 SPAGAIN;
181 }
182
183 SvREFCNT_dec (coro->proc);
184 Safefree (coro);
185
186