From b0a467e8d3064177e3ceaaa6c207a3e625d2125a Mon Sep 17 00:00:00 2001 From: brain Date: Sun, 29 May 2005 05:41:03 +0000 Subject: Highly optimized userrec saving 1.5k per user git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@1550 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/inspircd.h | 5 +++++ include/users.h | 6 +++--- src/commands.cpp | 7 +++++-- src/inspircd.cpp | 36 ++++++++++++++++++++++++++++++------ src/modules/m_timedbans.cpp | 1 + src/users.cpp | 4 ++-- 6 files changed, 46 insertions(+), 13 deletions(-) diff --git a/include/inspircd.h b/include/inspircd.h index 89ce61ae6..5afdc21fb 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -120,3 +120,8 @@ void AddOper(userrec* user); void DeleteOper(userrec* user); void handle_version(char **parameters, int pcnt, userrec *user); + +// userrec optimization stuff + +void AddServerName(std::string servername); +const char* FindServerNamePtr(std::string servername); diff --git a/include/users.h b/include/users.h index 2c3f2ffc0..a093e633e 100644 --- a/include/users.h +++ b/include/users.h @@ -146,7 +146,7 @@ class userrec : public connection /** The server the user is connected to. */ - char server[256]; + char* server; /** The user's away message. * If this string is empty, the user is not marked as away. @@ -325,10 +325,10 @@ class WhoWasUser { public: char nick[NICKMAX]; - char ident[16]; + char ident[IDENTMAX+1]; char dhost[160]; char host[160]; - char fullname[128]; + char fullname[MAXGECOS+1]; char server[256]; time_t signon; }; diff --git a/src/commands.cpp b/src/commands.cpp index 5ab25e4f0..692c5fc40 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -2406,7 +2406,7 @@ void handle_N(char token,char* params,serverrec* source,serverrec* reply, char* strlcpy(clientlist[nick]->nick, nick,NICKMAX); strlcpy(clientlist[nick]->host, host,160); strlcpy(clientlist[nick]->dhost, dhost,160); - strlcpy(clientlist[nick]->server, server,256); + clientlist[nick]->server = (char*)FindServerNamePtr(server); strlcpy(clientlist[nick]->ident, ident,IDENTMAX); // +1 char to compensate for tilde strlcpy(clientlist[nick]->fullname, gecos,MAXGECOS); strlcpy(clientlist[nick]->ip,ipaddr,16); @@ -3262,6 +3262,7 @@ void handle_link_packet(char* tcp_msg, char* tcp_host, serverrec *serv,char* tcp me[j]->connectors[k].SetServerName(servername); me[j]->connectors[k].SetDescription(serverdesc); me[j]->connectors[k].SetState(STATE_CONNECTED); + AddServerName(servername); NetSendMyRoutingTable(); return; } @@ -3328,7 +3329,6 @@ void handle_link_packet(char* tcp_msg, char* tcp_host, serverrec *serv,char* tcp } } - char Link_ServerName[1024]; char Link_IPAddr[1024]; char Link_Port[1024]; @@ -3358,6 +3358,7 @@ void handle_link_packet(char* tcp_msg, char* tcp_host, serverrec *serv,char* tcp if (!strcasecmp(serv->connectors[t].GetServerName().c_str(),servername)) { serv->connectors[t].SetState(STATE_CONNECTED); + AddServerName(servername); } } @@ -3424,6 +3425,7 @@ void handle_link_packet(char* tcp_msg, char* tcp_host, serverrec *serv,char* tcp char buffer[MAXBUF]; me[j]->connectors[k].SetDescription(serverdesc); me[j]->connectors[k].SetState(STATE_CONNECTED); + AddServerName(servername); snprintf(buffer,MAXBUF,"%s X 0",CreateSum().c_str()); serv->SendPacket(buffer,tcp_host); DoSync(me[j],tcp_host); @@ -3517,6 +3519,7 @@ void handle_link_packet(char* tcp_msg, char* tcp_host, serverrec *serv,char* tcp me[j]->connectors[k].SetDescription(serverdesc); me[j]->connectors[k].SetServerName(servername); me[j]->connectors[k].SetState(STATE_SERVICES); + AddServerName(servername); snprintf(buffer,MAXBUF,"%s X 0",CreateSum().c_str()); serv->SendPacket(buffer,servername); snprintf(buffer,MAXBUF,"%s s %s %s %lu :%s",CreateSum().c_str(),ServerName,Link_SendPass,LinkPort,ServerDesc); diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 47f699a91..9dc99857b 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -127,6 +127,7 @@ typedef nspace::hash_map, irc::InAddr_Has typedef nspace::hash_map, irc::StrHashComp> whowas_hash; typedef std::deque command_table; typedef std::map autoconnects; +typedef std::vector servernamelist; // This table references users by file descriptor. // its an array to make it VERY fast, as all lookups are referenced @@ -149,6 +150,7 @@ file_cache RULES; address_cache IP; ClassVector Classes; +servernamelist servernames; struct linger linger = { 0 }; char MyExecutable[1024]; @@ -179,6 +181,26 @@ void AddOper(userrec* user) all_opers.push_back(user); } +void AddServerName(std::string servername) +{ + for (servernamelist::iterator a = servernames.begin(); a < servernames.end(); a++) + { + if (*a == servername) + return; + } + servernames.push_back(servername); +} + +const char* FindServerNamePtr(std::string servername) +{ + for (servernamelist::iterator a = servernames.begin(); a < servernames.end(); a++) + { + if (*a == servername) + return a->c_str(); + } + return ""; +} + void DeleteOper(userrec* user) { for (std::vector::iterator a = all_opers.begin(); a < all_opers.end(); a++) @@ -1397,16 +1419,16 @@ void AddClient(int socket, char* host, int port, bool iscached, char* ip) log(DEBUG,"AddClient: %lu %s %d %s",(unsigned long)socket,host,port,ip); clientlist[tempnick]->fd = socket; - strncpy(clientlist[tempnick]->nick, tn2,NICKMAX); - strncpy(clientlist[tempnick]->host, host,160); - strncpy(clientlist[tempnick]->dhost, host,160); - strncpy(clientlist[tempnick]->server, ServerName,256); - strncpy(clientlist[tempnick]->ident, "unknown",IDENTMAX); + strlcpy(clientlist[tempnick]->nick, tn2,NICKMAX); + strlcpy(clientlist[tempnick]->host, host,160); + strlcpy(clientlist[tempnick]->dhost, host,160); + clientlist[tempnick]->server = (char*)FindServerNamePtr(ServerName); + strlcpy(clientlist[tempnick]->ident, "unknown",IDENTMAX); clientlist[tempnick]->registered = 0; clientlist[tempnick]->signon = TIME+dns_timeout; clientlist[tempnick]->lastping = 1; clientlist[tempnick]->port = port; - strncpy(clientlist[tempnick]->ip,ip,16); + strlcpy(clientlist[tempnick]->ip,ip,16); // set the registration timeout for this user unsigned long class_regtimeout = 90; @@ -2586,6 +2608,8 @@ int InspIRCd(char** argv, int argc) } log(DEBUG,"InspIRCd: startup: read config"); + AddServerName(ServerName); + int clientportcount = 0, serverportcount = 0; for (count = 0; count < ConfValueEnum("bind",&config_f); count++) diff --git a/src/modules/m_timedbans.cpp b/src/modules/m_timedbans.cpp index 884a029b9..0265a1c5b 100644 --- a/src/modules/m_timedbans.cpp +++ b/src/modules/m_timedbans.cpp @@ -152,6 +152,7 @@ class ModuleTimedBans : public Module // falls into the abyss :p userrec* temp = new userrec; temp->fd = FD_MAGIC_NUMBER; + temp->server = ""; Srv->SendMode(setban,3,temp); delete temp; } diff --git a/src/users.cpp b/src/users.cpp index cf977dff2..60072ed0c 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -25,6 +25,7 @@ using namespace std; #include "helperfuncs.h" extern std::stringstream config_f; +extern char ServerName[MAXBUF]; extern time_t TIME; @@ -39,7 +40,7 @@ userrec::userrec() strcpy(dhost,""); strcpy(fullname,""); strcpy(modes,""); - strcpy(server,""); + server = (char*)FindServerNamePtr(ServerName); strcpy(awaymsg,""); strcpy(oper,""); reset_due = TIME; @@ -50,7 +51,6 @@ userrec::userrec() dns_done = false; recvq = ""; sendq = ""; - strcpy(result,""); for (int i = 0; i < MAXCHANS; i++) { this->chans[i].channel = NULL; -- cgit v1.2.3