diff options
Diffstat (limited to 'libibex/ibex_block.c')
-rw-r--r-- | libibex/ibex_block.c | 67 |
1 files changed, 38 insertions, 29 deletions
diff --git a/libibex/ibex_block.c b/libibex/ibex_block.c index 74eb594ad6..d8dade7986 100644 --- a/libibex/ibex_block.c +++ b/libibex/ibex_block.c @@ -12,6 +12,10 @@ #include <errno.h> #include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + #ifdef HAVE_ALLOCA_H #include <alloca.h> #endif @@ -48,7 +52,6 @@ static void ibex_use(ibex *ib) /* always lock list then ibex */ IBEX_LIST_LOCK(ib); - IBEX_LOCK(ib); if (ib->blocks == NULL) { o(printf("Delayed opening ibex '%s', total = %d\n", ib->name, ibex_opened+1)); @@ -71,8 +74,6 @@ static void ibex_use(ibex *ib) ibex_list_remove((struct _listnode *)ib); ibex_list_addtail(&ibex_list, (struct _listnode *)ib); - IBEX_UNLOCK(ib); - /* check env variable override for open threshold */ if (!ibex_open_init) { char *limit; @@ -92,18 +93,20 @@ static void ibex_use(ibex *ib) wb = (ibex *)ibex_list.head; wn = wb->next; while (wn) { - IBEX_LOCK(wb); - if (wb->usecount == 0 && wb->blocks != NULL) { - o(printf("Forcing close of obex '%s', total = %d\n", wb->name, ibex_opened-1)); - close_backend(wb); + if (wb != ib) { + IBEX_LOCK(wb); + if (wb->usecount == 0 && wb->blocks != NULL) { + o(printf("Forcing close of obex '%s', total = %d\n", wb->name, ibex_opened-1)); + close_backend(wb); + IBEX_UNLOCK(wb); + /* optimise the next scan? */ + /*ibex_list_remove((struct _listnode *)wb); + ibex_list_addtail(&ibex_list, (struct _listnode *)wb);*/ + ibex_opened--; + break; + } IBEX_UNLOCK(wb); - /* optimise the next scan? */ - /*ibex_list_remove((struct _listnode *)wb); - ibex_list_addtail(&ibex_list, (struct _listnode *)wb);*/ - ibex_opened--; - break; } - IBEX_UNLOCK(wb); wb = wn; wn = wn->next; } @@ -114,12 +117,9 @@ static void ibex_use(ibex *ib) static void ibex_unuse(ibex *ib) { - IBEX_LOCK(ib); ib->usecount--; - IBEX_UNLOCK(ib); } - static signed char utf8_trans[] = { 'A', 'A', 'A', 'A', 'A', 'A', -1, 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', -2, 'N', 'O', 'O', 'O', 'O', 'O', '*', 'O', 'U', 'U', 'U', @@ -300,9 +300,10 @@ done: g_free(word); word = NULL; - ibex_use(ib); IBEX_LOCK(ib); + ibex_use(ib); + if (ibex_block_cache_setjmp(ib->blocks) != 0) { printf("Error in indexing\n"); ret = -1; @@ -319,9 +320,10 @@ done: ret = 0; } - IBEX_UNLOCK(ib); ibex_unuse(ib); + IBEX_UNLOCK(ib); + error: for (i=0;i<wordlist->len;i++) g_free(wordlist->pdata[i]); @@ -388,9 +390,10 @@ int ibex_save (ibex *ib) d(printf("syncing database\n")); - ibex_use(ib); IBEX_LOCK(ib); + ibex_use(ib); + if (ibex_block_cache_setjmp(ib->blocks) != 0) { ibex_reset(ib); printf("Error saving\n"); @@ -406,9 +409,10 @@ int ibex_save (ibex *ib) ret = 0; } - IBEX_UNLOCK(ib); ibex_unuse(ib); + IBEX_UNLOCK(ib); + return ret; } @@ -496,13 +500,16 @@ int ibex_close (ibex *ib) int ibex_move(ibex *ib, const char *newname) { int ret = 0, error = 0; + struct stat st; IBEX_LOCK(ib); if (ib->blocks) close_backend(ib); - if (rename(ib->name, newname) == -1) { + if (stat(ib->name, &st) == -1 && errno == ENOENT) { + error = 0; + } else if (rename(ib->name, newname) == -1) { g_warning("could not rename ibex file '%s' to '%s': '%s'", ib->name, newname, strerror(errno)); ret = -1; error = errno; @@ -531,9 +538,10 @@ void ibex_unindex (ibex *ib, char *name) { d(printf("trying to unindex '%s'\n", name)); - ibex_use(ib); IBEX_LOCK(ib); + ibex_use(ib); + if (ibex_block_cache_setjmp(ib->blocks) != 0) { printf("Error unindexing!\n"); ibex_reset(ib); @@ -541,8 +549,9 @@ void ibex_unindex (ibex *ib, char *name) ib->words->klass->unindex_name(ib->words, name); } - IBEX_UNLOCK(ib); ibex_unuse(ib); + + IBEX_UNLOCK(ib); } /** @@ -564,8 +573,8 @@ GPtrArray *ibex_find (ibex *ib, char *word) normal = alloca(len+1); ibex_normalise_word(word, word+len, normal); - ibex_use(ib); IBEX_LOCK(ib); + ibex_use(ib); if (ibex_block_cache_setjmp(ib->blocks) != 0) { ibex_reset(ib); @@ -574,8 +583,8 @@ GPtrArray *ibex_find (ibex *ib, char *word) ret = ib->words->klass->find(ib->words, normal); } - IBEX_UNLOCK(ib); ibex_unuse(ib); + IBEX_UNLOCK(ib); return ret; } @@ -600,8 +609,8 @@ gboolean ibex_find_name (ibex *ib, char *name, char *word) normal = alloca(len+1); ibex_normalise_word(word, word+len, normal); - ibex_use(ib); IBEX_LOCK(ib); + ibex_use(ib); if (ibex_block_cache_setjmp(ib->blocks) != 0) { ibex_reset(ib); @@ -610,8 +619,8 @@ gboolean ibex_find_name (ibex *ib, char *name, char *word) ret = ib->words->klass->find_name(ib->words, name, normal); } - IBEX_UNLOCK(ib); ibex_unuse(ib); + IBEX_UNLOCK(ib); return ret; } @@ -629,8 +638,8 @@ gboolean ibex_contains_name(ibex *ib, char *name) { gboolean ret; - ibex_use(ib); IBEX_LOCK(ib); + ibex_use(ib); if (ibex_block_cache_setjmp(ib->blocks) != 0) { ibex_reset(ib); @@ -639,8 +648,8 @@ gboolean ibex_contains_name(ibex *ib, char *name) ret = ib->words->klass->contains_name(ib->words, name); } - IBEX_UNLOCK(ib); ibex_unuse(ib); + IBEX_UNLOCK(ib); return ret; } |