mirror of https://github.com/yandex/odyssey.git
machinarium: implement fast call stub
This commit is contained in:
parent
c60340d6cb
commit
a4ec75820d
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue