[SR-Dev] git:ser_core_cvs: Wrapper functions for regcomp, regexec, regfree, and regerror using shared

Andrei Pelinescu-Onciul andrei at iptel.org
Fri Apr 3 16:05:10 CEST 2009


Module: sip-router
Branch: ser_core_cvs
Commit: e01a458045ad4363110dad04a774342a57b5851a
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e01a458045ad4363110dad04a774342a57b5851a

Author: Miklos Tirpak <miklos at iptel.org>
Committer: Miklos Tirpak <miklos at 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 at 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 at 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 */




More information about the sr-dev mailing list