+Split YAZ library into two libs : libyaz.la and libyaz_server.la.
+libyaz.la is the core of YAZ except the generic frontend server and
+does not depend on POSIX threads anymore. libyaz_server.la is the
+generic frontend server facilities and uses POSIX thread functionality
+if available. The libyaz.la no longer depends on POSIX threads because
+the number of global structures is limited. NMEM no longer re-uses blocks
+between threads ; it simply free's memory immediately but allocates in
+"large" chunks as usual. We don't expect any performance penalties
+because of this. The yaz_log system is still using a global log_level so
+caution must be taken when modifying it with yaz_log_init_.. +
+yaz_log_mask_str. This, however, should not cause any trouble because
+these functions are called during initialization of application code
+anyway. `yaz-config --libs server` returns libs for server applications;
+`yaz-config --libs` returns libs for non-server applications.
+
New OID database - with public definitions in oid_db.h. Removed old OID
database including the head oid.h and definitions such as enum oid_value
and struct oident. The new OID database uses the same string names as
dnl YAZ Toolkit, Index Data 1995-2007
dnl See the file LICENSE for details.
-dnl $Id: configure.ac,v 1.74 2007-04-16 21:53:08 adam Exp $
+dnl $Id: configure.ac,v 1.75 2007-04-17 20:26:18 adam Exp $
AC_PREREQ(2.59)
AC_INIT([yaz],[2.1.99.3],[yaz-help@indexdata.dk])
AC_CONFIG_SRCDIR(configure.ac)
AC_ARG_ENABLE(threads, [ --disable-threads disable POSIX threads],[enable_threads=$enableval],[enable_threads=yes])
if test "$enable_threads" = "yes" -a "$HAVETHREADS" = "0"; then
ACX_PTHREAD([
+ OCFLAGS=$CFLAGS
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- AC_DEFINE(YAZ_POSIX_THREADS)
dnl unfortunately empty thread lib spec is problematic because
dnl 'yaz-config --cflags' is not always passed to linker in
dnl applications using YAZ (such as Zebra).
done
LIBS=$OLIBS
fi
- LIBS="$PTHREAD_LIBS $LIBS"
- YAZ_CONFIG_CFLAGS="$YAZ_CONFIG_CFLAGS $PTHREAD_CFLAGS -DYAZ_POSIX_THREADS=1"
+ CFLAGS=$OCFLAGS
+ PTHREAD_CFLAGS="$PTHREAD_CFLAGS -DYAZ_POSIX_THREADS=1"
])
fi
-## $Id: Makefile.am,v 1.42 2007-04-16 21:53:08 adam Exp $
+## $Id: Makefile.am,v 1.43 2007-04-17 20:26:18 adam Exp $
pkginclude_HEADERS= backend.h ccl.h ccl_xml.h cql.h comstack.h \
diagbib1.h diagsrw.h diagsru_update.h sortspec.h log.h logrpn.h marcdisp.h \
tcpip.h test.h timing.h unix.h tpath.h wrbuf.h xmalloc.h \
yaz-ccl.h yaz-iconv.h yaz-util.h yaz-version.h yconfig.h proto.h \
xmlquery.h libxml2_error.h xmltypes.h snprintf.h query-charset.h \
- oid_db.h oid_util.h oid_std.h \
+ mutex.h oid_db.h oid_util.h oid_std.h \
\
ill.h ill-core.h item-req.h z-accdes1.h z-accform1.h \
z-acckrb1.h z-core.h z-date.h z-diag1.h z-espec1.h z-estask.h z-exp.h \
--- /dev/null
+/*
+ * Copyright (c) 1995-2007, Index Data
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Index Data nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/* $Id: mutex.h,v 1.1 2007-04-17 20:26:18 adam Exp $ */
+
+/**
+ * \file mutex.h
+ * \brief Header for Mutex functions
+ */
+#ifndef YAZ_MUTEX_H
+#define YAZ_MUTEX_H
+
+#include <stddef.h>
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+/** \brief NMEM/YAZ MUTEX opaque pointer */
+typedef struct yaz_mutex *YAZ_MUTEX;
+/** \brief create Mutex */
+YAZ_EXPORT void yaz_mutex_create(YAZ_MUTEX *);
+/** \brief enter critical section / AKA lock */
+YAZ_EXPORT void yaz_mutex_enter(YAZ_MUTEX);
+/** \brief leave critical section / AKA unlock */
+YAZ_EXPORT void yaz_mutex_leave(YAZ_MUTEX);
+/** \brief destroy MUTEX */
+YAZ_EXPORT void yaz_mutex_destroy(YAZ_MUTEX *);
+
+YAZ_END_CDECL
+
+#endif
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/* $Id: nmem.h,v 1.24 2007-01-03 08:42:14 adam Exp $ */
+/* $Id: nmem.h,v 1.25 2007-04-17 20:26:18 adam Exp $ */
/**
* \file nmem.h
#include <stddef.h>
#include <yaz/yconfig.h>
-#define NMEM_DEBUG 0
-
-#ifndef NMEM_DEBUG
-#define NMEM_DEBUG 0
-#endif
-
YAZ_BEGIN_CDECL
-/** \brief NMEM/YAZ MUTEX opaque pointer */
-typedef struct nmem_mutex *NMEM_MUTEX;
-/** \brief create Mutex */
-YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *);
-/** \brief enter critical section / AKA lock */
-YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX);
-/** \brief leave critical section / AKA unlock */
-YAZ_EXPORT void nmem_mutex_leave(NMEM_MUTEX);
-/** \brief destroy MUTEX */
-YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *);
-
/** \brief NMEM handle (an opaque pointer to memory) */
typedef struct nmem_control *NMEM;
/** \brief transfers memory from one NMEM handle to another */
YAZ_EXPORT void nmem_transfer (NMEM dst, NMEM src);
-/** \brief internal (do not use) */
-YAZ_EXPORT void nmem_critical_enter (void);
-/** \brief internal (do not use) */
-YAZ_EXPORT void nmem_critical_leave (void);
-
-#if NMEM_DEBUG
-
-YAZ_EXPORT NMEM nmem_create_f(const char *file, int line);
-YAZ_EXPORT void nmem_destroy_f(const char *file, int line, NMEM n);
-YAZ_EXPORT void *nmem_malloc_f(const char *file, int line, NMEM n, int size);
-#define nmem_create() nmem_create_f(__FILE__, __LINE__)
-#define nmem_destroy(x) nmem_destroy_f(__FILE__, __LINE__, (x))
-#define nmem_malloc(x, y) nmem_malloc_f(__FILE__, __LINE__, (x), (y))
-
-YAZ_EXPORT void nmem_print_list (void);
-YAZ_EXPORT void nmem_print_list_l (int level);
-
-#else
-
/** \brief returns new NMEM handle */
YAZ_EXPORT NMEM nmem_create(void);
/** \brief allocate memory block on NMEM handle */
YAZ_EXPORT void *nmem_malloc(NMEM n, int size);
-#define nmem_print_list()
-
-#endif
-
-/** \brief initializes NMEM system
- This function increments a usage counter for NMEM.. Only
- on first usage the system is initialized.. The \fn nmem_exit
- decrements the counter. So these must be called in pairs
-*/
-YAZ_EXPORT void nmem_init (void);
-
-/** \brief destroys NMEM system */
-YAZ_EXPORT void nmem_exit (void);
-
YAZ_EXPORT int yaz_errno (void);
YAZ_EXPORT void yaz_set_errno (int v);
YAZ_EXPORT void yaz_strerror(char *buf, int max);
-/** \brief returns memory in use (by application)
- \param p pointer to size (in bytes)
- */
-YAZ_EXPORT void nmem_get_memory_in_use(size_t *p);
-/** \brief returns memory in free (for later reuse)
- */
-YAZ_EXPORT void nmem_get_memory_free(size_t *p);
-
YAZ_END_CDECL
#endif
## This file is part of the YAZ toolkit.
## Copyright (C) 1995-2007, Index Data, All rights reserved.
-## $Id: Makefile.am,v 1.60 2007-04-17 08:15:15 adam Exp $
+## $Id: Makefile.am,v 1.61 2007-04-17 20:26:18 adam Exp $
YAZ_VERSION_INFO=3:0:0
-lib_LTLIBRARIES = libyaz.la
+lib_LTLIBRARIES = libyaz.la libyaz_server.la
# noinst_PROGRAMS = cqlparse
dist-hook:
YAZCOMP_I = $(YAZCOMP) -d $(srcdir)/ill.tcl -i yaz -I$(top_srcdir)/include
AM_CPPFLAGS=-I$(top_srcdir)/include $(XML2_CFLAGS) $(SSL_CFLAGS)
+libyaz_server_la_CFLAGS = $(PTHREAD_CFLAGS)
+
AM_YFLAGS=-p cql_
cclqfile.c cclstr.c cclxmlconfig.c \
cql.y cqlstdio.c cqltransform.c cqlutil.c xcqlutil.c cqlstring.c \
cqlstrer.c querytowrbuf.c \
- eventl.c seshigh.c statserv.c requestq.c tcpdchk.c \
- eventl.h service.c service.h session.h test.c timing.c \
+ tcpdchk.c \
+ test.c timing.c \
xmlquery.c http.c \
mime.c mime.h oid_util.c \
record_conv.c retrieval.c elementset.c snprintf.c query-charset.c
libyaz_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
+libyaz_server_la_SOURCES = statserv.c seshigh.c eventl.c \
+ requestq.c eventl.h session.h service.c service.h mutex.c
+
+libyaz_server_la_LDFLAGS=-version-info $(YAZ_VERSION_INFO)
+
# Rules for Z39.50 V3
z-accdes1.c \
z-accform1.c \
* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: log.c,v 1.49 2007-03-22 09:13:13 adam Exp $
+ * $Id: log.c,v 1.50 2007-04-17 20:26:18 adam Exp $
*/
/**
#include <windows.h>
#endif
-#if YAZ_POSIX_THREADS
-#include <pthread.h>
-#endif
-
-#if YAZ_GNU_THREADS
-#include <pth.h>
-#endif
-
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <yaz/snprintf.h>
#include <yaz/xmalloc.h>
-static NMEM_MUTEX log_mutex = 0;
-
#define HAS_STRERROR 1
return;
mutex_init_flag = 1; /* here, 'cause nmem_mutex_create may call yaz_log */
- nmem_mutex_create(&log_mutex);
-
env = getenv("YAZ_LOG");
if (env)
l_level = yaz_log_mask_str_x(env, l_level);
yaz_log(YLOG_LOGLVL, "Setting log level to %d = 0x%08x",
l_level, l_level);
/* determine size of mask_names (locked) */
- nmem_mutex_enter(log_mutex);
for (sz = 0; mask_names[sz].name; sz++)
;
- nmem_mutex_leave(log_mutex);
/* second pass without lock */
for (i = 0; i < sz; i++)
if (mask_names[i].mask && *mask_names[i].name)
struct tm *tm;
#endif
- nmem_mutex_enter(log_mutex);
#if HAVE_LOCALTIME_R
localtime_r(&cur_time, tm);
#else
tm = localtime(&cur_time);
#endif
yaz_log_open_check(tm, 1, filemode);
- nmem_mutex_leave(log_mutex);
}
yaz_log_do_reopen("w");
}
-
-
static void yaz_strftime(char *dst, size_t sz,
const char *fmt, const struct tm *tm)
{
- const char *cp = strstr(fmt, "%!");
- if (cp && strlen(fmt) < 60)
- {
- char fmt2[80];
- char tpidstr[20];
-#ifdef WIN32
- DWORD tid = GetCurrentThreadId();
-#else
-#if YAZ_POSIX_THREADS
- pthread_t tid = pthread_self();
-#else
- long tid = 0;
-#endif
-#endif
- memcpy(fmt2, fmt, cp-fmt);
- fmt2[cp-fmt] = '\0';
- sprintf(tpidstr, "%08lx", (long) tid);
- strcat(fmt2, tpidstr);
- strcat(fmt2, cp+2);
- strftime(dst, sz, fmt2, tm);
- }
- else
- strftime(dst, sz, fmt, tm);
+ strftime(dst, sz, fmt, tm);
}
static void yaz_log_to_file(int level, const char *log_message)
internal_log_init();
- nmem_mutex_enter(log_mutex);
-
#if HAVE_LOCALTIME_R
localtime_r(&ti, tm);
#else
if (l_level & YLOG_FLUSH)
fflush(file);
}
- nmem_mutex_leave(log_mutex);
}
void yaz_log(int level, const char *fmt, ...)
return;
va_start(ap, fmt);
- yaz_vsnprintf(buf, sizeof(buf)-1, fmt, ap);
+ /* 30 is enough for our 'rest of output' message */
+ yaz_vsnprintf(buf, sizeof(buf)-30, fmt, ap);
+ if (strlen(buf) >= sizeof(buf)-31)
+ strcat(buf, " [rest of output omitted]");
+
if (o_level & YLOG_ERRNO)
{
strcat(buf, " [");
{
int i;
- nmem_mutex_enter(log_mutex);
for (i = 0; mask_names[i].name; i++)
if (0 == strcmp(mask_names[i].name, name))
{
- nmem_mutex_leave(log_mutex);
return mask_names[i].mask;
}
if ( (i>=MAX_MASK_NAMES) || (next_log_bit & (1<<31) ))
{
- nmem_mutex_leave(log_mutex);
yaz_log(YLOG_WARN, "No more log bits left, not logging '%s'", name);
return 0;
}
strcpy(mask_names[i].name, name);
mask_names[i+1].name = NULL;
mask_names[i+1].mask = 0;
- nmem_mutex_leave(log_mutex);
return mask_names[i].mask;
}
char *n = clean_name(name, strlen(name), clean, sizeof(clean));
internal_log_init();
- nmem_mutex_enter(log_mutex);
for (i = 0; mask_names[i].name; i++)
if (0==strcmp(n, mask_names[i].name))
{
- nmem_mutex_leave(log_mutex);
yaz_log(YLOG_LOGLVL, "returning log bit 0x%x for '%s' %s",
mask_names[i].mask, n,
strcmp(n,name) ? name : "");
return mask_names[i].mask;
}
- nmem_mutex_leave(log_mutex);
yaz_log(YLOG_LOGLVL, "returning NO log bit for '%s' %s", n,
strcmp(n, name) ? name : "" );
return 0;
--- /dev/null
+/*
+ * Copyright (C) 1995-2007, Index Data ApS
+ * See the file LICENSE for details.
+ *
+ * $Id: mutex.c,v 1.1 2007-04-17 20:26:18 adam Exp $
+ */
+
+/**
+ * \file mutex.c
+ * \brief Implements MUTEX functions
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stddef.h>
+#include <yaz/xmalloc.h>
+#include <yaz/nmem.h>
+#include <yaz/log.h>
+#include <yaz/mutex.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#if YAZ_POSIX_THREADS
+#include <pthread.h>
+#endif
+
+#if YAZ_GNU_THREADS
+#include <pth.h>
+#endif
+
+#ifdef WIN32
+struct yaz_mutex {
+ CRITICAL_SECTION m_handle;
+};
+#elif YAZ_POSIX_THREADS
+struct yaz_mutex {
+ pthread_mutex_t m_handle;
+};
+#elif YAZ_GNU_THREADS
+struct yaz_mutex {
+ pth_mutex_t m_handle;
+};
+#else
+struct yaz_mutex {
+ int dummy;
+};
+#endif
+
+YAZ_EXPORT void yaz_mutex_create(YAZ_MUTEX *p)
+{
+ if (!*p)
+ {
+ *p = (YAZ_MUTEX) malloc(sizeof(**p));
+#ifdef WIN32
+ InitializeCriticalSection(&(*p)->m_handle);
+#elif YAZ_POSIX_THREADS
+ pthread_mutex_init(&(*p)->m_handle, 0);
+#elif YAZ_GNU_THREADS
+ pth_mutex_init(&(*p)->m_handle);
+#endif
+ }
+}
+
+YAZ_EXPORT void yaz_mutex_enter(YAZ_MUTEX p)
+{
+ if (p)
+ {
+#ifdef WIN32
+ EnterCriticalSection(&p->m_handle);
+#elif YAZ_POSIX_THREADS
+ pthread_mutex_lock(&p->m_handle);
+#endif
+ }
+}
+
+YAZ_EXPORT void yaz_mutex_leave(YAZ_MUTEX p)
+{
+ if (p)
+ {
+#ifdef WIN32
+ LeaveCriticalSection(&p->m_handle);
+#elif YAZ_POSIX_THREADS
+ pthread_mutex_unlock(&p->m_handle);
+#endif
+ }
+}
+
+YAZ_EXPORT void yaz_mutex_destroy(YAZ_MUTEX *p)
+{
+ if (*p)
+ {
+#ifdef WIN32
+ DeleteCriticalSection(&(*p)->m_handle);
+#endif
+ free(*p);
+ *p = 0;
+ }
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+
* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: nmem.c,v 1.29 2007-04-12 13:52:57 adam Exp $
+ * $Id: nmem.c,v 1.30 2007-04-17 20:26:18 adam Exp $
*/
/**
#include <windows.h>
#endif
-#if YAZ_POSIX_THREADS
-#include <pthread.h>
-#endif
-
-#if YAZ_GNU_THREADS
-#include <pth.h>
-#endif
-
#define NMEM_CHUNK (4*1024)
struct nmem_block
static int log_level = 0;
static int log_level_initialized = 0;
-#ifdef WIN32
-static CRITICAL_SECTION critical_section;
-#define NMEM_ENTER EnterCriticalSection(&critical_section)
-#define NMEM_LEAVE LeaveCriticalSection(&critical_section)
-struct nmem_mutex {
- CRITICAL_SECTION m_handle;
-};
-#elif YAZ_POSIX_THREADS
-static pthread_mutex_t nmem_mutex = PTHREAD_MUTEX_INITIALIZER;
-#define NMEM_ENTER pthread_mutex_lock(&nmem_mutex);
-#define NMEM_LEAVE pthread_mutex_unlock(&nmem_mutex);
-struct nmem_mutex {
- pthread_mutex_t m_handle;
-};
-#elif YAZ_GNU_THREADS
-static pth_mutex_t nmem_mutex = PTH_MUTEX_INIT;
-#define NMEM_ENTER pth_mutex_acquire(&nmem_mutex, 0, 0)
-#define NMEM_LEAVE pth_mutex_release(&nmem_mutex)
-struct nmem_mutex {
- pth_mutex_t m_handle;
-};
-#else
-#define NMEM_ENTER
-#define NMEM_LEAVE
-struct nmem_mutex {
- int dummy;
-};
-#endif
-
-size_t nmem_memory_in_use = 0;
-size_t nmem_memory_free = 0;
-
-YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p)
-{
- NMEM_ENTER;
- if (!*p)
- {
- *p = (NMEM_MUTEX) malloc(sizeof(**p));
-#ifdef WIN32
- InitializeCriticalSection(&(*p)->m_handle);
-#elif YAZ_POSIX_THREADS
- pthread_mutex_init(&(*p)->m_handle, 0);
-#elif YAZ_GNU_THREADS
- pth_mutex_init(&(*p)->m_handle);
-#endif
- }
- NMEM_LEAVE;
- if (!log_level_initialized)
- {
- log_level_initialized = 1;
- log_level = yaz_log_module_level("nmem");
- }
-
-}
-
-YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX p)
-{
- if (p)
- {
-#ifdef WIN32
- EnterCriticalSection(&p->m_handle);
-#elif YAZ_POSIX_THREADS
- pthread_mutex_lock(&p->m_handle);
-#endif
- }
-}
-
-YAZ_EXPORT void nmem_mutex_leave(NMEM_MUTEX p)
-{
- if (p)
- {
-#ifdef WIN32
- LeaveCriticalSection(&p->m_handle);
-#elif YAZ_POSIX_THREADS
- pthread_mutex_unlock(&p->m_handle);
-#endif
- }
-}
-
-YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *p)
-{
- if (*p)
- {
-#ifdef WIN32
- DeleteCriticalSection(&(*p)->m_handle);
-#endif
- free(*p);
- *p = 0;
- }
-}
-
-/** \brief free NMEM memory blocks . Reused in get_block */
-static struct nmem_block *freelist = NULL;
-
-/** \brief free NMEM control blocks. Reused in nmem_create */
-static struct nmem_control *cfreelist = NULL;
-
-/** \brief number NMEM's in use (number of nmem_controls not in free list) */
-static int nmem_active_no = 0;
-
-/** \brief NMEM usage counter */
-static int nmem_init_flag = 0;
-
-/** \brief whether nmem blocks should be reassigned to heap */
-static int nmem_release_in_heap = 0;
-
-#if NMEM_DEBUG
-struct nmem_debug_info {
- void *p;
- char file[40];
- int line;
- struct nmem_debug_info *next;
-};
-
-struct nmem_debug_info *nmem_debug_list = 0;
-#endif
-
static void free_block(struct nmem_block *p)
{
- nmem_memory_in_use -= p->size;
- if (nmem_release_in_heap)
- {
- xfree(p->buf);
- xfree(p);
- }
- else
- {
- memset(p->buf, 'Y', p->size);
- p->next = freelist;
- freelist = p;
- nmem_memory_free += p->size;
- }
+ xfree(p->buf);
+ xfree(p);
if (log_level)
yaz_log (log_level, "nmem free_block p=%p", p);
}
-#if NMEM_DEBUG
-void nmem_print_list (void)
-{
- if (log_level)
- nmem_print_list_l(log_level);
-}
-
-void nmem_print_list_l (int level)
-{
- struct nmem_debug_info *p;
-
- yaz_log (level, "nmem print list");
- NMEM_ENTER;
- for (p = nmem_debug_list; p; p = p->next)
- yaz_log (level, " %s:%d p=%p size=%d", p->file, p->line, p->p,
- nmem_total(p->p));
- NMEM_LEAVE;
-}
-#endif
/*
* acquire a block with a minimum of size free bytes.
*/
static struct nmem_block *get_block(size_t size)
{
- struct nmem_block *r, *l;
+ struct nmem_block *r;
+ size_t get = NMEM_CHUNK;
if (log_level)
yaz_log (log_level, "nmem get_block size=%ld", (long) size);
- for (r = freelist, l = 0; r; l = r, r = r->next)
- if (r->size >= size)
- break;
- if (r)
- {
- if (log_level)
- yaz_log (log_level, "nmem get_block found free block p=%p", r);
- if (l)
- l->next = r->next;
- else
- freelist = r->next;
- nmem_memory_free -= r->size;
- }
- else
- {
- size_t get = NMEM_CHUNK;
-
- if (get < size)
- get = size;
- if(log_level)
- yaz_log (log_level, "nmem get_block alloc new block size=%ld",
- (long) get);
-
- r = (struct nmem_block *) xmalloc(sizeof(*r));
- r->buf = (char *)xmalloc(r->size = get);
- }
- nmem_memory_in_use += r->size;
+
+ if (get < size)
+ get = size;
+ if(log_level)
+ yaz_log (log_level, "nmem get_block alloc new block size=%ld",
+ (long) get);
+
+ r = (struct nmem_block *) xmalloc(sizeof(*r));
+ r->buf = (char *)xmalloc(r->size = get);
r->top = 0;
return r;
}
yaz_log (log_level, "nmem_reset p=%p", n);
if (!n)
return;
- NMEM_ENTER;
while (n->blocks)
{
t = n->blocks;
free_block(t);
}
n->total = 0;
- NMEM_LEAVE;
}
-#if NMEM_DEBUG
-void *nmem_malloc_f (const char *file, int line, NMEM n, int size)
-#else
void *nmem_malloc(NMEM n, int size)
-#endif
{
struct nmem_block *p;
char *r;
-#if NMEM_DEBUG
- if (log_level)
- yaz_log (log_level, "%s:%d: nmem_malloc p=%p size=%d",
- file, line, n, size);
-#endif
if (!n)
{
yaz_log (YLOG_FATAL, "calling nmem_malloc with an null pointer");
abort ();
}
-#ifdef WIN32
- assert (nmem_init_flag);
-#endif
- NMEM_ENTER;
p = n->blocks;
if (!p || p->size < size + p->top)
{
/* align size */
p->top += (size + (NMEM_ALIGN - 1)) & ~(NMEM_ALIGN - 1);
n->total += size;
- NMEM_LEAVE;
return r;
}
return n->total;
}
-#if NMEM_DEBUG
-NMEM nmem_create_f(const char *file, int line)
-#else
NMEM nmem_create(void)
-#endif
{
NMEM r;
-#if NMEM_DEBUG
- struct nmem_debug_info *debug_p;
-#endif
if (!log_level_initialized)
{
log_level = yaz_log_module_level("nmem");
log_level_initialized = 1;
}
- NMEM_ENTER;
- nmem_active_no++;
- r = cfreelist;
- if (r)
- cfreelist = cfreelist->next;
- else
- r = (struct nmem_control *)xmalloc(sizeof(*r));
- NMEM_LEAVE;
+ r = (struct nmem_control *)xmalloc(sizeof(*r));
-#if NMEM_DEBUG
- yaz_log (YLOG_DEBUG, "%s:%d: nmem_create %d p=%p", file, line,
- nmem_active_no, r);
-#endif
r->blocks = 0;
r->total = 0;
r->next = 0;
-#if NMEM_DEBUG
- for (debug_p = nmem_debug_list; debug_p; debug_p = debug_p->next)
- if (debug_p->p == r)
- {
- yaz_log (YLOG_FATAL, "multi used block in nmem");
- abort ();
- }
- debug_p = xmalloc (sizeof(*debug_p));
- strncpy (debug_p->file, file, sizeof(debug_p->file)-1);
- debug_p->file[sizeof(debug_p->file)-1] = '\0';
- debug_p->line = line;
- debug_p->p = r;
- debug_p->next = nmem_debug_list;
- nmem_debug_list = debug_p;
-
- nmem_print_list();
-#endif
return r;
}
-#if NMEM_DEBUG
-void nmem_destroy_f(const char *file, int line, NMEM n)
-#else
void nmem_destroy(NMEM n)
-#endif
{
-#if NMEM_DEBUG
- struct nmem_debug_info **debug_p;
- int ok = 0;
-#endif
if (!n)
return;
-#if NMEM_DEBUG
- yaz_log (log_level, "%s:%d: nmem_destroy %d p=%p", file, line,
- nmem_active_no-1, n);
- NMEM_ENTER;
- for (debug_p = &nmem_debug_list; *debug_p; debug_p = &(*debug_p)->next)
- if ((*debug_p)->p == n)
- {
- struct nmem_debug_info *debug_save = *debug_p;
- *debug_p = (*debug_p)->next;
- xfree (debug_save);
- ok = 1;
- break;
- }
- NMEM_LEAVE;
- nmem_print_list();
- if (!ok)
- {
- yaz_log (YLOG_WARN, "%s:%d destroying unallocated nmem block p=%p",
- file, line, n);
- return;
- }
-#endif
nmem_reset(n);
- NMEM_ENTER;
- nmem_active_no--;
- if (nmem_release_in_heap)
- {
- xfree(n);
- }
- else
- {
- n->next = cfreelist;
- cfreelist = n;
- }
- NMEM_LEAVE;
+ xfree(n);
}
void nmem_transfer (NMEM dst, NMEM src)
src->total = 0;
}
-void nmem_get_memory_in_use(size_t *p)
-{
- NMEM_ENTER;
- *p = nmem_memory_in_use;
- NMEM_LEAVE;
-}
-
-void nmem_get_memory_free(size_t *p)
-{
- NMEM_ENTER;
- *p = nmem_memory_free;
- NMEM_LEAVE;
-}
-
-void nmem_critical_enter (void)
-{
- NMEM_ENTER;
-}
-
-void nmem_critical_leave (void)
-{
- NMEM_LEAVE;
-}
-
-void nmem_init (void)
-{
- if (++nmem_init_flag == 1)
- {
-#ifdef WIN32
- InitializeCriticalSection(&critical_section);
-#elif YAZ_GNU_THREADS
- pth_init ();
-#endif
- nmem_active_no = 0;
- freelist = NULL;
- cfreelist = NULL;
- }
- if (!log_level_initialized)
- {
- log_level = yaz_log_module_level("nmem");
- log_level_initialized = 1;
- }
-}
-
-void nmem_exit (void)
-{
- if (--nmem_init_flag == 0)
- {
- while (freelist)
- {
- struct nmem_block *fl = freelist;
- nmem_memory_free -= fl->size;
- freelist = freelist->next;
- xfree (fl->buf);
- xfree (fl);
- }
- while (cfreelist)
- {
- struct nmem_control *cfl = cfreelist;
- cfreelist = cfreelist->next;
- xfree (cfl);
- }
-#ifdef WIN32
- DeleteCriticalSection(&critical_section);
-#endif
- }
-}
-
-
-#ifdef WIN32
-BOOL WINAPI DllMain (HINSTANCE hinstDLL,
- DWORD reason,
- LPVOID reserved)
-{
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- nmem_init ();
- break;
- case DLL_PROCESS_DETACH:
- nmem_exit ();
- }
- return TRUE;
-}
-#endif
-
int yaz_errno(void)
{
return errno;
#else
/* UNIX */
#if HAVE_STRERROR_R
-#if YAZ_POSIX_THREADS
*buf = '\0';
strerror_r(errno, buf, max);
/* if buffer is unset - use strerror anyway (GLIBC bug) */
#else
strcpy(buf, strerror(yaz_errno()));
#endif
-#else
- strcpy(buf, strerror(yaz_errno()));
-#endif
/* UNIX */
#endif
if ((cp = strrchr(buf, '\n')))
* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: tstnmem.c,v 1.7 2007-01-03 08:42:16 adam Exp $
+ * $Id: tstnmem.c,v 1.8 2007-04-17 20:26:18 adam Exp $
*/
#if HAVE_CONFIG_H
int j;
char *cp;
- nmem_init();
n = nmem_create();
YAZ_CHECK(n);
YAZ_CHECK(cp);
}
nmem_destroy(n);
- nmem_exit();
}
int main (int argc, char **argv)
* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: marcdump.c,v 1.51 2007-03-19 14:40:08 adam Exp $
+ * $Id: marcdump.c,v 1.52 2007-04-17 20:26:18 adam Exp $
*/
#define _FILE_OFFSET_BITS 64
const char *leader_spec = 0;
int write_using_libxml2 = 0;
- nmem_init();
#if HAVE_LOCALE_H
setlocale(LC_CTYPE, "");
#endif
}
if (cfile)
fclose (cfile);
- nmem_exit();
if (!no)
{
usage(prog);
* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: srwtst.c,v 1.6 2007-01-03 08:42:16 adam Exp $
+ * $Id: srwtst.c,v 1.7 2007-04-17 20:26:18 adam Exp $
*/
#include <stdlib.h>
ODR decode, encode;
int debug = 0;
- nmem_init();
if (argc == 2 && !strcmp(argv[1], "debug"))
debug = 1;
no = fread(buf, 1, sizeof(buf), stdin);
}
odr_destroy(decode);
odr_destroy(encode);
- nmem_exit();
exit(0);
}
#else
#!/bin/sh
-# $Id: yaz-config.in,v 1.27 2007-04-13 10:24:32 adam Exp $
+# $Id: yaz-config.in,v 1.28 2007-04-17 20:26:18 adam Exp $
yazprefix=@prefix@
yaz_echo_cflags=no
yaz_echo_libs=no
yaz_echo_comp=no
yaz_src_root=@YAZ_SRC_ROOT@
yaz_build_root=@YAZ_BUILD_ROOT@
+PTHREAD_LIBS="@PTHREAD_LIBS@"
+PTHREAD_CFLAGS="@PTHREAD_CFLAGS@"
yazextralibs="@LIBS@"
YAZVERSION=@VERSION@
threads)
lib_thread=yes
;;
- malloc)
- lib_malloc=yes
+ server)
+ lib_thread=yes
+ lib_server=yes
;;
-*)
yaz_echo_help=yes
done
lyaz="-lyaz"
+if test "$lib_server" = "yes"; then
+ lyaz="-lyaz_server $lyaz"
+fi
YAZINC="@YAZ_CONFIG_CFLAGS@"
if test "$yaz_echo_source" = "yes"; then
YAZBIN=${yaz_build_root}/bin
- YAZLIB="-L${yaz_build_root}/src/.libs $lyaz $yazextralibs"
- YAZLALIB="${yaz_build_root}/src/libyaz.la $yazextralibs"
+
+ YAZLIB="-L${yaz_build_root}/src/.libs $lyaz"
+ YAZLIB="$YAZLIB $yazextralibs"
+
+ YAZLALIB="${yaz_build_root}/src/libyaz.la"
+ if test "$lib_server" = "yes"; then
+ YAZLALIB="${yaz_build_root}/src/libyaz_server.la $YAZLALIB"
+ fi
+ YAZLALIB="$YAZLALIB $yazextralibs"
+
YAZINC="-I${yaz_src_root}/include $YAZINC"
YAZCOMP=${yaz_src_root}/util/yaz-asncomp
else
YAZBIN=${yazprefix}/bin
YAZCOMP=${yazprefix}/bin/yaz-asncomp
- if test "$yazprefix" = "/usr"; then
- YAZLIB="$lyaz $yazextralibs"
- else
- YAZLIB="-L$yazprefix/lib $lyaz $yazextralibs"
+ if test "$yazprefix" != "/usr"; then
+ YAZLIB="-L$yazprefix/lib"
fi
+ YAZLIB="$YAZLIB $lyaz $yazextralibs"
YAZLALIB=$YAZLIB
if test "$yazprefix" != "/usr"; then
YAZINC="-I$yazprefix/include $YAZINC"
fi
fi
+if test "$lib_thread" = "yes"; then
+ YAZINC="$PTHREAD_CFLAGS $YAZINC"
+fi
+
+if test "$lib_thread" = "yes"; then
+ YAZLIB="$YAZLIB $PTHREAD_LIBS"
+fi
+
if test "$yaz_echo_help" = "yes"; then
usage 1 1>&2
fi
* Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoomsh.c,v 1.46 2007-04-12 13:52:58 adam Exp $
+ * $Id: zoomsh.c,v 1.47 2007-04-17 20:26:19 adam Exp $
*/
/** \file zoomsh.c
int mask = yaz_log_mask_str(maskstr);
yaz_log_init_level(mask);
}
- nmem_init();
zoomsh(argc, argv);
- nmem_exit();
exit (0);
}
/*
-/* $Id: zoomtst7.c,v 1.18 2007-03-21 11:27:47 adam Exp $ */
+/* $Id: zoomtst7.c,v 1.19 2007-04-17 20:26:19 adam Exp $ */
/** \file zoomtst7.c
\brief Mix of operations
ZOOM_resultset r[10]; /* and result sets .. */
ZOOM_options o;
- nmem_init ();
o = ZOOM_options_create ();
z = ZOOM_connection_new ("localhost", 9999);
-## $Id: Makefile.am,v 1.21 2007-02-25 14:46:51 adam Exp $
+## $Id: Makefile.am,v 1.22 2007-04-17 20:26:19 adam Exp $
bin_PROGRAMS=yaz-ztest
EXTRA_DIST=dummy-records dummy-words dummy-grs ztest.pem config1.xml
-yaz_ztest_LDADD=../src/libyaz.la
+yaz_ztest_LDADD=../src/libyaz_server.la ../src/libyaz.la $(PTHREAD_LIBS)
AM_CPPFLAGS=-I$(top_srcdir)/include $(XML2_CFLAGS)