CORBA-omniORB

 view release on metacpan or  search on metacpan

omnithreads/shared/shared.xs  view on Meta::CPAN

	    if (!SvROK(ref_lock))
	        Perl_croak(aTHX_ "cond_timedwait lock needs to be passed as ref");
	    ref_lock = SvRV(ref_lock);
	    if (SvROK(ref_lock)) ref_lock = SvRV(ref_lock);
	    ssv = Perl_sharedsv_find(aTHX_ ref_lock);
	    if (!ssv)
	        croak("cond_timedwait lock must be a shared value");
	    ul = S_get_userlock(aTHX_ ssv, 1);
	}
	if(ul->lock.owner != aTHX)
	    croak("You need a lock before you can cond_wait");

        PUTBACK;
        {
	    UV token = unlock_interpreter(aTHX);

	    MUTEX_LOCK(&ul->lock.mutex);
	    ul->lock.owner = NULL;
	    locks = ul->lock.locks;
	    ul->lock.locks = 0;
	    /* since we are releasing the lock here we need to tell other
	       people that is ok to go ahead and use it */
	    COND_SIGNAL(&ul->lock.cond);
	    RETVAL = Perl_sharedsv_cond_timedwait(user_condition,
						  &ul->lock.mutex, abs);
	    while (ul->lock.owner != NULL) {
		/* OK -- must reacquire the lock... */
		COND_WAIT(&ul->lock.cond, &ul->lock.mutex);
	    }
	    ul->lock.owner = aTHX;
	    ul->lock.locks = locks;
	    MUTEX_UNLOCK(&ul->lock.mutex);
	    
	    relock_interpreter(aTHX_ token);
	}
        SPAGAIN;

	if (RETVAL == 0)
            XSRETURN_UNDEF;
	OUTPUT:
	RETVAL

void
cond_signal_enabled(SV *ref)
	PROTOTYPE: \[$@%]
	CODE:
	SV *ssv;
	user_lock *ul;

	if(!SvROK(ref))
            Perl_croak(aTHX_ "Argument to cond_signal needs to be passed as ref");
	ref = SvRV(ref);
	if(SvROK(ref))
	    ref = SvRV(ref);
	ssv = Perl_sharedsv_find(aTHX_ ref);
	if(!ssv)
	    croak("cond_signal can only be used on shared values");
	ul = S_get_userlock(aTHX_ ssv, 1);
	if (ckWARN(WARN_THREADS) && ul->lock.owner != aTHX)
	    Perl_warner(aTHX_ packWARN(WARN_THREADS),
			    "cond_signal() called on unlocked variable");
	COND_SIGNAL(&ul->user_cond);

void
cond_broadcast_enabled(SV *ref)
	PROTOTYPE: \[$@%]
	CODE:
	SV *ssv;
	user_lock *ul;

	if(!SvROK(ref))
            Perl_croak(aTHX_ "Argument to cond_broadcast needs to be passed as ref");
	ref = SvRV(ref);
	if(SvROK(ref))
	    ref = SvRV(ref);
	ssv = Perl_sharedsv_find(aTHX_ ref);
	if(!ssv)
	    croak("cond_broadcast can only be used on shared values");
	ul = S_get_userlock(aTHX_ ssv, 1);
	if (ckWARN(WARN_THREADS) && ul->lock.owner != aTHX)
	    Perl_warner(aTHX_ packWARN(WARN_THREADS),
			    "cond_broadcast() called on unlocked variable");
	COND_BROADCAST(&ul->user_cond);


SV*
bless(SV* ref, ...);
	PROTOTYPE: $;$
	CODE:
        {
	  HV* stash;
	  SV *ssv;
	  if (items == 1)
	    stash = CopSTASH(PL_curcop);
	  else {
	    SV* classname = ST(1);
	    STRLEN len;
	    char *ptr;
	    
	    if (classname && !SvGMAGICAL(classname) &&
			!SvAMAGIC(classname) && SvROK(classname))
	      Perl_croak(aTHX_ "Attempt to bless into a reference");
	    ptr = SvPV(classname,len);
	    if (ckWARN(WARN_MISC) && len == 0)
	      Perl_warner(aTHX_ packWARN(WARN_MISC),
			  "Explicit blessing to '' (assuming package main)");
	    stash = gv_stashpvn(ptr, len, TRUE);
	  }
	  SvREFCNT_inc(ref);
	  (void)sv_bless(ref, stash);
	  RETVAL = ref;
	  ssv = Perl_sharedsv_find(aTHX_ ref);
	  if(ssv) {
	    dTHXc;
	    ENTER_LOCK;
	    SHARED_CONTEXT;
	    {
	      SV* fake_stash = newSVpv(HvNAME_get(stash),0);
	      (void)sv_bless(ssv,(HV*)fake_stash);
	    }
	    CALLER_CONTEXT;
	    LEAVE_LOCK;
	  }
	}
    	OUTPUT:
	RETVAL		

BOOT:
{
    int count;

    Perl_sharedsv_init(aTHX);

    ENTER;
    SAVETMPS;
    
    PUSHMARK(SP);
    count = call_pv("CORBA::omniORB::_entry_lock_hooks", G_ARRAY | G_EVAL);
    SPAGAIN;
    if (count == 2) {
	relock_interpreter = DPTR2FPTR(void (*)(pTHX, UV token), POPu);
	unlock_interpreter = DPTR2FPTR(UV (*)(pTHX), POPu);



( run in 1.113 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )