+ /* OK -- must reacquire the lock */
+ COND_WAIT(&shared->lock.cond, &shared->lock.mutex);
+ }
+ shared->lock.owner = aTHX;
+ shared->lock.locks = locks;
+ MUTEX_UNLOCK(&shared->lock.mutex);
+
+int
+cond_timedwait_enabled(SV *ref_cond, double abs, SV *ref_lock = 0)
+ PROTOTYPE: \[$@%]$;\[$@%]
+ PREINIT:
+ shared_sv* shared;
+ perl_cond* user_condition;
+ int locks;
+ int same = 0;
+
+ CODE:
+ if (!ref_lock || ref_cond == ref_lock) same = 1;
+
+ if(!SvROK(ref_cond))
+ Perl_croak(aTHX_ "Argument to cond_timedwait needs to be passed as ref");
+ ref_cond = SvRV(ref_cond);
+ if(SvROK(ref_cond))
+ ref_cond = SvRV(ref_cond);
+ shared = Perl_sharedsv_find(aTHX_ ref_cond);
+ if(!shared)
+ croak("cond_timedwait can only be used on shared values");
+
+ user_condition = &shared->user_cond;
+ if (! same) {
+ 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);
+ shared = Perl_sharedsv_find(aTHX_ ref_lock);
+ if (!shared)
+ croak("cond_timedwait lock must be a shared value");
+ }
+ if(shared->lock.owner != aTHX)
+ croak("You need a lock before you can cond_wait");
+
+ MUTEX_LOCK(&shared->lock.mutex);
+ shared->lock.owner = NULL;
+ locks = shared->lock.locks;
+ shared->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(&shared->lock.cond);
+ RETVAL = Perl_sharedsv_cond_timedwait(user_condition, &shared->lock.mutex, abs);
+ while (shared->lock.owner != NULL) {
+ /* OK -- must reacquire the lock... */
+ COND_WAIT(&shared->lock.cond, &shared->lock.mutex);
+ }