[srvx-commits] commit: Add slab allocator; reduce delta with srvx-gs.
Brought to you by:
entrope
From: Michael P. <md...@tr...> - 2005-01-31 05:19:58
|
Revision: srvx--devo--1.3--patch-10 Archive: sr...@sr...--2005-srvx Creator: Michael Poole <md...@tr...> Date: Mon Jan 31 00:14:52 EST 2005 Standard-date: 2005-01-31 05:14:52 GMT New-files: src/.arch-ids/alloc-slab.c.id src/alloc-slab.c Modified-files: ChangeLog configure.in src/Makefile.am src/alloc-srvx.c src/chanserv.c src/chanserv.h src/common.h src/hash.h src/helpfile.c src/log.c src/main.c src/modcmd.c src/opserv.c src/proto-common.c src/proto-p10.c srvx.conf.example New-patches: sr...@sr...--2005-srvx/srvx--devo--1.3--patch-10 Summary: Add slab allocator; reduce delta with srvx-gs. Keywords: configure.in: Check for getpagesize(). Support --with-malloc=slab. src/Makefile.am: Add alloc-slab.c as an extra source file. src/alloc-srvx.c: Clean up srvx_free() slightly. Check for previously allocated blocks. srvx.conf.example, src/chanserv.c, src/main.c, src/modcmd.c, src/proto-p10.c: Apply patches to bring closer to srvx-gs branch. src/log.c: Assert and _exit() on fatal log messages. src/opserv.c: Clarify logic for modes to set on join floods. src/proto-common.c: Accept off-channel commands in registered channels. * added files src/.arch-ids/alloc-slab.c.id src/alloc-slab.c {arch}/srvx/srvx--devo/srvx--devo--1.3/sr...@sr...--2005-srvx/patch-log/patch-10 * modified files --- orig/ChangeLog +++ mod/ChangeLog @@ -2,6 +2,39 @@ # arch-tag: aut...@sr...--2005-srvx/srvx--devo--1.3 # +2005-01-31 05:14:52 GMT Michael Poole <md...@tr...> patch-10 + + Summary: + Add slab allocator; reduce delta with srvx-gs. + Revision: + srvx--devo--1.3--patch-10 + + configure.in: Check for getpagesize(). Support --with-malloc=slab. + + src/Makefile.am: Add alloc-slab.c as an extra source file. + + src/alloc-srvx.c: Clean up srvx_free() slightly. Check for previously + allocated blocks. + + srvx.conf.example, src/chanserv.c, src/main.c, src/modcmd.c, + src/proto-p10.c: Apply patches to bring closer to srvx-gs branch. + + src/log.c: Assert and _exit() on fatal log messages. + + src/opserv.c: Clarify logic for modes to set on join floods. + + src/proto-common.c: Accept off-channel commands in registered channels. + + new files: + src/.arch-ids/alloc-slab.c.id src/alloc-slab.c + + modified files: + ChangeLog configure.in src/Makefile.am src/alloc-srvx.c + src/chanserv.c src/chanserv.h src/common.h src/hash.h + src/helpfile.c src/log.c src/main.c src/modcmd.c src/opserv.c + src/proto-common.c src/proto-p10.c srvx.conf.example + + 2005-01-26 21:16:54 GMT Michael Poole <md...@tr...> patch-9 Summary: --- orig/configure.in +++ mod/configure.in @@ -79,7 +79,7 @@ fi dnl We have fallbacks in case these are missing, so just check for them. -AC_CHECK_FUNCS(bcopy memcpy memset strdup strerror strsignal localtime_r setrlimit inet_ntoa getopt getopt_long regcomp regexec regfree sysconf,,) +AC_CHECK_FUNCS(bcopy getpagesize memcpy memset strdup strerror strsignal localtime_r setrlimit inet_ntoa getopt getopt_long regcomp regexec regfree sysconf,,) dnl Check for absolutely required library functions. AC_CHECK_FUNCS(select socket strcspn strspn strtod strtoul,,AC_MSG_ERROR([a required function was not found. srvx build will fail.])) @@ -180,6 +180,10 @@ AC_MSG_RESULT(srvx) AC_DEFINE(WITH_MALLOC_SRVX, 1, [Define if using the srvx internal debug allocator]) MODULE_OBJS="$MODULE_OBJS alloc-srvx.\$(OBJEXT)" +elif test "x$withval" = "xslab" ; then + AC_MSG_RESULT(slab) + AC_DEFINE(WITH_MALLOC_SLAB, 1, [Define if using the slab internal debug allocator]) + MODULE_OBJS="$MODULE_OBJS alloc-slab.\$(OBJEXT)" else AC_MSG_ERROR([Unknown malloc type $withval]) fi --- orig/src/Makefile.am +++ mod/src/Makefile.am @@ -22,7 +22,7 @@ mv $$TMPFILE arch-version.h ; \ fi -EXTRA_srvx_SOURCES = alloc-srvx.c proto-bahamut.c proto-common.c proto-p10.c mod-snoop.c mod-memoserv.c mod-helpserv.c mod-sockcheck.c +EXTRA_srvx_SOURCES = alloc-slab.c alloc-srvx.c proto-bahamut.c proto-common.c proto-p10.c mod-snoop.c mod-memoserv.c mod-helpserv.c mod-sockcheck.c srvx_LDADD = @MODULE_OBJS@ srvx_DEPENDENCIES = @MODULE_OBJS@ srvx_SOURCES = \ --- orig/src/alloc-srvx.c +++ mod/src/alloc-srvx.c @@ -15,6 +15,7 @@ */ #include "common.h" +#include "log.h" #undef malloc #undef free @@ -60,6 +61,11 @@ block = malloc(sizeof(*block) + size + sizeof(redzone)); assert(block != NULL); + if (block->magic == ALLOC_MAGIC && block->file_id < file_ids_used) { + /* Only report the error, due to possible false positives. */ + log_module(MAIN_LOG, LOG_WARNING, "Detected possible reallocation: %p (called by %s:%u/%u; allocated by %u:%u/%u).", + block, file, line, size, block->file_id, block->line, block->size); + } memset(block, 0, sizeof(*block) + size); memcpy((char*)(block + 1) + size, redzone, sizeof(redzone)); block->file_id = get_file_id(file); @@ -116,23 +122,21 @@ } void -srvx_free(const char *file, unsigned int line, void *ptr) +srvx_free(UNUSED_ARG(const char *file), UNUSED_ARG(unsigned int line), void *ptr) { struct alloc_header *block; size_t size; if (!ptr) return; + verify(ptr); block = (struct alloc_header *)ptr - 1; - assert(block->magic == ALLOC_MAGIC); - assert(0 == memcmp((char*)(block + 1) + block->size, redzone, sizeof(redzone))); size = block->size; memset(block + 1, 0xde, size); block->magic = FREE_MAGIC; free(block); alloc_count--; alloc_size -= size; - (void)file; (void)line; } void --- orig/src/chanserv.c +++ mod/src/chanserv.c @@ -1684,7 +1684,8 @@ return 0; } - if(!IsHelping(user) && (!(mn = GetUserMode(channel, user)) || !(mn->modes & MODE_CHANOP))) + if(!IsHelping(user) + && (!(mn = GetUserMode(channel, user)) || !(mn->modes & MODE_CHANOP))) { reply("CSMSG_MUST_BE_OPPED", channel->name); return 0; @@ -4456,18 +4457,21 @@ { struct suspended *suspended = data; struct chanNode *channel; - struct mod_chanmode change; if(!suspended->expires || (now < suspended->expires)) suspended->revoked = now; channel = suspended->cData->channel; suspended->cData->channel = channel; suspended->cData->flags &= ~CHANNEL_SUSPENDED; - mod_chanmode_init(&change); - change.argc = 1; - change.args[0].mode = MODE_CHANOP; - change.args[0].u.member = AddChannelUser(chanserv, channel); - mod_chanmode_announce(chanserv, channel, &change); + if(!IsOffChannel(suspended->cData)) + { + struct mod_chanmode change; + mod_chanmode_init(&change); + change.argc = 1; + change.args[0].mode = MODE_CHANOP; + change.args[0].u.member = AddChannelUser(chanserv, channel); + mod_chanmode_announce(chanserv, channel, &change); + } } static CHANSERV_FUNC(cmd_csuspend) @@ -5494,8 +5498,15 @@ new_owner = GetChannelAccess(cData, new_owner_hi); if(!new_owner) { - reply("CSMSG_NO_CHAN_USER", new_owner_hi->handle, channel->name); - return 0; + if(force) + { + new_owner = add_channel_user(cData, new_owner_hi, UL_COOWNER, 0, NULL); + } + else + { + reply("CSMSG_NO_CHAN_USER", new_owner_hi->handle, channel->name); + return 0; + } } if((chanserv_get_owned_count(new_owner_hi) >= chanserv_conf.max_owned) && !force) { @@ -6598,6 +6609,8 @@ s_expires = database_get_data(rd->d.object, KEY_EXPIRES, RECDB_QSTRING); owner = database_get_data(rd->d.object, KEY_OWNER, RECDB_QSTRING); reason = database_get_data(rd->d.object, KEY_REASON, RECDB_QSTRING); + if (!reason || !owner) + return; set_time = set ? (time_t)strtoul(set, NULL, 0) : now; triggered_time = triggered ? (time_t)strtoul(triggered, NULL, 0) : 0; --- orig/src/chanserv.h +++ mod/src/chanserv.h @@ -163,7 +163,7 @@ { char chan_name[CHANNELLEN+1]; char setter[NICKSERV_HANDLE_LEN+1]; - time_t set; + time_t set; char reason[1]; }; --- orig/src/common.h +++ mod/src/common.h @@ -102,6 +102,24 @@ extern void verify(const void *ptr); # define verify(x) verify(x) # endif +#elif defined(WITH_MALLOC_SLAB) +# define malloc(n) slab_malloc(__FILE__, __LINE__, (n)) +# undef calloc +# define calloc(m,n) slab_malloc(__FILE__, __LINE__, (m)*(n)) +# undef realloc +# define realloc(p,n) slab_realloc(__FILE__, __LINE__, (p), (n)) +# undef free +# define free(p) slab_free(__FILE__, __LINE__, (p)) +# undef strdup +# define strdup(s) slab_strdup(__FILE__, __LINE__, (s)) +extern void *slab_malloc(const char *, unsigned int, size_t); +extern void *slab_realloc(const char *, unsigned int, void *, size_t); +extern char *slab_strdup(const char *, unsigned int, const char *); +extern void slab_free(const char *, unsigned int, void *); +# if !defined(NDEBUG) +extern void verify(const void *ptr); +# define verify(x) verify(x) +# endif #endif #ifndef verify --- orig/src/hash.h +++ mod/src/hash.h @@ -58,7 +58,7 @@ #define FLAGS_STAMPED 0x1000 /* for users who have been stamped */ #define FLAGS_HIDDEN_HOST 0x2000 /* user's host is masked by their account */ #define FLAGS_REGNICK 0x4000 /* user owns their current nick */ -#define FLAGS_REGISTERING 0x8000 /* user has issued account register command, is waiting for email cookie */ +#define FLAGS_REGISTERING 0x8000 /* user has issued account register command, is waiting for email cookie */ #define IsOper(x) ((x)->modes & FLAGS_OPER) #define IsService(x) ((x)->modes & FLAGS_SERVICE) @@ -126,7 +126,7 @@ unsigned int limit, locks; char key[KEYLEN + 1]; time_t timestamp; /* creation time */ - + char topic[TOPICLEN + 1]; char topic_nick[NICKLEN + 1]; time_t topic_time; --- orig/src/helpfile.c +++ mod/src/helpfile.c @@ -84,7 +84,7 @@ * lang is a two-letter code according to ISO-639-1 (or three-letter * code according to ISO-639-2 for languages not in ISO-639-1), and * COUNTRY is the ISO 3166 country code in all upper case. - * + * * See also: * http://www.loc.gov/standards/iso639-2/ * http://www.loc.gov/standards/iso639-2/langhome.html --- orig/src/log.c +++ mod/src/log.c @@ -587,6 +587,10 @@ /* Special behavior before we start full operation */ fprintf(stderr, "%s: %s\n", log_severity_names[sev], msgbuf); } + if (sev == LOG_FATAL) { + assert(0 && "fatal message logged"); + _exit(1); + } } /* audit log searching */ @@ -719,7 +723,8 @@ unsigned int matched = 0; if (discrim->type) { - struct logEntry *entry, *last; + volatile struct logEntry *last; + struct logEntry *entry; for (entry = discrim->type->log_oldest, last = NULL; entry; --- orig/src/main.c +++ mod/src/main.c @@ -691,6 +691,12 @@ FILE *file_out; struct sigaction sv; +#if WITH_MALLOC_BOEHM_GC + GC_find_leak = 1; + GC_set_warn_proc(gc_warn_proc); + GC_enable_incremental(); +#endif + daemon = 1; debug = 0; tools_init(); @@ -816,10 +822,6 @@ MAIN_LOG = log_register_type("srvx", "file:main.log"); if (debug) log_debug(); -#if WITH_MALLOC_BOEHM_GC - GC_set_warn_proc(gc_warn_proc); - GC_enable_incremental(); -#endif timeq_init(); init_structs(); init_parse(); --- orig/src/modcmd.c +++ mod/src/modcmd.c @@ -145,18 +145,18 @@ { "channel", MODCMD_REQUIRE_CHANNEL }, { "chanuser", MODCMD_REQUIRE_CHANUSER }, { "disabled", MODCMD_DISABLED }, + { "helping", MODCMD_REQUIRE_HELPING }, { "ignore_csuspend", MODCMD_IGNORE_CSUSPEND }, { "joinable", MODCMD_REQUIRE_JOINABLE }, { "keepbound", MODCMD_KEEP_BOUND }, { "loghostmask", MODCMD_LOG_HOSTMASK }, - { "nolog", MODCMD_NO_LOG }, { "networkhelper", MODCMD_REQUIRE_NETWORK_HELPER }, { "never_csuspend", MODCMD_NEVER_CSUSPEND }, + { "nolog", MODCMD_NO_LOG }, { "oper", MODCMD_REQUIRE_OPER }, { "qualified", MODCMD_REQUIRE_QUALIFIED }, { "regchan", MODCMD_REQUIRE_REGCHAN }, { "supporthelper", MODCMD_REQUIRE_SUPPORT_HELPER }, - { "helping", MODCMD_REQUIRE_HELPING }, { "toy", MODCMD_TOY }, { NULL, 0 } }; @@ -545,7 +545,8 @@ rflags |= ACTION_STAFF; } if (cmd->min_opserv_level > 0) { - if (!oper_has_access(user, bot, cmd->min_opserv_level, !(options & SVCCMD_NOISY))) return 0; + if (!oper_has_access(user, bot, cmd->min_opserv_level, !(options & SVCCMD_NOISY))) + return 0; rflags |= ACTION_STAFF; } if (cmd->req_account_flags || cmd->deny_account_flags) { @@ -566,7 +567,7 @@ /* If it's an override, return a special value. */ if ((flags & MODCMD_REQUIRE_CHANUSER) && (options & SVCCMD_NOISY) - && (uData->access > 500) + && (!uData || (uData->access > 500)) && (!(uData = _GetChannelUser(channel->channel_info, user->handle_info, 0, 0)) || uData->access < cmd->min_channel_access) && !(flags & (MODCMD_REQUIRE_STAFF|MODCMD_REQUIRE_HELPING))) { @@ -1670,12 +1671,12 @@ if (flags & MODCMD_REQUIRE_HELPING) access = "helping"; else if (flags & MODCMD_REQUIRE_STAFF) { - switch (flags & MODCMD_REQUIRE_STAFF) { - case MODCMD_REQUIRE_OPER: access = "oper"; break; - case MODCMD_REQUIRE_OPER | MODCMD_REQUIRE_NETWORK_HELPER: - case MODCMD_REQUIRE_NETWORK_HELPER: access = "net.helper"; break; - default: access = "staff"; break; - } + if (flags & MODCMD_REQUIRE_OPER) + access = "oper"; + else if (flags & MODCMD_REQUIRE_NETWORK_HELPER) + access = "net.helper"; + else + access = "staff"; } else access = strtab(svccmd->min_channel_access); tbl.contents[ii+1][1+show_opserv_level] = access; --- orig/src/opserv.c +++ mod/src/opserv.c @@ -1896,8 +1896,7 @@ change.args[0].u.member = AddChannelUser(opserv, channel); change.argc++; } - if (!(channel->modes & MODE_MODERATED)) - change.modes_set |= MODE_MODERATED; + change.modes_set = (MODE_MODERATED | MODE_DELAYJOINS) & ~channel->modes; if (change.modes_set || change.argc) mod_chanmode_announce(opserv, channel, &change); send_target_message(0, channel->name, opserv, "OSMSG_FLOOD_MODERATE"); --- orig/src/proto-common.c +++ mod/src/proto-common.c @@ -440,16 +440,17 @@ mn->idle_since = now; /* Never send a NOTICE to a channel to one of the services */ - if (!pd->is_notice && cf->func && GetUserMode(cn, cf->service)) + if (!pd->is_notice && cf->func + && ((cn->modes & MODE_REGISTERED) || GetUserMode(cn, cf->service))) cf->func(pd->user, cn, pd->text+1, cf->service); /* This catches *all* text sent to the channel that the services server sees */ for (x = 0; x < ALLCHANMSG_FUNCS_MAX; x++) { cf = (struct chanmsg_func *)&allchanmsg_funcs[x]; if (!cf->func) - break; /* end of list */ + break; /* end of list */ else - cf->func(pd->user, cn, pd->text, cf->service); + cf->func(pd->user, cn, pd->text, cf->service); } } --- orig/src/proto-p10.c +++ mod/src/proto-p10.c @@ -1579,6 +1579,7 @@ dict_insert(irc_func_dict, "401", cmd_dummy); /* target left network */ dict_insert(irc_func_dict, "403", cmd_dummy); /* no such channel */ dict_insert(irc_func_dict, "404", cmd_dummy); /* cannot send to channel */ + dict_insert(irc_func_dict, "439", cmd_dummy); /* target change too fast */ dict_insert(irc_func_dict, "441", cmd_dummy); /* target isn't on that channel */ dict_insert(irc_func_dict, "442", cmd_dummy); /* you aren't on that channel */ dict_insert(irc_func_dict, "443", cmd_dummy); /* is already on channel (after invite?) */ --- orig/srvx.conf.example +++ mod/srvx.conf.example @@ -220,7 +220,7 @@ // How long is a channel unvisited (by masters or above) before it can be expired? "chan_expire_delay" "30d"; // what !set options should we show when user calls "!set" with no arguments? - "set_shows" ("DefaultTopic", "TopicMask", "Greeting", "UserGreeting", "Modes", "PubCmd", "InviteMe", "UserInfo", "GiveVoice", "GiveOps", "EnfOps", "EnfModes", "EnfTopic", "TopicSnarf", "Setters", "CtcpUser", "CtcpReaction", "Protect", "Toys", "DynLimit", "NoDelete"); + "set_shows" ("DefaultTopic", "TopicMask", "Greeting", "UserGreeting", "Modes", "PubCmd", "InviteMe", "StrictOp", "AutoOp", "EnfModes", "EnfTopic", "TopicSnarf", "UserInfo", "GiveVoice", "GiveOps", "EnfOps", "Setters", "CtcpUser", "CtcpReaction", "Protect", "Toys", "DynLimit", "NoDelete"); // A list of !8ball responses "8ball" ("Not a chance.", |