[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.",
|