SV_to_ithread(pTHX_ SV *sv)
{
ithread *thread;
+#ifdef OEMVS
+ void *ptr;
+#endif
if (SvROK(sv))
{
thread = INT2PTR(ithread*, SvIV(SvRV(sv)));
}
else
{
+#ifdef OEMVS
+ PERL_THREAD_GETSPECIFIC(self_key,ptr);
+ thread = (ithread *) ptr;
+#else
PERL_THREAD_GETSPECIFIC(self_key,thread);
+#endif
}
return thread;
}
PerlIO_flush((PerlIO*)NULL);
PERL_THREAD_SETSPECIFIC(self_key,thread);
-
+ SAVEBOOL(PL_srand_called); /* Save this so it becomes the correct
+ value */
+ PL_srand_called = FALSE; /* Set it to false so we can detect
+ if it gets set during the clone */
#ifdef WIN32
thread->interp = perl_clone(aTHX, CLONEf_KEEP_PTR_TABLE | CLONEf_CLONE_HOST);
*/
{
dTHXa(thread->interp);
+
/* Here we remove END blocks since they should only run
in the thread they are created
*/
#ifdef OLD_PTHREADS_API
pthread_create( &thread->thr, attr, Perl_ithread_run, (void *)thread);
#else
+ pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
pthread_create( &thread->thr, &attr, Perl_ithread_run, (void *)thread);
#endif
}
Perl_ithread_self (pTHX_ SV *obj, char* Class)
{
ithread *thread;
+#ifdef OEMVS
+ void *ptr;
+ PERL_THREAD_GETSPECIFIC(self_key,ptr);
+ thread = (ithread *) ptr;
+#else
PERL_THREAD_GETSPECIFIC(self_key,thread);
+#endif
return ithread_to_SV(aTHX_ obj, thread, Class, TRUE);
}
/* We have finished with it */
thread->state |= PERL_ITHR_JOINED;
MUTEX_UNLOCK(&thread->mutex);
- sv_unmagic(SvRV(obj),PERL_MAGIC_shared_scalar);
+
return retparam;
}
return (AV*)NULL;