diff --git a/src/mm_call.c b/src/mm_call.c index a10873d7..ee799886 100644 --- a/src/mm_call.c +++ b/src/mm_call.c @@ -14,7 +14,8 @@ mm_call_timer_cb(mm_timer_t *handle) mm_call_t *call = handle->arg; call->timedout = 1; call->status = ETIMEDOUT; - mm_scheduler_wakeup(call->fiber); + if (call->fiber) + mm_scheduler_wakeup(call->fiber); } static void @@ -23,7 +24,8 @@ mm_call_cancel_cb(void *obj, void *arg) mm_call_t *call = arg; (void)obj; call->status = ECANCELED; - mm_scheduler_wakeup(call->fiber); + if (call->fiber) + mm_scheduler_wakeup(call->fiber); } void @@ -55,3 +57,30 @@ mm_call(mm_call_t *call, call->arg = NULL; fiber->call_ptr = NULL; } + +void +mm_call_fast(mm_call_t *call, + mm_scheduler_t *scheduler, + void (*function)(void*), + void *arg) +{ + mm_fiber_t *fiber; + fiber = mm_scheduler_current(scheduler); + if (mm_fiber_is_cancelled(fiber)) + return; + + fiber->call_ptr = call; + call->fiber = fiber; + call->active = 1; + call->cancel_function = mm_call_cancel_cb; + call->arg = call; + call->timedout = 0; + call->status = 0; + + function(arg); + + call->active = 0; + call->cancel_function = NULL; + call->arg = NULL; + fiber->call_ptr = NULL; +} diff --git a/src/mm_call.h b/src/mm_call.h index 1a8ec8b9..5cc52858 100644 --- a/src/mm_call.h +++ b/src/mm_call.h @@ -22,6 +22,7 @@ struct mm_call_t { }; void mm_call(mm_call_t*, mm_scheduler_t*, mm_clock_t*, int); +void mm_call_fast(mm_call_t*, mm_scheduler_t*, void (*)(void*), void*); static inline int mm_call_is_active(mm_call_t *call) diff --git a/src/mm_read.c b/src/mm_read.c index d0869d08..cff2ac11 100644 --- a/src/mm_read.c +++ b/src/mm_read.c @@ -53,20 +53,18 @@ static int mm_read_default(mm_io_t *io, uint64_t time_ms) { mm_t *machine = machine = io->machine; - io->read_eof = 0; - -#if 0 io->handle.on_read = mm_read_cb; io->handle.on_read_arg = io; - mm_read_cb(&io->handle); - if (io->read_status != 0) { - mm_io_set_errno(io, io->read_status); + mm_call_fast(&io->write, &machine->scheduler, + (void(*)(void*))mm_read_cb, + &io->handle); + if (io->read.status != 0) { + mm_io_set_errno(io, io->read.status); return -1; } if (io->read_pos == io->read_size) return 0; -#endif /* subscribe for read event */ int rc; diff --git a/src/mm_write.c b/src/mm_write.c index 363d316c..67279c2e 100644 --- a/src/mm_write.c +++ b/src/mm_write.c @@ -64,17 +64,17 @@ mm_write(mm_io_t *io, char *buf, int size, uint64_t time_ms) io->write_size = size; io->write_pos = 0; -#if 0 io->handle.on_write = mm_write_cb; io->handle.on_write_arg = io; - mm_write_cb(&io->handle); + mm_call_fast(&io->write, &machine->scheduler, + (void(*)(void*))mm_write_cb, + &io->handle); if (io->write.status != 0) { mm_io_set_errno(io, io->write.status); return -1; } if (io->write_pos == io->write_size) return 0; -#endif /* subscribe for write event */ int rc;