aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRatakor <ratakor@disroot.org>2023-07-04 23:54:45 +0200
committerRatakor <ratakor@disroot.org>2023-07-04 23:54:45 +0200
commit0c4aa58638d7adfb98f5b112cc311d872e5419ff (patch)
treef274492496be077d307a52d1f0bbaaf3b147d66a
parent5c6264635004b1567b750915e5c7fe6302de3856 (diff)
Add updates from libre + make everything faster
Make everything faster by using memcpy and memcmp instead of doing a simple loop. Change PATH_MAX to FILENAME_MAX because it's probably more accurate.
-rw-r--r--README.md2
-rw-r--r--dalloc.c87
-rw-r--r--dalloc.h36
3 files changed, 65 insertions, 60 deletions
diff --git a/README.md b/README.md
index 7c45cd3..a967b90 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
dalloc
======
-A simple, thread safe, drop-in memory allocation debugging lib for C
+A simple, thread safe, drop-in memory allocation debugging lib for C89+
Usage
-----
diff --git a/dalloc.c b/dalloc.c
index f0e9a68..e65a7c4 100644
--- a/dalloc.c
+++ b/dalloc.c
@@ -15,7 +15,6 @@
*/
#include <errno.h>
-#include <limits.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
@@ -29,39 +28,37 @@ void dalloc_check_all(void) __attribute__((destructor));
#endif /* DALLOC */
#include "dalloc.h"
+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
#define OVER_ALLOC 64
#define MAGIC_NUMBER 0x99
#define EXIT_STATUS 9
-#define MAX_POINTERS 1024
+#define MAX_POINTERS 512
#define COMMENT_MAX 128
-#ifndef PATH_MAX
-#define PATH_MAX 256
-#endif /* PATH_MAX */
struct Pointer {
void *p;
size_t siz;
char comment[COMMENT_MAX];
int ignored;
- char file[PATH_MAX];
+ char file[FILENAME_MAX];
int line;
};
-static int overflow(unsigned char *p, size_t siz);
+static int overflow(void *p, size_t siz);
static size_t find_pointer_index(void *p, char *file, int line);
static pthread_mutex_t dalloc_mutex = PTHREAD_MUTEX_INITIALIZER;
+static char magic_numbers[OVER_ALLOC];
static struct Pointer pointers[MAX_POINTERS];
static size_t npointers;
static int
-overflow(unsigned char *p, size_t siz)
+overflow(void *p, size_t siz)
{
- size_t i = 0;
+ if (*magic_numbers == 0)
+ memset(magic_numbers, MAGIC_NUMBER, OVER_ALLOC);
- while (p[siz + i] == MAGIC_NUMBER && ++i < OVER_ALLOC);
-
- return i < OVER_ALLOC;
+ return memcmp((char *)p + siz, magic_numbers, OVER_ALLOC);
}
static size_t
@@ -160,12 +157,17 @@ dalloc_check_all(void)
void
dalloc_sighandler(int sig)
{
+#ifdef _WIN32
+ fprintf(stderr, "dalloc: signal %d\n", sig);
+#else
fprintf(stderr, "dalloc: %s\n", strsignal(sig));
+#endif /* _WIN32 */
+
exit(EXIT_STATUS);
}
void
-_dalloc_ignore(void *p, char *file, int line)
+___dalloc_ignore(void *p, char *file, int line)
{
size_t i;
@@ -180,24 +182,27 @@ _dalloc_ignore(void *p, char *file, int line)
}
void
-_dalloc_comment(void *p, char *comment, char *file, int line)
+___dalloc_comment(void *p, const char *comment, char *file, int line)
{
- size_t i, j;
+ size_t i, siz;
#ifdef NO_DALLOC
return;
#endif /* NO_DALLOC */
+ if (comment == NULL)
+ return;
+
+ siz = MIN(strlen(comment), COMMENT_MAX - 1);
pthread_mutex_lock(&dalloc_mutex);
i = find_pointer_index(p, file, line);
- for (j = 0; j < COMMENT_MAX && comment[j] != '\0'; j++)
- pointers[i].comment[j] = comment[j];
- pointers[i].comment[j] = '\0';
+ memcpy(pointers[i].comment, comment, siz);
+ pointers[i].comment[siz] = '\0';
pthread_mutex_unlock(&dalloc_mutex);
}
void
-_free(void *p, char *file, int line)
+___free(void *p, char *file, int line)
{
size_t i;
@@ -228,10 +233,10 @@ _free(void *p, char *file, int line)
void *
-_malloc(size_t siz, char *file, int line)
+___malloc(size_t siz, char *file, int line)
{
void *p = NULL;
- size_t i;
+ size_t sizfname;
if (siz == 0)
return NULL;
@@ -253,13 +258,13 @@ _malloc(size_t siz, char *file, int line)
exit(EXIT_STATUS);
}
- memset((unsigned char *)p + siz, MAGIC_NUMBER, OVER_ALLOC);
+ sizfname = MIN(strlen(file), FILENAME_MAX - 1);
+ memset((char *)p + siz, MAGIC_NUMBER, OVER_ALLOC);
pthread_mutex_lock(&dalloc_mutex);
pointers[npointers].p = p;
pointers[npointers].siz = siz;
- for (i = 0; i < PATH_MAX - 1 && file[i] != '\0'; i++)
- pointers[npointers].file[i] = file[i];
- pointers[npointers].file[i] = '\0';
+ memcpy(pointers[npointers].file, file, sizfname);
+ pointers[npointers].file[sizfname] = '\0';
pointers[npointers].line = line;
npointers++;
pthread_mutex_unlock(&dalloc_mutex);
@@ -268,7 +273,7 @@ _malloc(size_t siz, char *file, int line)
}
void *
-_calloc(size_t nmemb, size_t siz, char *file, int line)
+___calloc(size_t nmemb, size_t siz, char *file, int line)
{
void *p;
@@ -282,22 +287,22 @@ _calloc(size_t nmemb, size_t siz, char *file, int line)
}
siz *= nmemb;
- p = _malloc(siz, file, line);
+ p = ___malloc(siz, file, line);
memset(p, 0, siz);
return p;
}
void *
-_realloc(void *p, size_t siz, char *file, int line)
+___realloc(void *p, size_t siz, char *file, int line)
{
- size_t i, j;
+ size_t i, sizfname;
if (p == NULL)
- return _malloc(siz, file, line);
+ return ___malloc(siz, file, line);
if (siz == 0) {
- _free(p, file, line);
+ ___free(p, file, line);
return NULL;
}
@@ -331,12 +336,12 @@ _realloc(void *p, size_t siz, char *file, int line)
exit(EXIT_STATUS);
}
- memset((unsigned char *)p + siz, MAGIC_NUMBER, OVER_ALLOC);
+ sizfname = MIN(strlen(file), FILENAME_MAX - 1);
+ memset((char *)p + siz, MAGIC_NUMBER, OVER_ALLOC);
pointers[i].p = p;
pointers[i].siz = siz;
- for (j = 0; j < PATH_MAX - 1 && file[j] != '\0'; j++)
- pointers[i].file[j] = file[j];
- pointers[i].file[j] = '\0';
+ memcpy(pointers[i].file, file, sizfname);
+ pointers[i].file[sizfname] = '\0';
pointers[i].line = line;
pthread_mutex_unlock(&dalloc_mutex);
@@ -344,7 +349,7 @@ _realloc(void *p, size_t siz, char *file, int line)
}
void *
-_reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line)
+___reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line)
{
if (siz != 0 && nmemb > -1 / siz) {
fprintf(stderr, "%s:%d: dalloc: reallocarray: %s\n",
@@ -352,24 +357,24 @@ _reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line)
exit(EXIT_STATUS);
}
- return _realloc(p, nmemb * siz, file, line);
+ return ___realloc(p, nmemb * siz, file, line);
}
char *
-_strdup(const char *s, char *file, int line)
+___strdup(const char *s, char *file, int line)
{
char *p;
size_t siz;
siz = strlen(s) + 1;
- p = _malloc(siz, file, line);
+ p = ___malloc(siz, file, line);
memcpy(p, s, siz);
return p;
}
char *
-_strndup(const char *s, size_t n, char *file, int line)
+___strndup(const char *s, size_t n, char *file, int line)
{
const char *end;
char *p;
@@ -377,7 +382,7 @@ _strndup(const char *s, size_t n, char *file, int line)
end = memchr(s, '\0', n);
siz = (end ? (size_t)(end - s) : n) + 1;
- p = _malloc(siz, file, line);
+ p = ___malloc(siz, file, line);
memcpy(p, s, siz - 1);
p[siz - 1] = '\0';
diff --git a/dalloc.h b/dalloc.h
index 71fbf2e..b1f5b90 100644
--- a/dalloc.h
+++ b/dalloc.h
@@ -16,36 +16,36 @@ extern "C" {
#endif /* __cplusplus */
#ifdef DALLOC
-#define free(p) (_free(p, __FILE__, __LINE__))
-#define malloc(siz) (_malloc(siz, __FILE__, __LINE__))
-#define calloc(nmemb, siz) (_calloc(nmemb, siz, __FILE__, __LINE__))
-#define realloc(p, siz) (_realloc(p, siz, __FILE__, __LINE__))
-#define reallocarray(p, n, siz) (_reallocarray(p, n, siz, __FILE__, __LINE__))
-#define strdup(s) (_strdup(s, __FILE__, __LINE__))
-#define strndup(s, n) (_strndup(s, n, __FILE__, __LINE__))
+#define free(p) (___free(p, __FILE__, __LINE__))
+#define malloc(siz) (___malloc(siz, __FILE__, __LINE__))
+#define calloc(nmemb, siz) (___calloc(nmemb, siz, __FILE__, __LINE__))
+#define realloc(p, siz) (___realloc(p, siz, __FILE__, __LINE__))
+#define reallocarray(p, n, s) (___reallocarray(p, n, s, __FILE__, __LINE__))
+#define strdup(s) (___strdup(s, __FILE__, __LINE__))
+#define strndup(s, n) (___strndup(s, n, __FILE__, __LINE__))
#endif /* DALLOC */
#ifdef EXITSEGV
#define exit(dummy) (exitsegv(dummy))
#endif /* EXITSEGV */
-#define dalloc_ignore(p) (_dalloc_ignore(p, __FILE__, __LINE__))
-#define dalloc_comment(p, com) (_dalloc_comment(p, com, __FILE__, __LINE__))
+#define dalloc_ignore(p) (___dalloc_ignore(p, __FILE__, __LINE__))
+#define dalloc_comment(p, com) (___dalloc_comment(p, com, __FILE__, __LINE__))
size_t dalloc_check_overflow(void);
void dalloc_check_free(void);
void dalloc_check_all(void);
void dalloc_sighandler(int sig);
-void _dalloc_ignore(void *p, char *file, int line);
-void _dalloc_comment(void *p, char *comment, char *file, int line);
-void _free(void *p, char *file, int line);
-void *_malloc(size_t siz, char *file, int line);
-void *_calloc(size_t nmemb, size_t siz, char *file, int line);
-void *_realloc(void *p, size_t siz, char *file, int line);
-void *_reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line);
-char *_strdup(const char *s, char *file, int line);
-char *_strndup(const char *s, size_t n, char *file, int line);
+void ___dalloc_ignore(void *p, char *file, int line);
+void ___dalloc_comment(void *p, const char *comment, char *file, int line);
+void ___free(void *p, char *file, int line);
+void *___malloc(size_t siz, char *file, int line);
+void *___calloc(size_t nmemb, size_t siz, char *file, int line);
+void *___realloc(void *p, size_t siz, char *file, int line);
+void *___reallocarray(void *p, size_t nmemb, size_t siz, char *file, int line);
+char *___strdup(const char *s, char *file, int line);
+char *___strndup(const char *s, size_t n, char *file, int line);
void exitsegv(int dummy);