X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/2b2e97af7fdb9b456ab168f25a23208b428e4131..5d3b05b9b624b745527e84f605c9cb04c6831c78:/src/client.c diff --git a/src/client.c b/src/client.c index 844f0aa..7b2b5a0 100644 --- a/src/client.c +++ b/src/client.c @@ -76,6 +76,7 @@ static EVH check_pings; extern rb_bh *client_heap; extern rb_bh *lclient_heap; extern rb_bh *pclient_heap; +static rb_bh *away_heap = NULL; extern char current_uid[IDLEN]; @@ -117,12 +118,15 @@ init_client(void) * start off the check ping event .. -- adrian * Every 30 seconds is plenty -- db */ - client_heap = rb_bh_create(sizeof(struct Client), CLIENT_HEAP_SIZE); - lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE); - pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE); + client_heap = rb_bh_create(sizeof(struct Client), CLIENT_HEAP_SIZE, "client_heap"); + lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap"); + pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap"); + away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap"); + 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); } @@ -157,7 +161,6 @@ make_client(struct Client *from) client_p->localClient->lasttime = client_p->localClient->firsttime = rb_current_time(); client_p->localClient->F = NULL; - client_p->localClient->ctrlfd = -1; client_p->preClient = (struct PreClient *) rb_bh_alloc(pclient_heap); @@ -1553,10 +1556,10 @@ exit_local_server(struct Client *client_p, struct Client *source_p, struct Clien sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s was connected" " for %ld seconds. %d/%d sendK/recvK.", - source_p->name, rb_current_time() - source_p->localClient->firsttime, sendk, recvk); + source_p->name, (long) rb_current_time() - source_p->localClient->firsttime, sendk, recvk); ilog(L_SERVER, "%s was connected for %ld seconds. %d/%d sendK/recvK.", - source_p->name, rb_current_time() - source_p->localClient->firsttime, sendk, recvk); + source_p->name, (long) rb_current_time() - source_p->localClient->firsttime, sendk, recvk); if(has_id(source_p)) del_from_id_hash(source_p->id, source_p); @@ -1709,8 +1712,8 @@ void count_local_client_memory(size_t * count, size_t * local_client_memory_used) { size_t lusage; - rb_bh_usage(lclient_heap, count, NULL, &lusage); - *local_client_memory_used = lusage + (*count * (sizeof(MemBlock) + sizeof(struct Client))); + rb_bh_usage(lclient_heap, count, NULL, &lusage, NULL); + *local_client_memory_used = lusage + (*count * (sizeof(void *) + sizeof(struct Client))); } /* @@ -1720,10 +1723,10 @@ void count_remote_client_memory(size_t * count, size_t * remote_client_memory_used) { size_t lcount, rcount; - rb_bh_usage(lclient_heap, &lcount, NULL, NULL); - rb_bh_usage(client_heap, &rcount, NULL, NULL); + rb_bh_usage(lclient_heap, &lcount, NULL, NULL, NULL); + rb_bh_usage(client_heap, &rcount, NULL, NULL, NULL); *count = rcount - lcount; - *remote_client_memory_used = *count * (sizeof(MemBlock) + sizeof(struct Client)); + *remote_client_memory_used = *count * (sizeof(void *) + sizeof(struct Client)); } @@ -1845,9 +1848,9 @@ static rb_bh *user_heap; void initUser(void) { - user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE); + user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE, "user_heap"); if(!user_heap) - outofmemory(); + rb_outofmemory(); } /* @@ -1906,6 +1909,8 @@ make_server(struct Client *client_p) void free_user(struct User *user, struct Client *client_p) { + free_away(client_p); + if(--user->refcnt <= 0) { if(user->away) @@ -1936,21 +1941,21 @@ free_user(struct User *user, struct Client *client_p) } } -void -allocate_away(struct Client *client_p) -{ - if(client_p->user->away == NULL) - client_p->user->away = rb_bh_alloc(away_heap); -} - - -void -free_away(struct Client *client_p) -{ - if(client_p->user->away != NULL) { - rb_bh_free(away_heap, client_p->user->away); - client_p->user->away = NULL; - } +void +allocate_away(struct Client *client_p) +{ + if(client_p->user->away == NULL) + client_p->user->away = rb_bh_alloc(away_heap); +} + + +void +free_away(struct Client *client_p) +{ + if(client_p->user->away != NULL) { + rb_bh_free(away_heap, client_p->user->away); + client_p->user->away = NULL; + } } void @@ -2089,12 +2094,6 @@ close_connection(struct Client *client_p) client_p->localClient->F = NULL; } - if(-1 < client_p->localClient->ctrlfd) - { - rb_close(client_p->localClient->ctrlfd); - client_p->localClient->ctrlfd = -1; - } - rb_linebuf_donebuf(&client_p->localClient->buf_sendq); rb_linebuf_donebuf(&client_p->localClient->buf_recvq); detach_conf(client_p);