X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=rset%2Frsbool.c;h=b07a50e756f39907c164ceb332aa95830391f67f;hb=fcd23b68a84ac461cbea22271f91b7989a767201;hp=59eec018bf8884fae38739ccce45045577c76524;hpb=eb1d9cf5bea42ce04747d852d21dde853574fa3f;p=idzebra-moved-to-github.git diff --git a/rset/rsbool.c b/rset/rsbool.c index 59eec01..b07a50e 100644 --- a/rset/rsbool.c +++ b/rset/rsbool.c @@ -1,4 +1,4 @@ -/* $Id: rsbool.c,v 1.41 2004-08-24 15:00:16 heikki Exp $ +/* $Id: rsbool.c,v 1.44 2004-08-26 11:11:59 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -96,7 +96,8 @@ struct rset_bool_info { RSET rset_r; int (*cmp)(const void *p1, const void *p2); void (*log_item)(int logmask, const void *p, const char *txt); - struct rset_bool_rfd *rfd_list; + struct rset_bool_rfd *rfd_list; /* RSFDs in use */ + struct rset_bool_rfd *free_list; /* RSFDs that are freed (for reuse) */ }; struct rset_bool_rfd { @@ -127,6 +128,7 @@ static RSET rsbool_create_base( const struct rset_control *ctrl, info->cmp = cmp; info->log_item = log_item; info->rfd_list = NULL; + info->free_list = NULL; rnew->priv=info; return rnew; @@ -197,15 +199,21 @@ static RSFD r_open (RSET ct, int flag) logf (LOG_FATAL, "bool set type is read-only"); return NULL; } - rfd = (struct rset_bool_rfd *) nmem_malloc(ct->nmem, sizeof(*rfd)); + rfd = info->free_list; + if (rfd) + info->free_list = rfd->next; + else { + rfd = (struct rset_bool_rfd *) nmem_malloc(ct->nmem, sizeof(*rfd)); + rfd->buf_l = nmem_malloc(ct->nmem, info->key_size); + rfd->buf_r = nmem_malloc(ct->nmem, info->key_size); + } + logf(LOG_DEBUG,"rsbool (%s) open [%p]", ct->control->desc, rfd); rfd->next = info->rfd_list; info->rfd_list = rfd; rfd->info = info; rfd->hits=0; - rfd->buf_l = nmem_malloc(ct->nmem, info->key_size); - rfd->buf_r = nmem_malloc(ct->nmem, info->key_size); rfd->rfd_l = rset_open (info->rset_l, RSETF_READ); rfd->rfd_r = rset_open (info->rset_r, RSETF_READ); rfd->more_l = rset_read (info->rset_l, rfd->rfd_l, rfd->buf_l); @@ -222,9 +230,15 @@ static void r_close (RSFD rfd) for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next) if (*rfdp == rfd) { + struct rset_bool_rfd *rfd_tmp = *rfdp; + rset_close (info->rset_l, (*rfdp)->rfd_l); rset_close (info->rset_r, (*rfdp)->rfd_r); *rfdp = (*rfdp)->next; + + rfd_tmp->next = info->free_list; + info->free_list = rfd_tmp; + return; } logf (LOG_FATAL, "r_close but no rfd match!");