Changeset 97229d6 for libcfa/src/concurrency/coroutine.cfa
- Timestamp:
- Dec 14, 2020, 2:31:50 PM (5 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
- File:
-
- 1 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
Note: See TracChangeset
for help on using the changeset viewer.