… | |
… | |
90 | PROTOTYPES: ENABLE |
90 | PROTOTYPES: ENABLE |
91 | |
91 | |
92 | BOOT: |
92 | BOOT: |
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 | |
97 | void |
98 | void |
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 | |
135 | SV * |
136 | SV * |
136 | interrupt (SV *loop_) |
137 | interrupt (SV *loop_) |
137 | CODE: |
138 | CODE: |
… | |
… | |
147 | void |
148 | void |
148 | lock (SV *loop_) |
149 | lock (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 | |