BerkeleyDB-Locks

 view release on metacpan or  search on metacpan

Locks.xs  view on Meta::CPAN

	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(&lt->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( 
							&lt->reginfo, wlp ) 
							) ) ;
					av_push( av, newSViv( wlp->gen ) ) ;

					// holder
					av_push( av, newSViv( R_OFFSET( 
							&lt->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 )