Also rename USE_VALGRIND to SSTRING_MMAP in sstring-new.c.
static void sstringstats(int hooknum, void *arg);
static void salloc(void);
-#ifndef USE_VALGRIND
+#ifndef SSTRING_MMAP
#define sunprotect(x)
#define sunprotectb(x)
#define MAP_ANON MAP_ANONYMOUS
#endif
-#endif /* USE_VALGRIND */
+#endif /* SSTRING_MMAP */
void initsstring() {
int i;
registerhook(HOOK_CORE_STATSREQUEST,&sstringstats);
}
-#ifndef USE_VALGRIND
+#ifndef SSTRING_MMAP
void finisstring() {
nsfreeall(POOL_SSTRING);
}
ssmem=(char *)nsmalloc(POOL_SSTRING, SSTRING_ALLOC);
ssmemfree=SSTRING_ALLOC;
}
-#endif /* USE_VALGRIND */
+#endif /* SSTRING_MMAP */
sstring *findsstring(const char *str) {
unsigned int hash=crc32(str)%SSTRING_HASHSIZE;
if (!ssp) {
sshash[hash]=ss->next;
} else {
-#ifndef USE_VALGRIND
+#ifndef SSTRING_MMAP
ssp->next=ss->next;
#else
if (ssp->block!=ss->block) {
if (ssmemfree>sizeof(sstring)) {
retval=(sstring *)ssmem;
sunprotectb(mblock);
-#ifdef USE_VALGRIND
+#ifdef SSTRING_MMAP
retval->block=mblock;
#endif
retval->alloc=(ssmemfree-sizeof(sstring));
strcpy(retval->content,strbuf);
retval->refcount=1;
-#ifdef USE_VALGRIND
+#ifdef SSTRING_MMAP
if(!foreignblock)
retval->block = mblock;
#endif
return strncmp(ss1->content, ss2->content, ss1->length);
}
-#ifdef USE_VALGRIND
+#ifdef SSTRING_MMAP
void finisstring() {
struct mblock_list *c, *n;
for (c=mblock_head;c;c=n) {
ssmem=(char *)mblock + sizeof(struct mblock_list);
ssmemfree=SSTRING_ALLOC-sizeof(struct mblock_list);
}
-#endif /* USE_VALGRIND */
+#endif /* SSTRING_MMAP */
#define __USE_GNU
#include <string.h>
-#ifndef USE_VALGRIND
-
/* List of free stuff */
sstring *freelist[SSTRING_MAXLEN+1];
}
}
-#else /* USE_VALGRIND */
-
-#define __USE_MISC
-#include <sys/mman.h>
-
-#ifndef MAP_ANON
-#define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#define MModify(x) mprotect(x, x->s->u.l.alloc, PROT_READ|PROT_WRITE)
-#define MUnmodify(x) mprotect(x, x->s->u.l.alloc, PROT_READ)
-
-typedef struct sstringlist {
- struct sstringlist *prev;
- struct sstringlist *next;
- sstring s[];
-} sstringlist;
-
-static sstringlist *head;
-
-void initsstring() {
-}
-
-void finisstring() {
- sstringlist *s, *sn;
-
- /* here we deliberately don't free the pointers so valgrind can tell us where they were allocated, in theory */
-
- for(s=head;s;s=sn) {
- sn = s->next;
-
- MModify(s);
- s->next = NULL;
- s->prev = NULL;
-
- Error("sstring", ERR_WARNING, "sstring of length %d still allocated: %s", s->s->u.l.length, s->s->content);
- }
-
- head = NULL;
-}
-
-sstring *getsstring(const char *inputstr, int maxlen) {
- sstringlist *s;
- size_t len;
- char *p;
- void *m;
-
- if(!inputstr)
- return NULL;
-
- for(p=(char *)inputstr;*p&&maxlen;maxlen--,p++)
- ; /* empty */
-
- len = p - inputstr;
- m=mmap((void *)0, sizeof(sstringlist) + sizeof(sstring) + len + 1, PROT_WRITE|PROT_READ, MAP_PRIVATE|MAP_ANON, -1, 0);
- s=(sstringlist *)m;
-
- if(m == MAP_FAILED)
- s->s->u.l.length = 0;
-
- s->s->u.l.length = len;
- s->s->u.l.alloc = sizeof(sstringlist) + sizeof(sstring) + len + 1;
- s->s->content=(char *)m + sizeof(sstringlist) + sizeof(sstring);
-
- memcpy(s->s->content, inputstr, len);
- s->s->content[len] = '\0';
-
- s->next = head;
- s->prev = NULL;
- if(head) {
- MModify(head);
- head->prev = s;
- MUnmodify(head);
- }
- head = s;
-
- MUnmodify(s);
- return s->s;
-}
-
-void freesstring(sstring *inval) {
- sstringlist *s;
- if(!inval)
- return;
-
- s = (sstringlist *)inval - 1;
-
- MModify(s);
- if(s->prev) {
- MModify(s->prev);
- s->prev->next = s->next;
- MUnmodify(s->prev);
- if(s->next) {
- MModify(s->next);
- s->next->prev = s->prev;
- MUnmodify(s->prev);
- }
- } else {
- head = s->next;
- if(head) {
- MModify(head);
- head->prev = NULL;
- MUnmodify(head);
- }
- }
-
- munmap(s, s->s->u.l.alloc);
-}
-#endif
-
int sstringcompare(sstring *ss1, sstring *ss2) {
if (ss1->u.l.length != ss2->u.l.length)
return -1;
--- /dev/null
+/* sstring.h - Declaration of "static strings" functions */
+
+#define COMPILING_SSTRING
+#include "sstring.h"
+
+#include "../core/hooks.h"
+#include "../core/nsmalloc.h"
+#include "../core/error.h"
+
+#include <stdio.h>
+
+#include <assert.h>
+#include <stdlib.h>
+#define __USE_GNU
+#include <string.h>
+
+void initsstring() {
+}
+
+void finisstring() {
+ sstringlist *s, *sn;
+
+ /* here we deliberately don't free the pointers so valgrind can tell us where they were allocated, in theory */
+
+ for(s=head;s;s=sn) {
+ sn = s->next;
+ s->next = NULL;
+ s->prev = NULL;
+
+ Error("sstring", ERR_WARNING, "sstring of length %d still allocated: %s", s->s->u.l.length, s->s->content);
+ }
+
+ head = NULL;
+}
+
+sstring *getsstring(const char *inputstr, int maxlen) {
+ sstringlist *s;
+ size_t len;
+ char *p;
+
+ if(!inputstr)
+ return NULL;
+
+ for(p=(char *)inputstr;*p&&maxlen;maxlen--,p++)
+ ; /* empty */
+
+ len = p - inputstr;
+ s=(sstringlist *)malloc(sizeof(sstringlist) + sizeof(sstring));
+
+ s->s->u.l.length = len;
+ s->s->content=(char *)malloc(len + 1);
+
+ memcpy(s->s->content, inputstr, len);
+ s->s->content[len] = '\0';
+
+ s->next = head;
+ s->prev = NULL;
+ if(head)
+ head->prev = s;
+ head = s;
+
+ return s->s;
+}
+
+void freesstring(sstring *inval) {
+ sstringlist *s;
+ if(!inval)
+ return;
+
+ s = (sstringlist *)inval - 1;
+
+ if(s->prev) {
+ s->prev->next = s->next;
+ if(s->next)
+ s->next->prev = s->prev;
+ } else {
+ head = s->next;
+ if(head)
+ head->prev = NULL;
+ }
+
+ free(inval->content);
+ free(s);
+}
+
+int sstringcompare(sstring *ss1, sstring *ss2) {
+ if (ss1->u.l.length != ss2->u.l.length)
+ return -1;
+
+ return strncmp(ss1->content, ss2->content, ss1->u.l.length);
+}