예제 #1
0
파일: evtimer.c 프로젝트: houweifeng/sbase
/* intialize evtimer */
EVTIMER *evtimer_init()
{
    EVTIMER *evtimer = NULL;

    if((evtimer = (EVTIMER *)xmm_new(sizeof(EVTIMER))))
    {
        MUTEX_INIT(evtimer->mutex);
    }
    return evtimer;
}
예제 #2
0
파일: evtimer.c 프로젝트: houweifeng/sbase
/* add event timer */
int evtimer_add(EVTIMER *evtimer, off_t timeout, EVTCALLBACK *handler, void *arg)
{
    int evid = -1, x = 0, i = 0;
    struct timeval tv = {0};
    EVTNODE *node = NULL;

    if(evtimer && handler && timeout > 0)
    {
        MUTEX_LOCK(evtimer->mutex);
        if((node = evtimer->left))
        {
            evtimer->left = node->next; 
        }
        else
        {
            if((x = evtimer->nevlist) < EVTNODE_LINE_MAX 
                    && (node = (EVTNODE *)xmm_new(sizeof(EVTNODE) * EVTNODE_LINE_NUM)))
            {
                evtimer->evlist[x] = node;
                evtimer->nevlist++;
                //fprintf(stdout, "%s::%d lines:%d\n", __FILE__, __LINE__, evtimer->nevlist);
                x *= EVTNODE_LINE_NUM;
                node[0].id = x;
                i = 1;
                while(i < EVTNODE_LINE_NUM)
                {
                    node[i].id = i + x;
                    node[i].next = evtimer->left;
                    evtimer->left = &(node[i]);
                    ++i;
                }
            }
        }
        if(node)
        {
            evid = node->id;
            node->handler = handler;
            node->arg = arg;
            node->ison = 1;
            gettimeofday(&tv, NULL);
            node->evusec = (off_t)(tv.tv_sec * 1000000ll + tv.tv_usec * 1ll) + timeout;
            evtimer_push(evtimer, node);
        }
        MUTEX_UNLOCK(evtimer->mutex);
    }
    return evid;
}
예제 #3
0
파일: index.c 프로젝트: zoujiaqing/ithunder
/* add index */
int ibase_index(IBASE *ibase, int docid, IBDATA *block)
{
    char *term = NULL, buf[IB_BUF_SIZE], *data = NULL, *p = NULL, 
         *pp = NULL, *nexts = NULL;
    int i = 0, termid = 0, n = 0, k = 0, ndocid = 0, ret = -1, ndata = 0, secid = 0, 
        *intlist = NULL, *np = NULL, last_docid = 0;
    DOCHEADER *docheader = NULL;
    int64_t *longlist = NULL;
    double *doublelist = NULL;
    IHEADER *iheader = NULL;
    STERM *termlist = NULL;
    MDB *index = NULL, *posting = NULL;
    off_t size = 0;

    if((docheader = (DOCHEADER *)block->data) 
            && (secid = docheader->secid) >= 0 && docheader->secid < IB_SEC_MAX)
    {
        index = (MDB *)(ibase->mindex[docheader->secid]);
        posting = (MDB *)(ibase->mposting[docheader->secid]);
        if(docheader->dbid != -1)
        {
            ibase->state->dtotal++;
            ibase->state->ttotal += (int64_t)docheader->terms_total;
        }
        if(ibase->state->used_for == IB_USED_FOR_INDEXD)
        {
            /* add to source */
            if(((off_t)docid * (off_t)sizeof(IHEADER)) >= ibase->state->headers[secid].end)
            {
                ibase->state->headers[secid].old = ibase->state->headers[secid].end;
                size = (off_t)((docid / IB_HEADERS_BASE) + 1) 
                    * (off_t)IB_HEADERS_BASE * (off_t)sizeof(IHEADER);
                ret = ftruncate(ibase->state->headers[secid].fd, size);
                ibase->state->headers[secid].end = size;
                memset(ibase->state->headers[secid].map + ibase->state->headers[secid].old, 0, 
                        ibase->state->headers[secid].end -  ibase->state->headers[secid].old);
            }
        }
        /* index */
        //end = block->data + block->ndata;
        termlist = (STERM *)(block->data + sizeof(DOCHEADER) 
                + docheader->nfields * sizeof(XFIELD));
        term = block->data + docheader->textblock_off;
        nexts = block->data + docheader->nexts_off;
        for(i = 0; i < docheader->nterms; i++)
        {
            termid = termlist[i].termid;
            //find/add termid
            if(termid > 0 && termlist[i].term_len > 0 && termlist[i].nexts_size >= 0 
                && (ret=mmtrie_add((MMTRIE *)ibase->mmtrie,term,termlist[i].term_len,termid))>0)
            {
                if(ibase->state->index_status != IB_INDEX_DISABLED)
                {
                    last_docid = 0;
                    ndocid = -1;
                    if(mdb_get_tag(index, termid, &last_docid) == 0)
                    {
                        ndocid = docid - last_docid;
                        if(ndocid <= 0) goto term_state_update;
                    }
                    else
                    {
                        ndocid = docid;
                    }
                    p = pp = buf;
                    if((ndata = ((sizeof(int) * 5))) > IB_BUF_SIZE)
                        p = pp = data = (char *)xmm_new(ndata);
                    /* compress index */
                    if(ibase->state->compression_status != IB_COMPRESSION_DISABLED)
                    {
                        n = ndocid; np = &n; ZVBCODE(np, p);
                        n = termlist[i].term_count; np = &n;  ZVBCODE(np, p);
                        n = i; np = &n; ZVBCODE(np, p);
                        n = termlist[i].bit_fields; np = &n; ZVBCODE(np, p);
                        n = termlist[i].nexts_size; np = &n; ZVBCODE(np, p);
                    }
                    else
                    {
                        memcpy(p, &docid, sizeof(int));p += sizeof(int);
                        memcpy(p, &(termlist[i].term_count), sizeof(int));p += sizeof(int);
                        memcpy(p, &i, sizeof(int));p += sizeof(int);
                        memcpy(p, &(termlist[i].bit_fields), sizeof(int));p += sizeof(int);
                        memcpy(p, &(termlist[i].nexts_size), sizeof(int));p += sizeof(int);
                    }
                    if(termlist[i].nexts_size > 0)
                    {
                        if(mdb_add_data(posting, termid, nexts, termlist[i].nexts_size) <= 0) 
                        {
                            FATAL_LOGGER(ibase->logger, "index posting term[%d] failed, %s", 
                                    termid, strerror(errno));
                            _exit(-1);
                        }
                        //WARN_LOGGER(ibase->logger, "docid:%lld termid:%d nexts_size:%d", IBLL(docheader->globalid), termid, termlist[i].nexts_size);
                    }
                    if(mdb_add_data(index, termid, pp, (p - pp)) <= 0)
                    {
                        FATAL_LOGGER(ibase->logger, "index term[%d] failed, %s", 
                                termid, strerror(errno));
                        if(data){free(data); data = NULL;}
                        _exit(-1);
                    }
                    mdb_set_tag(index, termid, docid);
                    if(data){xmm_free(data, ndata); data = NULL;}
                }
term_state_update:
                MUTEX_LOCK(ibase->mutex_termstate);
                if(termid > ibase->state->termid){ADD_TERMSTATE(ibase, termid);}
                if(ndocid > 0 )
                {
                    ((TERMSTATE *)(ibase->termstateio.map))[termid].len=termlist[i].term_len;
                    ((TERMSTATE *)(ibase->termstateio.map))[termid].total++;
                }
                MUTEX_UNLOCK(ibase->mutex_termstate);
            }
            else 
            {
                FATAL_LOGGER(ibase->logger, "Invalid ret:%d term[%d]{%.*s} termid:%d in doc:%d", ret, i, termlist[i].term_len, term, termid, docid);
                _exit(-1);
            }
            term += termlist[i].term_len;
            nexts += termlist[i].nexts_size;
        }
        if(ibase->state->used_for == IB_USED_FOR_INDEXD)
        {
            /* index int */
            if((n = ibase->state->int_index_fields_num) > 0 
                    && (intlist = (int *)(block->data + docheader->intblock_off)))
            {
                n += IB_INT_OFF;
                k = 0;
                for(i = IB_INT_OFF; i < n; i++)
                {
                    IMAP_SET(ibase->state->mfields[secid][i], docid, intlist[k]);
                    k++;
                }
            }
            /* index long */
            if((n = ibase->state->long_index_fields_num) > 0 
                    && (longlist = (int64_t *)(block->data + docheader->longblock_off)))
            {
                n += IB_LONG_OFF;
                k = 0;
                for(i = IB_LONG_OFF; i < n; i++)
                {
                    LMAP_SET(ibase->state->mfields[secid][i], docid, longlist[k]);
                    k++;
                }
            }
            /* index double */
            if((n = ibase->state->double_index_fields_num) > 0 
                    && (doublelist = (double *)(block->data + docheader->doubleblock_off)))
            {
                n += IB_DOUBLE_OFF;
                k = 0;
                for(i = IB_DOUBLE_OFF; i < n; i++)
                {
                    DMAP_SET(ibase->state->mfields[secid][i], docid, doublelist[k]);
                    k++;
                }
            }
            if((iheader = PIHEADER(ibase, docheader->secid, docid)))
            {
                iheader->status      = docheader->status;
                iheader->terms_total = docheader->terms_total;
                iheader->crc         = docheader->crc;
                iheader->category    = docheader->category;
                iheader->slevel      = docheader->slevel;
                iheader->rank        = docheader->rank;
                iheader->globalid    = docheader->globalid;
                //WARN_LOGGER(ibase->logger, "iheader->category:%p docheader->category:%p", (void *)iheader->category, (void *)docheader->category);
            }
        }
        ret = 0;
    }
    return ret;
}
예제 #4
0
파일: chunk.c 프로젝트: houweifeng/sbase
/* initialize chunk */
CHUNK *chunk_init()
{
    CHUNK *chunk = NULL;
    chunk = (CHUNK *)xmm_new(sizeof(CHUNK));
    return chunk;
}