From: Dennis Schafroth Date: Thu, 20 May 2010 13:15:23 +0000 (+0200) Subject: Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2 X-Git-Tag: v1.4.1~6^2~1 X-Git-Url: http://git.indexdata.com/?a=commitdiff_plain;h=ec22c4b0131db81c28977c78583277b9401629fd;hp=3d39722ae64c21a6d5833ec667ef9fd2fb66913f;p=pazpar2-moved-to-github.git Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2 --- diff --git a/configure.ac b/configure.ac index 8f7a6de..0464998 100644 --- a/configure.ac +++ b/configure.ac @@ -21,7 +21,7 @@ AC_LANG(C) AC_C_INLINE -YAZ_INIT([static icu],[4.0.4]) +YAZ_INIT([static icu],[4.0.9]) if test -z "$YAZLIB"; then AC_MSG_ERROR([YAZ development libraries missing]) fi diff --git a/etc/tmarc.xsl b/etc/tmarc.xsl index f6de26b..8ecdf18 100644 --- a/etc/tmarc.xsl +++ b/etc/tmarc.xsl @@ -643,12 +643,6 @@ - - - - - - diff --git a/perf/bash/client.sh b/perf/bash/client.sh index 9f1c4c0..13b05ce 100755 --- a/perf/bash/client.sh +++ b/perf/bash/client.sh @@ -12,11 +12,14 @@ SERVICE=$3 if test -z "$SERVICE"; then SERVICE=perf fi - - +SETTINGS=$4 +WHAT=water H="http://localhost:${PORT}/search.pz2" wget -q -O $OF.init.xml "$H/?command=init&service=${SERVICE}&extra=$OF" S=`xsltproc get_session.xsl $OF.init.xml` -wget -q -O $OF.search.xml "$H?command=search&query=100&session=$S" +if [ "$SETTINGS" != "" ] ; then + wget -q -O $OF.settings.xml "$H?command=settings&session=$S&$SETTINGS" +fi +wget -q -O $OF.search.xml "$H?command=search&query=$WHAT&session=$S" sleep 1 wget -q -O $OF.show.xml "$H?command=show&session=$S&num=100&block=1" diff --git a/src/sel_thread.c b/src/sel_thread.c index 0677761..a550472 100644 --- a/src/sel_thread.c +++ b/src/sel_thread.c @@ -24,9 +24,16 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "sel_thread.h" #include #include +#if HAVE_UNISTD_H #include +#endif +#ifdef WIN32 +#include +#endif #include -#include +#include +#include +#include #include struct work_item { @@ -55,11 +62,13 @@ static void queue_trav(struct work_item *q, void (*f)(void *data)) } struct sel_thread { - int fd[2]; + int write_fd; + int read_fd; + yaz_spipe_t spipe; NMEM nmem; - pthread_t *thread_id; - pthread_mutex_t mutex; - pthread_cond_t input_data; + yaz_thread_t *thread_id; + YAZ_MUTEX mutex; + YAZ_COND input_data; int stop_flag; int no_threads; struct work_item *input_queue; @@ -79,9 +88,9 @@ static void *sel_thread_handler(void *vp) { struct work_item *work_this = 0; /* wait for some work */ - pthread_mutex_lock(&p->mutex); + yaz_mutex_enter(p->mutex); while (!p->stop_flag && !p->input_queue) - pthread_cond_wait(&p->input_data, &p->mutex); + yaz_cond_wait(p->input_data, p->mutex, 0); /* see if we were waken up because we're shutting down */ if (p->stop_flag) break; @@ -93,21 +102,25 @@ static void *sel_thread_handler(void *vp) yaz_log(YLOG_DEBUG, "input queue length after pop: %d", input_queue_length); assert(work_this); - pthread_mutex_unlock(&p->mutex); + yaz_mutex_leave(p->mutex); /* work on this item */ p->work_handler(work_this->data); /* put it back into output queue */ - pthread_mutex_lock(&p->mutex); + yaz_mutex_enter(p->mutex); work_this->next = p->output_queue; p->output_queue = work_this; - pthread_mutex_unlock(&p->mutex); + yaz_mutex_leave(p->mutex); /* wake up select/poll with a single byte */ - (void) write(p->fd[1], "", 1); +#ifdef WIN32 + (void) send(p->write_fd, "", 1, 0); +#else + (void) write(p->write_fd, "", 1); +#endif } - pthread_mutex_unlock(&p->mutex); + yaz_mutex_leave(p->mutex); return 0; } @@ -125,39 +138,55 @@ sel_thread_t sel_thread_create(void (*work_handler)(void *work_data), assert(no_of_threads >= 1); p->nmem = nmem; - if (pipe(p->fd)) + +#ifdef WIN32 + /* use port 12119 temporarily on Windos and hope for the best */ + p->spipe = yaz_spipe_create(12119, 0); +#else + p->spipe = yaz_spipe_create(0, 0); +#endif + if (!p->spipe) { nmem_destroy(nmem); return 0; - } - *read_fd = p->fd[0]; + } + + *read_fd = p->read_fd = yaz_spipe_get_read_fd(p->spipe); + p->write_fd = yaz_spipe_get_write_fd(p->spipe); + p->input_queue = 0; p->output_queue = 0; p->free_queue = 0; p->work_handler = work_handler; p->work_destroy = work_destroy; - + p->no_threads = 0; /* we if need to destroy */ p->stop_flag = 0; - p->no_threads = no_of_threads; - pthread_mutex_init(&p->mutex, 0); - pthread_cond_init(&p->input_data, 0); + p->mutex = 0; + yaz_mutex_create(&p->mutex); + yaz_cond_create(&p->input_data); + if (p->input_data == 0) /* condition variable could not be created? */ + { + sel_thread_destroy(p); + return 0; + } + p->no_threads = no_of_threads; p->thread_id = nmem_malloc(nmem, sizeof(*p->thread_id) * p->no_threads); for (i = 0; i < p->no_threads; i++) - pthread_create(p->thread_id + i, 0, sel_thread_handler, p); + p->thread_id[i] = yaz_thread_create(sel_thread_handler, p); return p; } void sel_thread_destroy(sel_thread_t p) { int i; - pthread_mutex_lock(&p->mutex); + yaz_mutex_enter(p->mutex); p->stop_flag = 1; - pthread_cond_broadcast(&p->input_data); - pthread_mutex_unlock(&p->mutex); + yaz_cond_broadcast(p->input_data); + yaz_mutex_leave(p->mutex); for (i = 0; i< p->no_threads; i++) - pthread_join(p->thread_id[i], 0); + yaz_thread_join(&p->thread_id[i], 0); if (p->work_destroy) { @@ -165,10 +194,9 @@ void sel_thread_destroy(sel_thread_t p) queue_trav(p->output_queue, p->work_destroy); } - close(p->fd[0]); - close(p->fd[1]); - pthread_cond_destroy(&p->input_data); - pthread_mutex_destroy(&p->mutex); + yaz_spipe_destroy(p->spipe); + yaz_cond_destroy(&p->input_data); + yaz_mutex_destroy(&p->mutex); nmem_destroy(p->nmem); } @@ -176,7 +204,7 @@ void sel_thread_add(sel_thread_t p, void *data) { struct work_item *work_p; - pthread_mutex_lock(&p->mutex); + yaz_mutex_enter(p->mutex); if (p->free_queue) { @@ -191,8 +219,8 @@ void sel_thread_add(sel_thread_t p, void *data) p->input_queue = work_p; input_queue_length++; yaz_log(YLOG_DEBUG, "sel_thread_add: Input queue length after push: %d", input_queue_length); - pthread_cond_signal(&p->input_data); - pthread_mutex_unlock(&p->mutex); + yaz_cond_signal(p->input_data); + yaz_mutex_leave(p->mutex); } void *sel_thread_result(sel_thread_t p) @@ -201,7 +229,7 @@ void *sel_thread_result(sel_thread_t p) void *data = 0; char read_buf[1]; - pthread_mutex_lock(&p->mutex); + yaz_mutex_enter(p->mutex); /* got something. Take the last one out of output_queue */ work_this = queue_remove_last(&p->output_queue); @@ -212,9 +240,13 @@ void *sel_thread_result(sel_thread_t p) p->free_queue = work_this; data = work_this->data; - (void) read(p->fd[0], read_buf, 1); +#ifdef WIN32 + (void) recv(p->read_fd, read_buf, 1, 0); +#else + (void) read(p->read_fd, read_buf, 1); +#endif } - pthread_mutex_unlock(&p->mutex); + yaz_mutex_leave(p->mutex); return data; } diff --git a/src/session.c b/src/session.c index 0c914ca..61f7e54 100644 --- a/src/session.c +++ b/src/session.c @@ -1143,6 +1143,7 @@ static int ingest_to_cluster(struct client *cl, \param cl client holds the result set for record \param rec record buffer (0 terminated) \param record_no record position (1, 2, ..) + \param nmem working NMEM \retval 0 OK \retval -1 failure */ diff --git a/win/makefile b/win/makefile index 5f814f2..7d255d7 100644 --- a/win/makefile +++ b/win/makefile @@ -4,7 +4,7 @@ DEBUG=0 # 0 for release, 1 for debug USE_MANIFEST = 1 # Can be enabled Visual Studio 2005/2008 PACKAGE_NAME=pazpar2 -PACKAGE_VERSION=1.3.0 +PACKAGE_VERSION=1.4.0 # YAZ YAZ_DIR=..\..\yaz @@ -202,6 +202,7 @@ PAZPAR2_OBJS = \ "$(OBJDIR)\normalize_cache.obj" \ "$(OBJDIR)\ppmutex.obj" \ "$(OBJDIR)\incref.obj" \ + "$(OBJDIR)\sel_thread.obj" \ "$(OBJDIR)\connection.obj"