BDB
view release on metacpan or search on metacpan
typedef struct bdb_cb
{
struct bdb_cb *volatile next;
SV *callback;
int type, pri, result;
DB_ENV *env;
DB *db;
DB_TXN *txn;
DBC *dbc;
UV uv1;
int int1, int2;
U32 uint1, uint2;
char *buf1, *buf2, *buf3;
SV *sv1, *sv2, *sv3;
DBT dbt1, dbt2, dbt3;
DB_KEY_RANGE key_range;
#if DBVER >= 403
DB_SEQUENCE *seq;
db_seq_t seq_t;
#endif
SV *rsv1, *rsv2; // keep some request objects alive
} bdb_cb;
typedef bdb_cb *bdb_req;
enum {
PRI_MIN = -4,
PRI_MAX = 4,
DEFAULT_PRI = 0,
PRI_BIAS = -PRI_MIN,
NUM_PRI = PRI_MAX + PRI_BIAS + 1,
};
#define AIO_TICKS ((1000000 + 1023) >> 10)
static SV *on_next_submit;
static unsigned int max_poll_time = 0;
static unsigned int max_poll_reqs = 0;
/* calculcate time difference in ~1/AIO_TICKS of a second */
static int tvdiff (struct timeval *tv1, struct timeval *tv2)
{
return (tv2->tv_sec - tv1->tv_sec ) * AIO_TICKS
+ ((tv2->tv_usec - tv1->tv_usec) >> 10);
}
static int next_pri = DEFAULT_PRI + PRI_BIAS;
static unsigned int started, idle, wanted;
/* worker threads management */
static xmutex_t wrklock = X_MUTEX_INIT;
typedef struct worker {
/* locked by wrklock */
struct worker *prev, *next;
xthread_t tid;
/* locked by reslock, reqlock or wrklock */
bdb_req req; /* currently processed request */
void *dbuf;
DIR *dirp;
} worker;
static worker wrk_first = { &wrk_first, &wrk_first, 0 };
static void worker_clear (worker *wrk)
{
}
static void worker_free (worker *wrk)
{
wrk->next->prev = wrk->prev;
wrk->prev->next = wrk->next;
free (wrk);
}
static volatile unsigned int nreqs, nready, npending;
static volatile unsigned int max_idle = 4;
static volatile unsigned int max_outstanding = 0xffffffff;
static s_epipe respipe;
static xmutex_t reslock = X_MUTEX_INIT;
static xmutex_t reqlock = X_MUTEX_INIT;
static xcond_t reqwait = X_COND_INIT;
#if WORDACCESS_UNSAFE
static unsigned int get_nready (void)
{
unsigned int retval;
X_LOCK (reqlock);
retval = nready;
X_UNLOCK (reqlock);
return retval;
}
static unsigned int get_npending (void)
{
unsigned int retval;
X_LOCK (reslock);
retval = npending;
X_UNLOCK (reslock);
return retval;
}
static unsigned int get_nthreads (void)
{
unsigned int retval;
X_LOCK (wrklock);
retval = started;
X_UNLOCK (wrklock);
( run in 0.888 second using v1.01-cache-2.11-cpan-5a3173703d6 )