Module: sip-router Branch: ser_core_cvs Commit: e01a458045ad4363110dad04a774342a57b5851a URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e01a4580...
Author: Miklos Tirpak miklos@iptel.org Committer: Miklos Tirpak miklos@iptel.org Date: Fri Apr 3 13:03:46 2009 +0000
Wrapper functions for regcomp, regexec, regfree, and regerror using shared memory allocators instead of libc malloc/realloc/free. Check the README file for more details.
---
lib/Makefile | 2 +- lib/README | 22 ++++++-- lib/shm_regex/Makefile | 14 +++++ lib/shm_regex/README | 23 ++++++++ lib/shm_regex/shm_regex.c | 129 +++++++++++++++++++++++++++++++++++++++++++++ lib/shm_regex/shm_regex.h | 45 ++++++++++++++++ 6 files changed, 228 insertions(+), 7 deletions(-)
diff --git a/lib/Makefile b/lib/Makefile index 431e37d..01bbc1d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -7,7 +7,7 @@ #
-SUBDIRS=binrpc cds xcap presence +SUBDIRS=binrpc cds xcap presence shm_regex
.PHONY: subdirs $(SUBDIRS)
diff --git a/lib/README b/lib/README index 289b9f6..317fd3e 100644 --- a/lib/README +++ b/lib/README @@ -24,28 +24,32 @@ xcap - Common XCAP operations and structures (XCAP authorization documents requires external libraries: libxml2, libcurl3 (nonSER version) requires internal libraries: cds
+shm_regex - Wrapper functions for regcomp, regexec, regfree and regerror + using shared memory. See 'man regex' for details. + Used by modules: pa, rls, dialog, rpa
Usage: -----
-All libraries can be compiled "with ser" or "without ser". Compilation -without ser may be useful for debugging purposes or for example for +All libraries except shm_regex can be compiled "with ser" or "without ser". +Compilation without ser may be useful for debugging purposes or for example for searching for memory leaks with some tool like valgrind. +shm_regex library can be compiled only with ser.
Compilation with ser: --------------------
Compilation and installation of these libraries is NOT DONE by running -main ser makefile now - it MUST be done MANUALLY. For this purpose -is there Makefile.ser. To compile and install libraries simply run +main ser makefile now - it MUST be done MANUALLY. To compile and install +libraries simply run
- make -f Makefile.ser install + make install
in lib directory. You can select destination directory like in the case of ser, for example:
- make -f Makefile.ser install prefix="/my/ser/directory" + make install prefix="/my/ser/directory"
AFTER COMPILATION of libraries you can COMPILE MODULES using this libraries like PA, RLS or dialog. @@ -61,6 +65,12 @@ you should set LD_LIBRARY_PATH=/usr/local/lib/ser. In the case of nonstandard installation, you can use something like LD_LIBRARY_PATH=/my/ser/directory/lib/ser.
+Compilation without ser: +-------------------- +Use the alternate makefile, Makefile.noser: + + make -f Makefile.noser install + Documentation ------------- Documentation for all libraries is (or will be) in diff --git a/lib/shm_regex/Makefile b/lib/shm_regex/Makefile new file mode 100644 index 0000000..2a0c907 --- /dev/null +++ b/lib/shm_regex/Makefile @@ -0,0 +1,14 @@ +# +# makefile for shm_regex +# + +include ../../Makefile.defs +auto_gen= +NAME:=ser_shm_regex +MAJOR_VER=0 +MINOR_VER=1 +BUGFIX_VER=0 +LIBS= + +include ../../Makefile.libs + diff --git a/lib/shm_regex/README b/lib/shm_regex/README new file mode 100644 index 0000000..bfec807 --- /dev/null +++ b/lib/shm_regex/README @@ -0,0 +1,23 @@ +$Id$ + +Wrapper functions for regcomp, regexec, regfree, and regerror using shared +memory allocators instead of libc malloc/realloc/free. The original functions +are prefixed with "shm_". + +The regular expression compiled with shm_regcomp() can be used with shm_regexec() +simultaneously by multiple processes without locking, because regexec has its own +internal locks. It can be later on freed with shm_regfree() when the expression +is no longer used. Note however that + +1) shm_regexec allocates shared memory for the pattern buffer when it is successfully +called for the first time. + +2) shm_regexec temporary allocates and deallocates memory for storing the registers +for the pmatch array runtime if nmatch and pmatch parameters are not 0. This is +done also in shared memory, therefore use the shared memory wrappers for +regular expression based search-and-replace only if really necessary. + +See 'man regex' for the usage and parameters of the functions. + +Supported only with GNU C library. + diff --git a/lib/shm_regex/shm_regex.c b/lib/shm_regex/shm_regex.c new file mode 100644 index 0000000..165d535 --- /dev/null +++ b/lib/shm_regex/shm_regex.c @@ -0,0 +1,129 @@ +/* + * $Id$ + * + * Copyright (C) 2009 iptelorg GmbH + * + * This file is part of ser, a free SIP server. + * + * ser 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 + * + * For a license to use the ser software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * ser 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * History + * ------- + * 2009-04-03 Initial version (Miklos) + */ + +#include <malloc.h> /* hook prototypes */ + +#include "../../mem/shm_mem.h" +#include "shm_regex.h" + +typedef void *(malloc_hook_t) (size_t, const void *); +typedef void *(realloc_hook_t) (void *, size_t, const void *); +typedef void (free_hook_t) (void *, const void *); + +/* The memory hooks are overwritten before calling regcomp(), regfree(), + * and regexec(), and shared memory function are called + * from the hooks instead of libc malloc/realloc/free. + */ + +static void *shm_malloc_hook(size_t size, const void *caller) +{ + return shm_malloc (size); +} + +static void *shm_realloc_hook(void *p, size_t size, const void *caller) +{ + return shm_realloc (p, size); +} + +static void shm_free_hook(void *ptr, const void *caller) +{ + if (ptr) shm_free (ptr); +} + +#define replace_malloc_hooks() \ + do { \ + orig_malloc_hook = __malloc_hook; \ + orig_realloc_hook = __realloc_hook; \ + orig_free_hook = __free_hook; \ + __malloc_hook = shm_malloc_hook; \ + __realloc_hook = shm_realloc_hook; \ + __free_hook = shm_free_hook; \ + } while (0) + +#define restore_malloc_hooks() \ + do { \ + __malloc_hook = orig_malloc_hook; \ + __realloc_hook = orig_realloc_hook; \ + __free_hook = orig_free_hook; \ + } while (0) + +int shm_regcomp(regex_t *preg, const char *regex, int cflags) +{ + malloc_hook_t *orig_malloc_hook; + realloc_hook_t *orig_realloc_hook; + free_hook_t *orig_free_hook; + int ret; + + replace_malloc_hooks(); + ret = regcomp(preg, regex, cflags); + restore_malloc_hooks(); + + return ret; +} + +void shm_regfree(regex_t *preg) +{ + malloc_hook_t *orig_malloc_hook; + realloc_hook_t *orig_realloc_hook; + free_hook_t *orig_free_hook; + + replace_malloc_hooks(); + regfree(preg); + restore_malloc_hooks(); +} + +int shm_regexec(const regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags) +{ + malloc_hook_t *orig_malloc_hook; + realloc_hook_t *orig_realloc_hook; + free_hook_t *orig_free_hook; + int ret; + + /* regexec() allocates some memory for the pattern buffer + * when it is successfully called for the first time, therefore + * shared memory is required also here. + * The drawback is that shared memory allocation is also used + * needlessly for allocating the temporary space for + * the elements of pmatch. -- Does not happen if pmatch and + * nmatch are 0. + * It is safe to call regexec() concurrently without locking, + * because regexec() has its own locks. + * (Miklos) + */ + replace_malloc_hooks(); + ret = regexec(preg, string, nmatch, + pmatch, eflags); + restore_malloc_hooks(); + + return ret; +} + diff --git a/lib/shm_regex/shm_regex.h b/lib/shm_regex/shm_regex.h new file mode 100644 index 0000000..42ec52b --- /dev/null +++ b/lib/shm_regex/shm_regex.h @@ -0,0 +1,45 @@ +/* + * $Id$ + * + * Copyright (C) 2009 iptelorg GmbH + * + * This file is part of ser, a free SIP server. + * + * ser 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 + * + * For a license to use the ser software under conditions + * other than those described here, or to purchase support for this + * software, please contact iptel.org by e-mail at the following addresses: + * info@iptel.org + * + * ser 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * History + * ------- + * 2009-04-03 Initial version (Miklos) + */ + +#ifndef _SHM_REGEX_H +#define _SHM_REGEX_H + +#include <sys/types.h> +#include <regex.h> + +int shm_regcomp(regex_t *preg, const char *regex, int cflags); +void shm_regfree(regex_t *preg); +int shm_regexec(const regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags); + +#define shm_regerror regerror + +#endif /* _SHM_REGEX_H */