BDB

 view release on metacpan or  search on metacpan

BDB.xs  view on Meta::CPAN

  dbt->data = malloc (len);
  memcpy (dbt->data, data, len);
  dbt->size = len;
  dbt->flags = DB_DBT_REALLOC;
}
	
static void
dbt_to_sv (SV *sv, DBT *dbt)
{
  if (sv)
    {
      SvREADONLY_off (sv);

      if (dbt->data)
        sv_setpvn_mg (sv, dbt->data, dbt->size);
      else
        sv_setsv_mg (sv, &PL_sv_undef);

      SvREFCNT_dec (sv);
    }

  free (dbt->data);
}
	
enum {
  REQ_QUIT,
  REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT,
  REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, REQ_ENV_DBREMOVE, REQ_ENV_DBRENAME,
  REQ_ENV_LOG_ARCHIVE, REQ_ENV_LSN_RESET, REQ_ENV_FILEID_RESET,
  REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_VERIFY, REQ_DB_UPGRADE,
  REQ_DB_PUT, REQ_DB_EXISTS, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE,
  REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH,
  REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL,
  REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE,
};

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);
}



( run in 2.240 seconds using v1.01-cache-2.11-cpan-df04353d9ac )