Add support for better pipelining of commands, in order to reduce the number of send() calls.
This commit is contained in:
parent
bb27ff617c
commit
e281f61472
@ -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)
|
void hub_send_handshake(struct hub_info* hub, struct user* u)
|
||||||
{
|
{
|
||||||
|
user_flag_set(u, flag_pipeline);
|
||||||
hub_send_support(hub, u);
|
hub_send_support(hub, u);
|
||||||
hub_send_sid(hub, u);
|
hub_send_sid(hub, u);
|
||||||
hub_send_hubinfo(hub, u);
|
hub_send_hubinfo(hub, u);
|
||||||
|
route_flush_pipeline(hub, u);
|
||||||
|
|
||||||
if (!user_is_disconnecting(u))
|
if (!user_is_disconnecting(u))
|
||||||
{
|
{
|
||||||
|
14
src/route.c
14
src/route.c
@ -97,7 +97,7 @@ int route_to_user(struct hub_info* hub, struct user* user, struct adc_message* m
|
|||||||
free(data);
|
free(data);
|
||||||
#endif
|
#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 */
|
/* Perform oportunistic write */
|
||||||
hub_sendq_add(user->net.send_queue, msg);
|
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)
|
if (check_send_queue(hub, user, msg) >= 0)
|
||||||
{
|
{
|
||||||
hub_sendq_add(user->net.send_queue, msg);
|
hub_sendq_add(user->net.send_queue, msg);
|
||||||
|
if (!user_flag_get(user, flag_pipeline))
|
||||||
user_net_io_want_write(user);
|
user_net_io_want_write(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
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 */
|
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);
|
struct user* user = (struct user*) list_get_first(hub->users->list);
|
||||||
|
@ -25,6 +25,11 @@
|
|||||||
*/
|
*/
|
||||||
extern int route_message(struct hub_info* hub, struct user* u, struct adc_message* msg);
|
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.
|
* Transmit message directly to one user.
|
||||||
*/
|
*/
|
||||||
|
@ -50,7 +50,8 @@ enum user_flags
|
|||||||
flag_want_read = 0x08000000, /** Need to read (SSL) */
|
flag_want_read = 0x08000000, /** Need to read (SSL) */
|
||||||
flag_want_write = 0x10000000, /** Need to write (SSL) */
|
flag_want_write = 0x10000000, /** Need to write (SSL) */
|
||||||
flag_user_list = 0x20000000, /** Send queue bypass (when receiving the send queue) */
|
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
|
enum user_quit_reason
|
||||||
|
Loading…
Reference in New Issue
Block a user