Ignore:
Timestamp:
Dec 14, 2020, 2:31:50 PM (5 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/coroutine.cfa

    r867fca3 r97229d6  
    2929#include "exception.hfa"
    3030#include "math.hfa"
     31
     32#define CFA_COROUTINE_USE_MMAP 0
    3133
    3234#define __CFA_INVOKE_PRIVATE__
     
    110112        if ( ! userStack && this.storage ) {
    111113                __stack_clean( &this );
    112                 // __attribute__((may_alias)) intptr_t * istorage = (intptr_t *)&this.storage;
    113                 // *istorage &= (intptr_t)-1;
    114 
    115                 // void * storage = this.storage->limit;
    116                 // __cfaabi_dbg_debug_do(
    117                 //      storage = (char*)(storage) - __page_size;
    118                 //      if ( mprotect( storage, __page_size, PROT_READ | PROT_WRITE ) == -1 ) {
    119                 //              abort( "(coStack_t *)%p.^?{}() : internal error, mprotect failure, error(%d) %s.", &this, errno, strerror( errno ) );
    120                 //      }
    121                 // );
    122                 // __cfaabi_dbg_print_safe("Kernel : Deleting stack %p\n", storage);
    123                 // free( storage );
    124114        }
    125115}
     
    174164        // If we are running debug, we also need to allocate a guardpage to catch stack overflows.
    175165        void * storage;
    176         // __cfaabi_dbg_debug_do(
    177         //      storage = memalign( __page_size, size + __page_size );
    178         // );
    179         // __cfaabi_dbg_no_debug_do(
    180         //      storage = (void*)malloc(size);
    181         // );
    182 
    183         // __cfaabi_dbg_print_safe("Kernel : Created stack %p of size %zu\n", storage, size);
    184         // __cfaabi_dbg_debug_do(
    185         //      if ( mprotect( storage, __page_size, PROT_NONE ) == -1 ) {
    186         //              abort( "__stack_alloc : internal error, mprotect failure, error(%d) %s.", (int)errno, strerror( (int)errno ) );
    187         //      }
    188         //      storage = (void *)(((intptr_t)storage) + __page_size);
    189         // );
    190         storage = mmap(0p, size + __page_size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
    191         if(storage == ((void*)-1)) {
    192                 abort( "coroutine stack creation : internal error, mmap failure, error(%d) %s.", errno, strerror( errno ) );
    193         }
    194         if ( mprotect( storage, __page_size, PROT_NONE ) == -1 ) {
    195                 abort( "coroutine stack creation : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
    196         } // if
    197         storage = (void *)(((intptr_t)storage) + __page_size);
     166        #if CFA_COROUTINE_USE_MMAP
     167                storage = mmap(0p, size + __page_size, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
     168                if(storage == ((void*)-1)) {
     169                        abort( "coroutine stack creation : internal error, mmap failure, error(%d) %s.", errno, strerror( errno ) );
     170                }
     171                if ( mprotect( storage, __page_size, PROT_NONE ) == -1 ) {
     172                        abort( "coroutine stack creation : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
     173                } // if
     174                storage = (void *)(((intptr_t)storage) + __page_size);
     175        #else
     176                __cfaabi_dbg_debug_do(
     177                        storage = memalign( __page_size, size + __page_size );
     178                );
     179                __cfaabi_dbg_no_debug_do(
     180                        storage = (void*)malloc(size);
     181                );
     182
     183                __cfaabi_dbg_debug_do(
     184                        if ( mprotect( storage, __page_size, PROT_NONE ) == -1 ) {
     185                                abort( "__stack_alloc : internal error, mprotect failure, error(%d) %s.", (int)errno, strerror( (int)errno ) );
     186                        }
     187                        storage = (void *)(((intptr_t)storage) + __page_size);
     188                );
     189        #endif
     190        __cfaabi_dbg_print_safe("Kernel : Created stack %p of size %zu\n", storage, size);
    198191
    199192        verify( ((intptr_t)storage & (libAlign() - 1)) == 0ul );
     
    205198        void * storage = this->storage->limit;
    206199
    207         storage = (void *)(((intptr_t)storage) - __page_size);
    208         if(munmap(storage, size + __page_size) == -1) {
    209                 abort( "coroutine stack destruction : internal error, munmap failure, error(%d) %s.", errno, strerror( errno ) );
    210         }
     200        #if CFA_COROUTINE_USE_MMAP
     201                storage = (void *)(((intptr_t)storage) - __page_size);
     202                if(munmap(storage, size + __page_size) == -1) {
     203                        abort( "coroutine stack destruction : internal error, munmap failure, error(%d) %s.", errno, strerror( errno ) );
     204                }
     205        #else
     206                __cfaabi_dbg_debug_do(
     207                        storage = (char*)(storage) - __page_size;
     208                        if ( mprotect( storage, __page_size, PROT_READ | PROT_WRITE ) == -1 ) {
     209                                abort( "(coStack_t *)%p.^?{}() : internal error, mprotect failure, error(%d) %s.", &this, errno, strerror( errno ) );
     210                        }
     211                );
     212
     213                free( storage );
     214        #endif
     215        __cfaabi_dbg_print_safe("Kernel : Deleting stack %p\n", storage);
    211216}
    212217
Note: See TracChangeset for help on using the changeset viewer.