BerkeleyDB-Locks
view release on metacpan or search on metacpan
CODE:
u_int32_t i ;
BerkeleyDB__Env dbenv = NULL ;
DB_LOCKTAB* lt = NULL ;
DB_LOCKREGION* lrp ;
DB_LOCKER* lip ;
DB_LOCKOBJ* lobj ;
AV *av ;
// struct __db_lock* lp, * wlp, * hlp ;
struct __db_lock* lp, * wlp ;
RETVAL = newAV() ;
if ( SvIOK( envAddr ) ) {
dbenv = (BerkeleyDB__Env) SvIV( envAddr ) ;
lt = dbenv->Env->lk_handle;
}
else {
croak( "Invalid BerkeleyDB::Env object" ) ;
}
/* Identify waiting locks and associated objects.
* Two values identify a lock:
offset
gen
*/
if ( lt != NULL ) {
lrp = lt->reginfo.primary;
LOCKREGION(dbenv->Env, lt);
for (i = 0; i < lrp->locker_t_size; i++) {
lip = SH_TAILQ_FIRST(<->locker_tab[i], __db_locker) ;
if ( lip && lip->nlocks )
for ( lp = SH_LIST_FIRST( &lip->heldby, __db_lock ) ;
lp != NULL ;
lp = SH_LIST_NEXT( lp,
locker_links, __db_lock ) ) {
if ( lp->status != DB_LSTAT_HELD )
continue ;
lobj = (struct __db_lockobj*) ( (u_int8_t *)
( (u_int8_t *) lp ) +lp->obj
) ;
for ( wlp = SH_TAILQ_FIRST(
&lobj->waiters, __db_lock ) ;
wlp ;
wlp = SH_TAILQ_NEXT(
wlp, links, __db_lock )
) {
/* Each waiter on a locked object represents a separate
* lock condition:
*/
av = newAV() ;
// waiter
av_push( av, newSViv( R_OFFSET(
<->reginfo, wlp )
) ) ;
av_push( av, newSViv( wlp->gen ) ) ;
// holder
av_push( av, newSViv( R_OFFSET(
<->reginfo, lp )
) ) ;
av_push( av, newSViv( lp->gen ) ) ;
av_push( RETVAL, newRV_inc( (SV *) av )
) ;
}
}
}
UNLOCKREGION(dbenv->Env, lt);
}
OUTPUT:
RETVAL
HV* _properties( SV *envAddr, SV *lockOff )
CODE:
size_t off ;
BerkeleyDB__Env dbenv = NULL ;
DB_LOCK lock, * lockp ;
struct __db_lock* lp ;
RETVAL = newHV() ;
if ( SvIOK( envAddr ) ) {
dbenv = (BerkeleyDB__Env) SvIV( envAddr ) ;
off = SvIV( lockOff ) ;
}
else {
croak( "Invalid BerkeleyDB::Env object" ) ;
}
if ( db_lock_u( dbenv->Env, off, &lock ) != NULL
&& ( lp = db_lock( dbenv->Env, off ) ) != NULL ) {
hv_store( RETVAL, "holder", strlen("holder"),
newSViv( lp->holder ), 0 ) ;
hv_store( RETVAL, "gen", strlen("gen"),
newSViv( lp->gen ), 0 ) ;
hv_store( RETVAL, "mode", strlen("mode"),
newSViv( lp->mode ), 0 ) ;
hv_store( RETVAL, "obj", strlen("obj"),
newSViv( lock.ndx ), 0 ) ;
hv_store( RETVAL, "status", strlen("status"),
newSViv( lp->status ), 0 ) ;
}
( run in 3.226 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )