BDB

 view release on metacpan or  search on metacpan

BDB.xs  view on Meta::CPAN

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 )