From e281f614721e765ae9064dfd9eca5b4f1f7ef71f Mon Sep 17 00:00:00 2001 From: Jan Vidar Krey Date: Sat, 25 Jul 2009 03:54:59 +0200 Subject: [PATCH] Add support for better pipelining of commands, in order to reduce the number of send() calls. --- src/hub.c | 2 ++ src/route.c | 16 ++++++++++++++-- src/route.h | 5 +++++ src/user.h | 3 ++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/hub.c b/src/hub.c index 3fedf87..7a4f9bf 100644 --- a/src/hub.c +++ b/src/hub.c @@ -312,9 +312,11 @@ void hub_send_hubinfo(struct hub_info* hub, struct user* u) void hub_send_handshake(struct hub_info* hub, struct user* u) { + user_flag_set(u, flag_pipeline); hub_send_support(hub, u); hub_send_sid(hub, u); hub_send_hubinfo(hub, u); + route_flush_pipeline(hub, u); if (!user_is_disconnecting(u)) { diff --git a/src/route.c b/src/route.c index f3586aa..6c41d88 100644 --- a/src/route.c +++ b/src/route.c @@ -97,7 +97,7 @@ int route_to_user(struct hub_info* hub, struct user* user, struct adc_message* m free(data); #endif - if (hub_sendq_is_empty(user->net.send_queue)) + if (hub_sendq_is_empty(user->net.send_queue) && !user_flag_get(user, flag_pipeline)) { /* Perform oportunistic write */ hub_sendq_add(user->net.send_queue, msg); @@ -108,12 +108,24 @@ int route_to_user(struct hub_info* hub, struct user* user, struct adc_message* m if (check_send_queue(hub, user, msg) >= 0) { hub_sendq_add(user->net.send_queue, msg); - user_net_io_want_write(user); + if (!user_flag_get(user, flag_pipeline)) + user_net_io_want_write(user); } } return 1; } +int route_flush_pipeline(struct hub_info* hub, struct user* u) +{ + if (hub_sendq_is_empty(u->net.send_queue)) + return 0; + + handle_net_write(u); + user_flag_unset(u, flag_pipeline); + return 1; +} + + int route_to_all(struct hub_info* hub, struct adc_message* command) /* iterate users */ { struct user* user = (struct user*) list_get_first(hub->users->list); diff --git a/src/route.h b/src/route.h index a2be8d8..e864f3b 100644 --- a/src/route.h +++ b/src/route.h @@ -25,6 +25,11 @@ */ extern int route_message(struct hub_info* hub, struct user* u, struct adc_message* msg); +/** + * Send queued messages. + */ +extern int route_flush_pipeline(struct hub_info* hub, struct user* u); + /** * Transmit message directly to one user. */ diff --git a/src/user.h b/src/user.h index ae15157..5eccd02 100644 --- a/src/user.h +++ b/src/user.h @@ -50,7 +50,8 @@ enum user_flags flag_want_read = 0x08000000, /** Need to read (SSL) */ flag_want_write = 0x10000000, /** Need to write (SSL) */ flag_user_list = 0x20000000, /** Send queue bypass (when receiving the send queue) */ - flag_nat = 0x40000000, /** nat override enabled */ + flag_pipeline = 0x40000000, /** Hub message pipelining */ + flag_nat = 0x80000000, /** nat override enabled */ }; enum user_quit_reason