BDB
view release on metacpan or search on metacpan
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 )