Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/startup.cfa

    r7d0ebd0 r1757f98  
    279279        // When its coroutine terminates, it return control to the mainThread
    280280        // which is currently here
    281         /* paranoid */ verify( !__atomic_load_n(&mainProcessor->do_terminate, __ATOMIC_ACQUIRE) );
    282281        __atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE);
    283         __wake_proc( mainProcessor );
    284282        __kernel_last_resume( __cfaabi_tls.this_processor );
    285283        mainThread->self_cor.state = Halted;
     
    405403
    406404        __cfaabi_tls.this_thread->curr_cor = dst;
    407         __stack_prepare( &dst->stack, DEFAULT_STACK_SIZE );
     405        __stack_prepare( &dst->stack, 65000 );
    408406        __cfactx_start(main, dst, this->runner, __cfactx_invoke_coroutine);
    409407
     
    566564extern size_t __page_size;
    567565void ^?{}(processor & this) with( this ){
    568         /* paranoid */ verify( !__atomic_load_n(&do_terminate, __ATOMIC_ACQUIRE) );
    569         __cfadbg_print_safe(runtime_core, "Kernel : core %p signaling termination\n", &this);
    570 
    571         __atomic_store_n(&do_terminate, true, __ATOMIC_RELAXED);
    572         __disable_interrupts_checked();
     566        if( ! __atomic_load_n(&do_terminate, __ATOMIC_ACQUIRE) ) {
     567                __cfadbg_print_safe(runtime_core, "Kernel : core %p signaling termination\n", &this);
     568
     569                __atomic_store_n(&do_terminate, true, __ATOMIC_RELAXED);
    573570                __wake_proc( &this );
    574         __enable_interrupts_checked();
    575 
    576         wait( terminated );
    577         /* paranoid */ verify( active_processor() != &this);
     571
     572                wait( terminated );
     573                /* paranoid */ verify( active_processor() != &this);
     574        }
    578575
    579576        __destroy_pthread( kernel_thread, this.stack, 0p );
     
    724721        check( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute
    725722
    726         size_t stacksize = DEFAULT_STACK_SIZE;
     723        size_t stacksize;
     724        // default stack size, normally defined by shell limit
     725        check( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" );
     726        assert( stacksize >= PTHREAD_STACK_MIN );
    727727
    728728        void * stack;
     
    749749        #endif
    750750
     751
    751752        check( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" );
     753
    752754        check( pthread_create( pthread, &attr, start, arg ), "pthread_create" );
    753755        return stack;
Note: See TracChangeset for help on using the changeset viewer.