diff options
author | Max Kellermann <max@duempel.org> | 2014-01-07 23:33:46 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-01-07 23:35:18 +0100 |
commit | 27ca0db7a6143d2e479ff1ae52ec7c349ab1d4f2 (patch) | |
tree | 3f200069ab73baa09898fe1f242c6fd85396e2ba /src/util | |
parent | 49f34fbf6861f10dbf9eb7549177888394926ff9 (diff) | |
download | mpd-27ca0db7a6143d2e479ff1ae52ec7c349ab1d4f2.tar.gz mpd-27ca0db7a6143d2e479ff1ae52ec7c349ab1d4f2.tar.xz mpd-27ca0db7a6143d2e479ff1ae52ec7c349ab1d4f2.zip |
util/Alloc: new library replacing GLib's g_malloc()
Diffstat (limited to '')
-rw-r--r-- | src/util/Alloc.cxx | 76 | ||||
-rw-r--r-- | src/util/Alloc.hxx | 67 | ||||
-rw-r--r-- | src/util/VarSize.hxx | 7 |
3 files changed, 146 insertions, 4 deletions
diff --git a/src/util/Alloc.cxx b/src/util/Alloc.cxx new file mode 100644 index 000000000..ec3579470 --- /dev/null +++ b/src/util/Alloc.cxx @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "Alloc.hxx" + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +gcc_noreturn +static void +oom() +{ + (void)write(STDERR_FILENO, "Out of memory\n", 14); + _exit(1); +} + +void * +xalloc(size_t size) +{ + void *p = malloc(size); + if (gcc_unlikely(p == nullptr)) + oom(); + + return p; +} + +void * +xmemdup(const void *s, size_t size) +{ + void *p = xalloc(size); + memcpy(p, s, size); + return p; +} + +char * +xstrdup(const char *s) +{ + char *p = strdup(s); + if (gcc_unlikely(p == nullptr)) + oom(); + + return p; +} + +char * +xstrndup(const char *s, size_t n) +{ +#ifdef WIN32 + char *p = (char *)xalloc(n + 1); + memcpy(p, s, n); + p[n] = 0; +#else + char *p = strndup(s, n); + if (gcc_unlikely(p == nullptr)) + oom(); +#endif + + return p; +} diff --git a/src/util/Alloc.hxx b/src/util/Alloc.hxx new file mode 100644 index 000000000..15c123b7a --- /dev/null +++ b/src/util/Alloc.hxx @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_ALLOC_HXX +#define MPD_ALLOC_HXX + +#include "Compiler.h" + +#include <stddef.h> + +/** + * Allocate memory. Use free() to free it. + * + * This function never fails; in out-of-memory situations, it aborts + * the process. + */ +gcc_malloc +void * +xalloc(size_t size); + +/** + * Duplicate memory. Use free() to free it. + * + * This function never fails; in out-of-memory situations, it aborts + * the process. + */ +gcc_malloc gcc_nonnull_all +void * +xmemdup(const void *s, size_t size); + +/** + * Duplicate a string. Use free() to free it. + * + * This function never fails; in out-of-memory situations, it aborts + * the process. + */ +gcc_malloc gcc_nonnull_all +char * +xstrdup(const char *s); + +/** + * Duplicate a string. Use free() to free it. + * + * This function never fails; in out-of-memory situations, it aborts + * the process. + */ +gcc_malloc gcc_nonnull_all +char * +xstrndup(const char *s, size_t n); + +#endif diff --git a/src/util/VarSize.hxx b/src/util/VarSize.hxx index b1123b858..04f1bf580 100644 --- a/src/util/VarSize.hxx +++ b/src/util/VarSize.hxx @@ -30,14 +30,13 @@ #ifndef MPD_VAR_SIZE_HXX #define MPD_VAR_SIZE_HXX +#include "Alloc.hxx" #include "Compiler.h" #include <type_traits> #include <utility> #include <new> -#include <glib.h> - /** * Allocate and construct a variable-size object. That is useful for * example when you want to store a variable-length string as the last @@ -61,7 +60,7 @@ NewVarSize(size_t declared_tail_size, size_t real_tail_size, Args&&... args) size_t size = sizeof(T) - declared_tail_size + real_tail_size; /* allocate memory */ - T *instance = (T *)g_malloc(size); + T *instance = (T *)xalloc(size); /* call the constructor */ new(instance) T(std::forward<Args>(args)...); @@ -78,7 +77,7 @@ DeleteVarSize(T *instance) instance->T::~T(); /* free memory */ - g_free(instance); + free(instance); } #endif |