machinarium: implement fast call stub

This commit is contained in:
Dmitry Simonenko 2017-04-20 15:08:56 +03:00
parent c60340d6cb
commit a4ec75820d
4 changed files with 40 additions and 12 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -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;

View File

@ -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;