From 5674966eeb7eecfa109ad419f1c997dba69ff0af Mon Sep 17 00:00:00 2001 From: Not Zed Date: Sun, 24 Dec 2000 00:58:02 +0000 Subject: Merge from camel-mt-branch. 2000-12-24 Not Zed * Merge from camel-mt-branch. svn path=/trunk/; revision=7152 --- libibex/ChangeLog | 24 ++++++++++++++++++++++++ libibex/Makefile.am | 5 +++-- libibex/dumpindex.c | 4 ++++ libibex/ibex_block.c | 38 +++++++++++++++++++++++++++++++++++--- libibex/ibex_internal.h | 19 +++++++++++++++++++ libibex/testindex.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 128 insertions(+), 6 deletions(-) (limited to 'libibex') diff --git a/libibex/ChangeLog b/libibex/ChangeLog index 877d9b8e29..2d3fe7bace 100644 --- a/libibex/ChangeLog +++ b/libibex/ChangeLog @@ -1,3 +1,27 @@ +2000-12-24 Not Zed + + * Merge from camel-mt-branch. + +2000-12-18 Not Zed + + * dumpindex.c (main): Same here. + + * testindex.c (main): Add a g_thread_init(). Sigh, glib's thread + stuff is snot. + (read_words): Setup another flat-out thread to test + multithreadedness at little bit. + + * ibex_block.c (ibex_index_buffer): Add locking around internal + calls. + (ibex_open): Init the locking mutex. + (ibex_close): Free the locking mutex. + (ibex_unindex): + (ibex_find): + (ibex_find_name): + (ibex_contains_name): Add locking around internal calls. + + * ibex_internal.h (struct ibex): Add a lock. Include config.h + 2000-12-13 Christopher James Lahey * disktail.c (tail_compress): diff --git a/libibex/Makefile.am b/libibex/Makefile.am index 61f3d72004..ab7c92206c 100644 --- a/libibex/Makefile.am +++ b/libibex/Makefile.am @@ -18,16 +18,17 @@ noinst_HEADERS = \ index.h INCLUDES = -I$(srcdir) $(GLIB_CFLAGS) $(UNICODE_CFLAGS) \ + $(THREADS_CFLAGS) \ -DG_LOG_DOMAIN=\"libibex\" noinst_PROGRAMS = dumpindex testindex dumpindex_SOURCES = dumpindex.c -dumpindex_LDADD = libibex.la $(GLIB_LIBS) $(UNICODE_LIBS) +dumpindex_LDADD = libibex.la $(GLIB_LIBS) $(UNICODE_LIBS) $(THREADS_LIBS) testindex_SOURCES = testindex.c -testindex_LDADD = libibex.la $(GLIB_LIBS) $(UNICODE_LIBS) -lm +testindex_LDADD = libibex.la $(GLIB_LIBS) $(UNICODE_LIBS) $(THREADS_LIBS) -lm #noinst_PROGRAMS = mkindex lookup # diff --git a/libibex/dumpindex.c b/libibex/dumpindex.c index cf4f02cc8a..410a7083d6 100644 --- a/libibex/dumpindex.c +++ b/libibex/dumpindex.c @@ -37,6 +37,10 @@ int main(int argc, char **argv) { ibex *ib; +#ifdef ENABLE_THREADS + g_thread_init(0); +#endif + if (argc != 2) { printf("Usage: %s ibexfile\n", argv[0]); return 1; diff --git a/libibex/ibex_block.c b/libibex/ibex_block.c index 41388162c4..faeee232ac 100644 --- a/libibex/ibex_block.c +++ b/libibex/ibex_block.c @@ -215,12 +215,17 @@ ibex_index_buffer (ibex *ib, char *name, char *buffer, size_t len, size_t *unrea p = q; } done: + IBEX_LOCK(ib); + d(printf("name %s count %d size %d\n", name, wordlist->len, len)); if (!ib->predone) { ib->words->klass->index_pre(ib->words); ib->predone = TRUE; } ib->words->klass->add_list(ib->words, name, wordlist); + + IBEX_UNLOCK(ib); + ret = 0; error: for (i=0;ilen;i++) @@ -246,12 +251,18 @@ ibex *ibex_open (char *file, int flags, int mode) /* FIXME: the blockcache or the wordindex needs to manage the other one */ ib->words = ib->blocks->words; +#ifdef ENABLE_THREADS + ib->lock = g_mutex_new(); +#endif return ib; } int ibex_save (ibex *ib) { d(printf("syncing database\n")); + + IBEX_LOCK(ib); + if (ib->predone) { ib->words->klass->index_post(ib->words); ib->predone = FALSE; @@ -259,6 +270,9 @@ int ibex_save (ibex *ib) ib->words->klass->sync(ib->words); /* FIXME: some return */ ibex_block_cache_sync(ib->blocks); + + IBEX_UNLOCK(ib); + return 0; } @@ -275,6 +289,9 @@ int ibex_close (ibex *ib) ib->words->klass->close(ib->words); ibex_block_cache_close(ib->blocks); +#ifdef ENABLE_THREADS + g_mutex_free(ib->lock); +#endif g_free(ib); return ret; } @@ -282,32 +299,47 @@ int ibex_close (ibex *ib) void ibex_unindex (ibex *ib, char *name) { d(printf("trying to unindex '%s'\n", name)); + IBEX_LOCK(ib); ib->words->klass->unindex_name(ib->words, name); + IBEX_UNLOCK(ib); } GPtrArray *ibex_find (ibex *ib, char *word) { char *normal; int len; + GPtrArray *ret; len = strlen(word); normal = alloca(len+1); ibex_normalise_word(word, word+len, normal); - return ib->words->klass->find(ib->words, normal); + IBEX_LOCK(ib); + ret = ib->words->klass->find(ib->words, normal); + IBEX_UNLOCK(ib); + return ret; } gboolean ibex_find_name (ibex *ib, char *name, char *word) { char *normal; int len; + gboolean ret; len = strlen(word); normal = alloca(len+1); ibex_normalise_word(word, word+len, normal); - return ib->words->klass->find_name(ib->words, name, normal); + IBEX_LOCK(ib); + ret = ib->words->klass->find_name(ib->words, name, normal); + IBEX_UNLOCK(ib); + return ret; } gboolean ibex_contains_name(ibex *ib, char *name) { - return ib->words->klass->contains_name(ib->words, name); + gboolean ret; + + IBEX_LOCK(ib); + ret = ib->words->klass->contains_name(ib->words, name); + IBEX_UNLOCK(ib); + return ret; } diff --git a/libibex/ibex_internal.h b/libibex/ibex_internal.h index 0eb4b625ce..f2212799c6 100644 --- a/libibex/ibex_internal.h +++ b/libibex/ibex_internal.h @@ -18,6 +18,8 @@ * Boston, MA 02111-1307, USA. */ +#include "config.h" + #include #include "ibex.h" @@ -29,4 +31,21 @@ struct ibex { struct _memcache *blocks; struct _IBEXWord *words; int predone; + + /* sigh i hate glib's mutex stuff too */ +#ifdef ENABLE_THREADS + GMutex *lock; +#endif + }; + +#ifdef ENABLE_THREADS +/*#define IBEX_LOCK(ib) (printf(__FILE__ "%d: %s: locking ibex\n", __LINE__, __FUNCTION__), g_mutex_lock(ib->lock)) + #define IBEX_UNLOCK(ib) (printf(__FILE__ "%d: %s: unlocking ibex\n", __LINE__, __FUNCTION__), g_mutex_unlock(ib->lock))*/ +#define IBEX_LOCK(ib) (g_mutex_lock(ib->lock)) +#define IBEX_UNLOCK(ib) (g_mutex_unlock(ib->lock)) +#else +#define IBEX_LOCK(ib) +#define IBEX_UNLOCK(ib) +#endif + diff --git a/libibex/testindex.c b/libibex/testindex.c index e21d73ff06..a3b6a9ce03 100644 --- a/libibex/testindex.c +++ b/libibex/testindex.c @@ -6,6 +6,10 @@ #include #include "ibex_internal.h" +#ifdef ENABLE_THREADS +#include +#endif + void word_index_mem_dump_info(struct _IBEXWord *idx); /* @@ -69,6 +73,29 @@ static char *getword(GPtrArray *words, float m, float s) return words->pdata[index]; } +#ifdef ENABLE_THREADS +int do_read_words; + +static void * +read_words(void *in) +{ + ibex *ib = in; + GPtrArray *a; + int lastlen = 0; + int i; + + while (do_read_words) { + a = ibex_find(ib, "joneses"); + if (a->len != lastlen) { + printf("Found %d joneses!\n", a->len); + lastlen = a->len; + } + for (i=0;ilen;i++) + g_free(a->pdata[i]); + g_ptr_array_free(a, TRUE); + } +} +#endif int main(int argc, char **argv) { @@ -83,9 +110,15 @@ int main(int argc, char **argv) int files; char *dict; +#ifdef ENABLE_THREADS + pthread_t id; + + g_thread_init(0); +#endif + srand(0xABADF00D); - files = 80000; + files = 8000; dict = "/usr/dict/words"; /* read words into an array */ @@ -119,6 +152,10 @@ int main(int argc, char **argv) return 1; } +#ifdef ENABLE_THREADS + do_read_words = 1; + pthread_create(&id, 0, read_words, ib); +#endif printf("Adding %d files\n", files); /* simulate adding new words to a bunch of files */ @@ -151,6 +188,11 @@ int main(int argc, char **argv) word_index_mem_dump_info(ib->words); +#ifdef ENABLE_THREADS + do_read_words = 0; + pthread_join(id, 0); +#endif + ibex_close(ib); return 0; -- cgit