fis-gtm/sr_unix_gnp/cmj_housekeeping.c

76 lines
1.9 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "cmidef.h"
#include "relqop.h"
GBLDEF struct NTD *ntd_root;
void cmj_housekeeping(void)
{
struct CLB *lnk;
que_ent_ptr_t qp;
sigset_t oset;
/* handle I/O interrupts */
if (ntd_root->sigurg_interrupt)
{
cmj_select(SIGURG);
ntd_root->sigurg_interrupt = FALSE;
}
if (ntd_root->sigio_interrupt)
{
cmj_select(SIGIO);
ntd_root->sigio_interrupt = FALSE;
}
/* prune CLB free list if necessary */
while (ntd_root->free_count > ntd_root->pool_size)
{
qp = remqh(&ntd_root->cqh_free);
if (qp)
{
lnk = QUEENT2CLB(qp, cqe);
assert(lnk);
if (ntd_root->mbl && lnk->mbf)
free(lnk->mbf);
free(lnk);
ntd_root->free_count--;
}
}
/* coerce mbf back to mbl sized buffers */
if (ntd_root->freelist_dirty)
{
ntd_root->freelist_dirty = FALSE;
for (qp = RELQUE2PTR(ntd_root->cqh_free.fl) ; ntd_root->mbl && qp != &ntd_root->cqh_free ;
qp = RELQUE2PTR(lnk->cqe.fl))
{
lnk = QUEENT2CLB(qp, cqe);
if (lnk->mbl != ntd_root->mbl)
(void)cmi_realloc_mbf(lnk, ntd_root->mbl);
}
}
/* add to the free list up to poll size if necessary */
while (ntd_root->free_count < ntd_root->pool_size)
{
lnk = (struct CLB *)malloc(SIZEOF(*lnk) + ntd_root->usr_size);
assert(lnk);
cmj_init_clb(ntd_root, lnk);
if (ntd_root->mbl)
{
lnk->mbf = (unsigned char *)malloc(ntd_root->mbl);
if (lnk->mbf)
lnk->mbl = ntd_root->mbl;
}
insqt(&lnk->cqe, &ntd_root->cqh_free);
ntd_root->free_count++;
}
}