Ignore:
Timestamp:
Dec 14, 2020, 2:31:50 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
5dc5da7, 90ecade, ccb8c8a
Parents:
867fca3
Message:

Changed stack creation to toggle between mmap and malloc based on the defines CFA_COROUTINE_USE_MMAP and CFA_PROCESSOR_USE_MMAP

File:
1 edited

Legend:

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

    r867fca3 r97229d6  
    3030#include "startup.hfa"          // STARTUP_PRIORITY_XXX
    3131#include "math.hfa"
     32
     33#define CFA_PROCESSOR_USE_MMAP 0
    3234
    3335//-----------------------------------------------------------------------------
     
    677679
    678680        void * stack;
    679         #warning due to the thunk problem, stack creation uses mmap, revert to malloc once this goes away
    680         // __cfaabi_dbg_debug_do(
    681         //      stack = memalign( __page_size, stacksize + __page_size );
    682         //      // pthread has no mechanism to create the guard page in user supplied stack.
    683         //      if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) {
    684         //              abort( "mprotect : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
    685         //      } // if
    686         // );
    687         // __cfaabi_dbg_no_debug_do(
    688         //      stack = malloc( stacksize );
    689         // );
    690         stacksize = ceiling( stacksize, __page_size ) + __page_size;
    691         stack = mmap(0p, stacksize, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
    692         if(stack == ((void*)-1)) {
    693                 abort( "pthread stack creation : internal error, mmap failure, error(%d) %s.", errno, strerror( errno ) );
    694         }
    695         if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) {
    696                 abort( "pthread stack creation : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
    697         } // if
     681        #if CFA_PROCESSOR_USE_MMAP
     682                stacksize = ceiling( stacksize, __page_size ) + __page_size;
     683                stack = mmap(0p, stacksize, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
     684                if(stack == ((void*)-1)) {
     685                        abort( "pthread stack creation : internal error, mmap failure, error(%d) %s.", errno, strerror( errno ) );
     686                }
     687                if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) {
     688                        abort( "pthread stack creation : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
     689                } // if
     690        #else
     691                __cfaabi_dbg_debug_do(
     692                        stack = memalign( __page_size, stacksize + __page_size );
     693                        // pthread has no mechanism to create the guard page in user supplied stack.
     694                        if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) {
     695                                abort( "mprotect : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
     696                        } // if
     697                );
     698                __cfaabi_dbg_no_debug_do(
     699                        stack = malloc( stacksize );
     700                );
     701        #endif
     702
    698703
    699704        check( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" );
     
    707712        if( err != 0 ) abort("KERNEL ERROR: joining pthread %p caused error %s\n", (void*)pthread, strerror(err));
    708713
    709         pthread_attr_t attr;
    710 
    711         check( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute
    712 
    713         size_t stacksize;
    714         // default stack size, normally defined by shell limit
    715         check( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" );
    716         assert( stacksize >= PTHREAD_STACK_MIN );
    717         stacksize += __page_size;
    718 
    719         if(munmap(stack, stacksize) == -1) {
    720                 abort( "pthread stack destruction : internal error, munmap failure, error(%d) %s.", errno, strerror( errno ) );
    721         }
     714        #if CFA_PROCESSOR_USE_MMAP
     715                pthread_attr_t attr;
     716
     717                check( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute
     718
     719                size_t stacksize;
     720                // default stack size, normally defined by shell limit
     721                check( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" );
     722                assert( stacksize >= PTHREAD_STACK_MIN );
     723                stacksize += __page_size;
     724
     725                if(munmap(stack, stacksize) == -1) {
     726                        abort( "pthread stack destruction : internal error, munmap failure, error(%d) %s.", errno, strerror( errno ) );
     727                }
     728        #else
     729                free( stack );
     730        #endif
    722731}
    723732
Note: See TracChangeset for help on using the changeset viewer.