ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV-Loop-Async/Async.xs
(Generate patch)

Comparing EV-Loop-Async/Async.xs (file contents):
Revision 1.2 by root, Tue Jul 14 13:24:34 2009 UTC vs.
Revision 1.3 by root, Tue Jul 14 15:09:44 2009 UTC

90PROTOTYPES: ENABLE 90PROTOTYPES: ENABLE
91 91
92BOOT: 92BOOT:
93{ 93{
94 I_EV_API ("EV::Loop::Async"); 94 I_EV_API ("EV::Loop::Async");
95 CvNODEBUG_on (get_cv ("EV::Loop::Async::scope_lock", 0)); /* otherwise calling scope can be the debugger */
95} 96}
96 97
97void 98void
98_c_func (SV *loop) 99_c_func (SV *loop)
99 PPCODE: 100 PPCODE:
127 128
128 ev_set_userdata (loop, u); 129 ev_set_userdata (loop, u);
129 ev_set_invoke_pending_cb (loop, l_invoke); 130 ev_set_invoke_pending_cb (loop, l_invoke);
130 ev_set_loop_release_cb (loop, l_release, l_acquire); 131 ev_set_loop_release_cb (loop, l_release, l_acquire);
131 132
132 thread_create (&u->tid, l_run, (void *)loop); 133 pthread_create (&u->tid, 0, l_run, loop);
133} 134}
134 135
135SV * 136SV *
136interrupt (SV *loop_) 137interrupt (SV *loop_)
137 CODE: 138 CODE:
147void 148void
148lock (SV *loop_) 149lock (SV *loop_)
149 ALIAS: 150 ALIAS:
150 lock = 0 151 lock = 0
151 unlock = 1 152 unlock = 1
152 poke = 2 153 notify = 2
153 CODE: 154 CODE:
154{ 155{
155 struct ev_loop *loop = (struct ev_loop *)SvIVX (SvRV (loop_)); 156 struct ev_loop *loop = (struct ev_loop *)SvIVX (SvRV (loop_));
156 udat *u = ev_userdata (loop); 157 udat *u = ev_userdata (loop);
157 158
185 udat *u = ev_userdata (loop); 186 udat *u = ev_userdata (loop);
186 187
187 if (u) 188 if (u)
188 { 189 {
189 X_LOCK (u->lock); 190 X_LOCK (u->lock);
191 /* now thread is either in l_invoke, or around the blocking syscall */
192 pthread_cancel (u->tid);
193 pthread_join (u->tid, 0);
190 ev_async_send (loop, &u->async_w); 194 ev_async_send (loop, &u->async_w);
191 pthread_cancel (u->tid);
192 ev_async_stop (loop, &u->async_w); 195 ev_async_stop (loop, &u->async_w);
193 pthread_mutex_destroy (&u->lock); 196 pthread_mutex_destroy (&u->lock);
194 pthread_cond_destroy (&u->invoke_cv); 197 pthread_cond_destroy (&u->invoke_cv);
195 pthread_mutex_destroy (&u->invoke_mutex); 198 pthread_mutex_destroy (&u->invoke_mutex); /* TODO: locked by another thread... */
199 SvREFCNT_dec (u->interrupt);
196 Safefree (u); 200 Safefree (u);
197 SvREFCNT_dec (u->interrupt);
198 } 201 }
199} 202}
200 203
201 204
202 205

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines