More Config::threads to threads::threads changes
[p5sagit/p5-mst-13.2.git] / ext / threads / threads.xs
index c0f3d45..a4e22ec 100755 (executable)
@@ -23,7 +23,6 @@ void* Perl_thread_run(void * arg) {
 
        SHAREDSvLOCK(threads);
        SHAREDSvEDIT(threads);
-       PERL_THREAD_ALLOC_SPECIFIC(self_key);
        PERL_THREAD_SETSPECIFIC(self_key,INT2PTR(void*,thread->tid));
        thread_tid_ptr = Perl_newSVuv(PL_sharedsv_space, thread->tid);  
        thread_ptr = Perl_newSVuv(PL_sharedsv_space, PTR2UV(thread));
@@ -91,7 +90,7 @@ SV* Perl_thread_create(char* class, SV* init_function, SV* params) {
        obj = newSVrv(obj_ref, class);
        sv_setiv(obj, (IV)thread);
        SvREADONLY_on(obj);
-
+       PerlIO_flush((PerlIO*)NULL);
        current_perl = PERL_GET_CONTEXT;        
 
        /*
@@ -102,13 +101,13 @@ SV* Perl_thread_create(char* class, SV* init_function, SV* params) {
 
        temp_store = Perl_get_sv(current_perl, "threads::paramtempstore",
                                 TRUE | GV_ADDMULTI);
-       Perl_sv_setsv(current_perl, temp_store,params);
+       Perl_sv_setsv_flags(current_perl, temp_store,params, SV_GMAGIC);
        params = NULL;
        temp_store = NULL;
 
        temp_store = Perl_get_sv(current_perl, "threads::calltempstore",
                                 TRUE | GV_ADDMULTI);
-       Perl_sv_setsv(current_perl,temp_store, init_function);
+       Perl_sv_setsv_flags(current_perl,temp_store, init_function, SV_GMAGIC);
        init_function = NULL;
        temp_store = NULL;
 
@@ -129,18 +128,18 @@ SV* Perl_thread_create(char* class, SV* init_function, SV* params) {
         * inteprreter */
 
        temp_store = Perl_get_sv(thread->interp, "threads::paramtempstore",FALSE);
-       Perl_sv_setsv(thread->interp,temp_store, &PL_sv_undef);
+       Perl_sv_setsv_flags(thread->interp,temp_store, &PL_sv_undef, SV_GMAGIC);
 
        temp_store = Perl_get_sv(thread->interp,"threads::calltempstore",FALSE);
-       Perl_sv_setsv(thread->interp,temp_store, &PL_sv_undef);
+       Perl_sv_setsv_flags(thread->interp,temp_store, &PL_sv_undef, SV_GMAGIC);
 
        PERL_SET_CONTEXT(current_perl);
 
        temp_store = Perl_get_sv(current_perl,"threads::paramtempstore",FALSE);
-       Perl_sv_setsv(current_perl, temp_store, &PL_sv_undef);
+       Perl_sv_setsv_flags(current_perl, temp_store, &PL_sv_undef, SV_GMAGIC);
 
        temp_store = Perl_get_sv(current_perl,"threads::calltempstore",FALSE);
-       Perl_sv_setsv(current_perl, temp_store, &PL_sv_undef);
+       Perl_sv_setsv_flags(current_perl, temp_store, &PL_sv_undef, SV_GMAGIC);
 
        /* let's init the thread */
 
@@ -168,6 +167,11 @@ SV* Perl_thread_create(char* class, SV* init_function, SV* params) {
 #  ifdef PTHREAD_ATTR_SETDETACHSTATE
             PTHREAD_ATTR_SETDETACHSTATE(&attr, attr_joinable);
 #  endif
+#  ifdef THREAD_CREATE_NEEDS_STACK
+           if(pthread_attr_setstacksize(&attr, THREAD_CREATE_NEEDS_STACK))
+             croak("panic: pthread_attr_setstacksize failed");
+#  endif
+
 #ifdef OLD_PTHREADS_API
          pthread_create( &thread->thr, attr, Perl_thread_run, (void *)thread);
 #else
@@ -274,6 +278,7 @@ void Perl_thread_destruct (ithread* thread) {
 MODULE = threads               PACKAGE = threads               
 BOOT:
        Perl_sharedsv_init(aTHX);
+       PERL_THREAD_ALLOC_SPECIFIC(self_key);
        PL_perl_destruct_level = 2;
        threads = Perl_sharedsv_new(aTHX);
        SHAREDSvEDIT(threads);
@@ -327,6 +332,24 @@ create (class, function_to_call, ...)
                        RETVAL
 
 SV *
+new (class, function_to_call, ...)
+        char *  class
+        SV *    function_to_call
+               CODE:
+                       AV* params = newAV();
+                       if(items > 2) {
+                               int i;
+                               for(i = 2; i < items ; i++) {
+                                       av_push(params, ST(i));
+                               }
+                       }
+                       RETVAL = Perl_thread_create(class, function_to_call, newRV_noinc((SV*) params));
+                       OUTPUT:
+                       RETVAL
+
+
+
+SV *
 self (class)
                char* class
        CODE: