From d784c2ad199533bf0c868e753961692cb0463ac3 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Thu, 13 Jun 2019 11:55:01 +0300 Subject: [PATCH] odyssey: make restart read logic explicit in router attach --- sources/io.h | 6 ++++++ sources/router.c | 5 ++++- third_party/machinarium/sources/machinarium.h | 3 +++ third_party/machinarium/sources/read.c | 7 +++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sources/io.h b/sources/io.h index 9f15c0f3..d9fe5faf 100644 --- a/sources/io.h +++ b/sources/io.h @@ -84,6 +84,12 @@ od_io_detach(od_io_t *io) return machine_io_detach(io->io); } +static inline int +od_io_read_active(od_io_t *io) +{ + return machine_read_active(io->io); +} + static inline int od_io_read_start(od_io_t *io) { diff --git a/sources/router.c b/sources/router.c index 297f6a72..b50592b4 100644 --- a/sources/router.c +++ b/sources/router.c @@ -330,6 +330,7 @@ od_router_attach(od_router_t *router, od_config_t *config, od_client_t *client) od_client_pool_set(&route->client_pool, client, OD_CLIENT_QUEUE); /* get client server from route server pool */ + bool restart_read = false; od_server_t *server; for (;;) { @@ -349,6 +350,7 @@ od_router_attach(od_router_t *router, od_config_t *config, od_client_t *client) * unsubscribe from pending client read events during the time we wait * for an available server */ + restart_read = od_io_read_active(&client->io); od_io_read_stop(&client->io); od_route_unlock(route); @@ -401,7 +403,8 @@ attach: od_io_attach(&server->io); /* maybe restore read events subscription */ - od_io_read_start(&client->io); + if (restart_read) + od_io_read_start(&client->io); return OD_ROUTER_OK; } diff --git a/third_party/machinarium/sources/machinarium.h b/third_party/machinarium/sources/machinarium.h index 8c31b73a..d747d831 100644 --- a/third_party/machinarium/sources/machinarium.h +++ b/third_party/machinarium/sources/machinarium.h @@ -297,6 +297,9 @@ machine_iov_pending(machine_iov_t*); /* read */ +MACHINE_API int +machine_read_active(machine_io_t*); + MACHINE_API int machine_read_start(machine_io_t*, machine_cond_t*); diff --git a/third_party/machinarium/sources/read.c b/third_party/machinarium/sources/read.c index 11147afa..6fa344c1 100644 --- a/third_party/machinarium/sources/read.c +++ b/third_party/machinarium/sources/read.c @@ -182,3 +182,10 @@ machine_read(machine_io_t *obj, size_t size, uint32_t time_ms) } return msg; } + +MACHINE_API int +machine_read_active(machine_io_t *obj) +{ + mm_io_t *io = mm_cast(mm_io_t*, obj); + return io->on_read != NULL; +}