mirror of
https://github.com/matrix-construct/construct
synced 2024-11-29 18:22:50 +01:00
flood_recalc moved on ratbox3 event engine
This commit is contained in:
parent
60eb0cdc9c
commit
5a606a8f8c
3 changed files with 59 additions and 38 deletions
|
@ -48,7 +48,7 @@
|
|||
|
||||
extern PF read_ctrl_packet;
|
||||
extern PF read_packet;
|
||||
extern PF flood_recalc;
|
||||
extern EVH flood_recalc;
|
||||
extern void flood_endgrace(struct Client *);
|
||||
|
||||
#endif /* INCLUDED_packet_h */
|
||||
|
|
|
@ -126,6 +126,7 @@ init_client(void)
|
|||
rb_event_addish("check_pings", check_pings, NULL, 30);
|
||||
rb_event_addish("free_exited_clients", &free_exited_clients, NULL, 4);
|
||||
rb_event_addish("exit_aborted_clients", exit_aborted_clients, NULL, 1);
|
||||
rb_event_add("flood_recalc", flood_recalc, NULL, 1);
|
||||
|
||||
nd_dict = irc_dictionary_create(irccmp);
|
||||
}
|
||||
|
|
58
src/packet.c
58
src/packet.c
|
@ -172,36 +172,56 @@ flood_endgrace(struct Client *client_p)
|
|||
* once a second on any given client. We then attempt to flush some data.
|
||||
*/
|
||||
void
|
||||
flood_recalc(int fd, void *data)
|
||||
flood_recalc(void *unused)
|
||||
{
|
||||
struct Client *client_p = data;
|
||||
struct LocalUser *lclient_p = client_p->localClient;
|
||||
rb_dlink_node *ptr, *next;
|
||||
struct Client *client_p;
|
||||
|
||||
/* This can happen in the event that the client detached. */
|
||||
if(!lclient_p)
|
||||
return;
|
||||
RB_DLINK_FOREACH_SAFE(ptr, next, lclient_list.head)
|
||||
{
|
||||
client_p = ptr->data;
|
||||
|
||||
if(unlikely(IsMe(client_p)))
|
||||
continue;
|
||||
|
||||
if(unlikely(client_p->localClient == NULL))
|
||||
continue;
|
||||
|
||||
/* allow a bursting client their allocation per second, allow
|
||||
* a client whos flooding an extra 2 per second
|
||||
*/
|
||||
if(IsFloodDone(client_p))
|
||||
lclient_p->sent_parsed -= 2;
|
||||
client_p->localClient->sent_parsed -= 2;
|
||||
else
|
||||
lclient_p->sent_parsed = 0;
|
||||
client_p->localClient->sent_parsed = 0;
|
||||
|
||||
if(lclient_p->sent_parsed < 0)
|
||||
lclient_p->sent_parsed = 0;
|
||||
if(client_p->localClient->sent_parsed < 0)
|
||||
client_p->localClient->sent_parsed = 0;
|
||||
|
||||
if(--lclient_p->actually_read < 0)
|
||||
lclient_p->actually_read = 0;
|
||||
if(--client_p->localClient->actually_read < 0)
|
||||
client_p->localClient->actually_read = 0;
|
||||
|
||||
parse_client_queued(client_p);
|
||||
|
||||
if(IsAnyDead(client_p))
|
||||
return;
|
||||
if(unlikely(IsAnyDead(client_p)))
|
||||
continue;
|
||||
|
||||
/* and finally, reset the flood check */
|
||||
rb_setflush(fd, 1000, flood_recalc, client_p);
|
||||
}
|
||||
|
||||
RB_DLINK_FOREACH_SAFE(ptr, next, unknown_list.head)
|
||||
{
|
||||
client_p = ptr->data;
|
||||
|
||||
if(client_p->localClient == NULL)
|
||||
continue;
|
||||
|
||||
client_p->localClient->sent_parsed--;
|
||||
|
||||
if(client_p->localClient->sent_parsed < 0)
|
||||
client_p->localClient->sent_parsed = 0;
|
||||
|
||||
if(--client_p->localClient->actually_read < 0)
|
||||
client_p->localClient->actually_read = 0;
|
||||
|
||||
parse_client_queued(client_p);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue