Changeset 97229d6
- Timestamp:
- Dec 14, 2020, 2:31:50 PM (4 years ago)
- 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
- Location:
- libcfa/src/concurrency
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.cfa
r867fca3 r97229d6 29 29 #include "exception.hfa" 30 30 #include "math.hfa" 31 32 #define CFA_COROUTINE_USE_MMAP 0 31 33 32 34 #define __CFA_INVOKE_PRIVATE__ … … 110 112 if ( ! userStack && this.storage ) { 111 113 __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 );124 114 } 125 115 } … … 174 164 // If we are running debug, we also need to allocate a guardpage to catch stack overflows. 175 165 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); 198 191 199 192 verify( ((intptr_t)storage & (libAlign() - 1)) == 0ul ); … … 205 198 void * storage = this->storage->limit; 206 199 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); 211 216 } 212 217 -
libcfa/src/concurrency/kernel/startup.cfa
r867fca3 r97229d6 30 30 #include "startup.hfa" // STARTUP_PRIORITY_XXX 31 31 #include "math.hfa" 32 33 #define CFA_PROCESSOR_USE_MMAP 0 32 34 33 35 //----------------------------------------------------------------------------- … … 677 679 678 680 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 698 703 699 704 check( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" ); … … 707 712 if( err != 0 ) abort("KERNEL ERROR: joining pthread %p caused error %s\n", (void*)pthread, strerror(err)); 708 713 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 722 731 } 723 732
Note: See TracChangeset
for help on using the changeset viewer.