- Timestamp:
- Oct 15, 2020, 3:41:38 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:
- b9537e6
- Parents:
- 33c3ded (diff), 0b18db7 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- libcfa
- Files:
-
- 4 added
- 26 edited
-
prelude/builtins.c (modified) (2 diffs)
-
src/Makefile.am (modified) (2 diffs)
-
src/bits/containers.hfa (modified) (1 diff)
-
src/bits/locks.hfa (modified) (5 diffs)
-
src/concurrency/CtxSwitch-i386.S (modified) (3 diffs)
-
src/concurrency/alarm.cfa (modified) (1 diff)
-
src/concurrency/clib/cfathread.cfa (added)
-
src/concurrency/clib/cfathread.h (added)
-
src/concurrency/coroutine.cfa (modified) (4 diffs)
-
src/concurrency/coroutine.hfa (modified) (3 diffs)
-
src/concurrency/invoke.h (modified) (3 diffs)
-
src/concurrency/io.cfa (modified) (3 diffs)
-
src/concurrency/io/call.cfa.in (modified) (2 diffs)
-
src/concurrency/io/setup.cfa (modified) (4 diffs)
-
src/concurrency/kernel.cfa (modified) (14 diffs)
-
src/concurrency/kernel.hfa (modified) (1 diff)
-
src/concurrency/kernel/fwd.hfa (modified) (1 diff)
-
src/concurrency/kernel/startup.cfa (modified) (2 diffs)
-
src/concurrency/kernel_private.hfa (modified) (2 diffs)
-
src/concurrency/locks.cfa (added)
-
src/concurrency/locks.hfa (added)
-
src/concurrency/monitor.cfa (modified) (8 diffs)
-
src/concurrency/mutex.cfa (modified) (8 diffs)
-
src/concurrency/preemption.cfa (modified) (2 diffs)
-
src/concurrency/snzi.hfa (modified) (1 diff)
-
src/concurrency/thread.cfa (modified) (2 diffs)
-
src/concurrency/thread.hfa (modified) (1 diff)
-
src/exception.h (modified) (3 diffs)
-
src/exception.hfa (modified) (7 diffs)
-
src/parseargs.cfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/prelude/builtins.c
r33c3ded r223a633 10 10 // Created On : Fri Jul 21 16:21:03 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 13 21:10:02202013 // Update Count : 1 0912 // Last Modified On : Fri Oct 9 18:26:19 2020 13 // Update Count : 110 14 14 // 15 15 … … 94 94 // universal typed pointer constant 95 95 static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; } 96 static inline forall( ftype FT ) FT * intptr( uintptr_t addr ) { return (FT *)addr; } 96 97 97 98 #if defined(__SIZEOF_INT128__) -
libcfa/src/Makefile.am
r33c3ded r223a633 88 88 inst_thread_headers_nosrc = \ 89 89 bits/random.hfa \ 90 concurrency/clib/cfathread.h \ 90 91 concurrency/invoke.h \ 91 92 concurrency/kernel/fwd.hfa … … 103 104 concurrency/alarm.cfa \ 104 105 concurrency/alarm.hfa \ 106 concurrency/clib/cfathread.cfa \ 105 107 concurrency/CtxSwitch-@ARCHITECTURE@.S \ 106 108 concurrency/invoke.c \ -
libcfa/src/bits/containers.hfa
r33c3ded r223a633 157 157 tail = &get_next( *val ); 158 158 *tail = 1p; 159 } 160 161 T * peek( __queue(T) & this ) { 162 verify(*this.tail == 1p); 163 T * head = this.head; 164 if( head != 1p ) { 165 verify(*this.tail == 1p); 166 return head; 167 } 168 verify(*this.tail == 1p); 169 return 0p; 159 170 } 160 171 -
libcfa/src/bits/locks.hfa
r33c3ded r223a633 164 164 165 165 struct $thread; 166 extern void park( __cfaabi_dbg_ctx_param);167 extern void unpark( struct $thread * this __cfaabi_dbg_ctx_param2);166 extern void park( void ); 167 extern void unpark( struct $thread * this ); 168 168 static inline struct $thread * active_thread (); 169 169 … … 191 191 /* paranoid */ verify( expected == 0p ); 192 192 if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 193 park( __cfaabi_dbg_ctx);193 park(); 194 194 return true; 195 195 } … … 210 210 else { 211 211 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 212 unpark( expected __cfaabi_dbg_ctx2);212 unpark( expected ); 213 213 return true; 214 214 } … … 244 244 /* paranoid */ verify( expected == 0p ); 245 245 if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 246 park( __cfaabi_dbg_ctx);246 park(); 247 247 /* paranoid */ verify( this.ptr == 1p ); 248 248 return true; … … 256 256 struct $thread * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST); 257 257 if( got == 0p ) return false; 258 unpark( got __cfaabi_dbg_ctx2);258 unpark( got ); 259 259 return true; 260 260 } -
libcfa/src/concurrency/CtxSwitch-i386.S
r33c3ded r223a633 10 10 // Created On : Tue Dec 6 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 16 08:46:22202013 // Update Count : 412 // Last Modified On : Sun Sep 6 18:23:37 2020 13 // Update Count : 5 14 14 // 15 15 … … 35 35 36 36 // Copy the "from" context argument from the stack to register eax 37 // Return address is at 0(%esp), with parameters following 37 // Return address is at 0(%esp), with parameters following. 38 38 39 39 movl 4(%esp),%eax … … 50 50 movl %ebp,FP_OFFSET(%eax) 51 51 52 // Copy the "to" context argument from the stack to register eax 53 // Having pushed three words (= 12 bytes) on the stack, the54 // argument is now at 8 + 12 = 20(%esp)52 // Copy the "to" context argument from the stack to register eax. Having 53 // pushed 3 words (= 12 bytes) on the stack, the argument is now at 54 // 8 + 12 = 20(%esp). 55 55 56 56 movl 20(%esp),%eax -
libcfa/src/concurrency/alarm.cfa
r33c3ded r223a633 130 130 131 131 register_self( &node ); 132 park( __cfaabi_dbg_ctx);132 park(); 133 133 134 134 /* paranoid */ verify( !node.set ); -
libcfa/src/concurrency/coroutine.cfa
r33c3ded r223a633 47 47 48 48 //----------------------------------------------------------------------------- 49 FORALL_DATA_INSTANCE(CoroutineCancelled, 50 (dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) 49 FORALL_DATA_INSTANCE(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) 51 50 52 51 struct __cfaehm_node { … … 59 58 void mark_exception(CoroutineCancelled(T) *) {} 60 59 61 forall(dtype T | sized(T))60 forall(dtype T) 62 61 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) { 63 62 dst->the_coroutine = src->the_coroutine; … … 77 76 exception_t * except = (exception_t *)(1 + (__cfaehm_node *)desc->cancellation); 78 77 78 // TODO: Remove explitate vtable set once trac#186 is fixed. 79 79 CoroutineCancelled(T) except; 80 except.virtual_table = &get_exception_vtable(&except); 80 81 except.the_coroutine = &cor; 81 82 except.the_exception = except; … … 91 92 92 93 // minimum feasible stack size in bytes 93 #define MinStackSize 1000 94 static const size_t MinStackSize = 1000; 94 95 extern size_t __page_size; // architecture pagesize HACK, should go in proper runtime singleton 95 96 -
libcfa/src/concurrency/coroutine.hfa
r33c3ded r223a633 22 22 //----------------------------------------------------------------------------- 23 23 // Exception thrown from resume when a coroutine stack is cancelled. 24 // Should not have to be be sized (see trac #196). 25 FORALL_DATA_EXCEPTION(CoroutineCancelled, 26 (dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) ( 24 FORALL_DATA_EXCEPTION(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) ( 27 25 coroutine_t * the_coroutine; 28 26 exception_t * the_exception; … … 30 28 31 29 forall(dtype T) 32 void mark_exception(CoroutineCancelled(T) *);33 34 forall(dtype T | sized(T))35 30 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src); 36 31 … … 42 37 // Anything that implements this trait can be resumed. 43 38 // Anything that is resumed is a coroutine. 44 trait is_coroutine(dtype T | sized(T) 45 | is_resumption_exception(CoroutineCancelled(T)) 46 | VTABLE_ASSERTION(CoroutineCancelled, (T))) { 39 trait is_coroutine(dtype T | IS_RESUMPTION_EXCEPTION(CoroutineCancelled, (T))) { 47 40 void main(T & this); 48 41 $coroutine * get_coroutine(T & this); -
libcfa/src/concurrency/invoke.h
r33c3ded r223a633 93 93 94 94 }; 95 // Wrapper for gdb 96 struct cfathread_coroutine_t { struct $coroutine debug; }; 95 97 96 98 static inline struct __stack_t * __get_stack( struct $coroutine * cor ) { … … 129 131 struct __condition_node_t * dtor_node; 130 132 }; 133 // Wrapper for gdb 134 struct cfathread_monitor_t { struct $monitor debug; }; 131 135 132 136 struct __monitor_group_t { … … 186 190 } node; 187 191 188 #ifdef __CFA_DEBUG__ 189 // previous function to park/unpark the thread 190 const char * park_caller; 191 int park_result; 192 enum __Coroutine_State park_state; 193 bool park_stale; 194 const char * unpark_caller; 195 int unpark_result; 196 enum __Coroutine_State unpark_state; 197 bool unpark_stale; 192 #if defined( __CFA_WITH_VERIFY__ ) 193 unsigned long long canary; 198 194 #endif 199 195 }; 196 // Wrapper for gdb 197 struct cfathread_thread_t { struct $thread debug; }; 200 198 201 199 #ifdef __CFA_DEBUG__ -
libcfa/src/concurrency/io.cfa
r33c3ded r223a633 69 69 if( block ) { 70 70 enable_interrupts( __cfaabi_dbg_ctx ); 71 park( __cfaabi_dbg_ctx);71 park(); 72 72 disable_interrupts(); 73 73 } … … 97 97 98 98 if(nextt) { 99 unpark( nextt __cfaabi_dbg_ctx2);99 unpark( nextt ); 100 100 enable_interrupts( __cfaabi_dbg_ctx ); 101 101 return true; … … 134 134 int ret = 0; 135 135 if( need_sys_to_submit || need_sys_to_complete ) { 136 ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, 0, flags, 0p, _NSIG / 8);136 ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, 0, flags, (sigset_t *)0p, _NSIG / 8); 137 137 if( ret < 0 ) { 138 138 switch((int)errno) { -
libcfa/src/concurrency/io/call.cfa.in
r33c3ded r223a633 47 47 #include "kernel/fwd.hfa" 48 48 49 #if defined(CFA_HAVE_IOSQE_FIXED_FILE) && defined(CFA_HAVE_IOSQE_IO_DRAIN) && defined(CFA_HAVE_IOSQE_ASYNC) 50 #define REGULAR_FLAGS (IOSQE_FIXED_FILE | IOSQE_IO_DRAIN | IOSQE_ASYNC) 51 #elif defined(CFA_HAVE_IOSQE_FIXED_FILE) && defined(CFA_HAVE_IOSQE_ASYNC) 52 #define REGULAR_FLAGS (IOSQE_FIXED_FILE | IOSQE_ASYNC) 53 #elif defined(CFA_HAVE_IOSQE_FIXED_FILE) && defined(CFA_HAVE_IOSQE_IO_DRAIN) 54 #define REGULAR_FLAGS (IOSQE_FIXED_FILE | IOSQE_IO_DRAIN) 55 #elif defined(CFA_HAVE_IOSQE_IO_DRAIN) && defined(CFA_HAVE_IOSQE_ASYNC) 56 #define REGULAR_FLAGS (IOSQE_IO_DRAIN | IOSQE_ASYNC) 57 #elif defined(CFA_HAVE_IOSQE_FIXED_FILE) 58 #define REGULAR_FLAGS (IOSQE_FIXED_FILE) 59 #elif defined(CFA_HAVE_IOSQE_IO_DRAIN) 60 #define REGULAR_FLAGS (IOSQE_IO_DRAIN) 61 #elif defined(CFA_HAVE_IOSQE_ASYNC) 62 #define REGULAR_FLAGS (IOSQE_ASYNC) 63 #else 64 #define REGULAR_FLAGS (0) 65 #endif 66 67 #if defined(CFA_HAVE_IOSQE_IO_LINK) && defined(CFA_HAVE_IOSQE_IO_HARDLINK) 68 #define LINK_FLAGS (IOSQE_IO_LINK | IOSQE_IO_HARDLINK) 69 #elif defined(CFA_HAVE_IOSQE_IO_LINK) 70 #define LINK_FLAGS (IOSQE_IO_LINK) 71 #elif defined(CFA_HAVE_IOSQE_IO_HARDLINK) 72 #define LINK_FLAGS (IOSQE_IO_HARDLINK) 73 #else 74 #define LINK_FLAGS (0) 75 #endif 76 77 #if defined(CFA_HAVE_SPLICE_F_FD_IN_FIXED) 78 #define SPLICE_FLAGS (SPLICE_F_FD_IN_FIXED) 79 #else 80 #define SPLICE_FLAGS (0) 81 #endif 49 static const __u8 REGULAR_FLAGS = 0 50 #if defined(CFA_HAVE_IOSQE_FIXED_FILE) 51 | IOSQE_FIXED_FILE 52 #endif 53 #if defined(CFA_HAVE_IOSQE_IO_DRAIN) 54 | IOSQE_IO_DRAIN 55 #endif 56 #if defined(CFA_HAVE_IOSQE_ASYNC) 57 | IOSQE_ASYNC 58 #endif 59 ; 60 61 static const __u32 LINK_FLAGS = 0 62 #if defined(CFA_HAVE_IOSQE_IO_LINK) 63 | IOSQE_IO_LINK 64 #endif 65 #if defined(CFA_HAVE_IOSQE_IO_HARDLINK) 66 | IOSQE_IO_HARDLINK 67 #endif 68 ; 69 70 static const __u32 SPLICE_FLAGS = 0 71 #if defined(CFA_HAVE_SPLICE_F_FD_IN_FIXED) 72 | SPLICE_F_FD_IN_FIXED 73 #endif 74 ; 82 75 83 76 extern [* struct io_uring_sqe, __u32] __submit_alloc( struct __io_data & ring, __u64 data ); … … 347 340 # CFA_HAVE_IORING_OP_MADVISE 348 341 Call('MADVISE', 'int madvise(void *addr, size_t length, int advice)', { 349 'addr': ' addr',342 'addr': '(__u64)addr', 350 343 'len': 'length', 351 344 'fadvise_advice': 'advice' -
libcfa/src/concurrency/io/setup.cfa
r33c3ded r223a633 147 147 static void * iopoll_loop( __attribute__((unused)) void * args ) { 148 148 __processor_id_t id; 149 id.full_proc = false; 149 150 id.id = doregister(&id); 150 151 __cfaabi_dbg_print_safe( "Kernel : IO poller thread starting\n" ); … … 246 247 thrd.link.next = 0p; 247 248 thrd.link.prev = 0p; 248 __cfaabi_dbg_debug_do( thrd.unpark_stale = true );249 249 250 250 // Fixup the thread state … … 266 266 267 267 // unpark the fast io_poller 268 unpark( &thrd __cfaabi_dbg_ctx2);268 unpark( &thrd ); 269 269 } 270 270 else { … … 275 275 } 276 276 } else { 277 unpark( &thrd __cfaabi_dbg_ctx2);277 unpark( &thrd ); 278 278 } 279 279 -
libcfa/src/concurrency/kernel.cfa
r33c3ded r223a633 237 237 $coroutine * proc_cor = get_coroutine(this->runner); 238 238 239 // Update global state240 kernelTLS.this_thread = thrd_dst;241 242 239 // set state of processor coroutine to inactive 243 240 verify(proc_cor->state == Active); … … 249 246 thrd_dst->state = Active; 250 247 251 __cfaabi_dbg_debug_do( 252 thrd_dst->park_stale = true; 253 thrd_dst->unpark_stale = true; 254 ) 248 // Update global state 249 kernelTLS.this_thread = thrd_dst; 255 250 256 251 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 257 252 /* paranoid */ verify( kernelTLS.this_thread == thrd_dst ); 253 /* paranoid */ verify( thrd_dst->context.SP ); 258 254 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor 259 255 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor 256 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary ); 257 258 260 259 261 260 // set context switch to the thread that the processor is executing 262 verify( thrd_dst->context.SP );263 261 __cfactx_switch( &proc_cor->context, &thrd_dst->context ); 264 262 // when __cfactx_switch returns we are back in the processor coroutine 265 263 264 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_dst->canary ); 266 265 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); 267 266 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); 267 /* paranoid */ verify( thrd_dst->context.SP ); 268 268 /* paranoid */ verify( kernelTLS.this_thread == thrd_dst ); 269 269 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 270 270 271 // Reset global state 272 kernelTLS.this_thread = 0p; 271 273 272 274 // We just finished running a thread, there are a few things that could have happened. … … 286 288 // The thread has halted, it should never be scheduled/run again 287 289 // We may need to wake someone up here since 288 unpark( this->destroyer __cfaabi_dbg_ctx2);290 unpark( this->destroyer ); 289 291 this->destroyer = 0p; 290 292 break RUNNING; … … 296 298 // set state of processor coroutine to active and the thread to inactive 297 299 int old_ticket = __atomic_fetch_sub(&thrd_dst->ticket, 1, __ATOMIC_SEQ_CST); 298 __cfaabi_dbg_debug_do( thrd_dst->park_result = old_ticket; )299 300 switch(old_ticket) { 300 301 case 1: … … 313 314 // Just before returning to the processor, set the processor coroutine to active 314 315 proc_cor->state = Active; 315 kernelTLS.this_thread = 0p;316 316 317 317 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); … … 334 334 __x87_store; 335 335 #endif 336 verify( proc_cor->context.SP ); 336 /* paranoid */ verify( proc_cor->context.SP ); 337 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary ); 337 338 __cfactx_switch( &thrd_src->context, &proc_cor->context ); 339 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd_src->canary ); 338 340 #if defined( __i386 ) || defined( __x86_64 ) 339 341 __x87_load; … … 367 369 /* paranoid */ #endif 368 370 /* paranoid */ verifyf( thrd->link.next == 0p, "Expected null got %p", thrd->link.next ); 371 /* paranoid */ verify( 0x0D15EA5E0D15EA5E == thrd->canary ); 372 369 373 370 374 if (thrd->preempted == __NO_PREEMPTION) thrd->state = Ready; … … 403 407 404 408 // KERNEL ONLY unpark with out disabling interrupts 405 void __unpark( struct __processor_id_t * id, $thread * thrd __cfaabi_dbg_ctx_param2 ) { 406 // record activity 407 __cfaabi_dbg_record_thrd( *thrd, false, caller ); 408 409 void __unpark( struct __processor_id_t * id, $thread * thrd ) { 409 410 int old_ticket = __atomic_fetch_add(&thrd->ticket, 1, __ATOMIC_SEQ_CST); 410 __cfaabi_dbg_debug_do( thrd->unpark_result = old_ticket; thrd->unpark_state = thrd->state; )411 411 switch(old_ticket) { 412 412 case 1: … … 426 426 } 427 427 428 void unpark( $thread * thrd __cfaabi_dbg_ctx_param2) {428 void unpark( $thread * thrd ) { 429 429 if( !thrd ) return; 430 430 431 431 disable_interrupts(); 432 __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd __cfaabi_dbg_ctx_fwd2);432 __unpark( (__processor_id_t*)kernelTLS.this_processor, thrd ); 433 433 enable_interrupts( __cfaabi_dbg_ctx ); 434 434 } 435 435 436 void park( __cfaabi_dbg_ctx_param) {436 void park( void ) { 437 437 /* paranoid */ verify( kernelTLS.preemption_state.enabled ); 438 438 disable_interrupts(); 439 439 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 440 440 /* paranoid */ verify( kernelTLS.this_thread->preempted == __NO_PREEMPTION ); 441 442 // record activity443 __cfaabi_dbg_record_thrd( *kernelTLS.this_thread, true, caller );444 441 445 442 returnToKernel(); … … 521 518 disable_interrupts(); 522 519 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 523 bool ret =post( this->idle );520 post( this->idle ); 524 521 enable_interrupts( __cfaabi_dbg_ctx ); 525 522 } … … 649 646 // atomically release spin lock and block 650 647 unlock( lock ); 651 park( __cfaabi_dbg_ctx);648 park(); 652 649 return true; 653 650 } … … 670 667 671 668 // make new owner 672 unpark( thrd __cfaabi_dbg_ctx2);669 unpark( thrd ); 673 670 674 671 return thrd != 0p; … … 681 678 count += diff; 682 679 for(release) { 683 unpark( pop_head( waiting ) __cfaabi_dbg_ctx2);680 unpark( pop_head( waiting ) ); 684 681 } 685 682 … … 697 694 this.prev_thrd = kernelTLS.this_thread; 698 695 } 699 700 void __cfaabi_dbg_record_thrd($thread & this, bool park, const char prev_name[]) {701 if(park) {702 this.park_caller = prev_name;703 this.park_stale = false;704 }705 else {706 this.unpark_caller = prev_name;707 this.unpark_stale = false;708 }709 }710 696 } 711 697 ) -
libcfa/src/concurrency/kernel.hfa
r33c3ded r223a633 48 48 // Processor id, required for scheduling threads 49 49 struct __processor_id_t { 50 unsigned id; 50 unsigned id:24; 51 bool full_proc:1; 51 52 52 53 #if !defined(__CFA_NO_STATISTICS__) -
libcfa/src/concurrency/kernel/fwd.hfa
r33c3ded r223a633 118 118 119 119 extern "Cforall" { 120 extern void park( __cfaabi_dbg_ctx_param);121 extern void unpark( struct $thread * this __cfaabi_dbg_ctx_param2);120 extern void park( void ); 121 extern void unpark( struct $thread * this ); 122 122 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 123 123 -
libcfa/src/concurrency/kernel/startup.cfa
r33c3ded r223a633 451 451 link.next = 0p; 452 452 link.prev = 0p; 453 #if defined( __CFA_WITH_VERIFY__ ) 454 canary = 0x0D15EA5E0D15EA5E; 455 #endif 453 456 454 457 node.next = 0p; … … 470 473 this.name = name; 471 474 this.cltr = &_cltr; 472 id = -1u;475 full_proc = true; 473 476 destroyer = 0p; 474 477 do_terminate = false; -
libcfa/src/concurrency/kernel_private.hfa
r33c3ded r223a633 64 64 65 65 // KERNEL ONLY unpark with out disabling interrupts 66 void __unpark( struct __processor_id_t *, $thread * thrd __cfaabi_dbg_ctx_param2);66 void __unpark( struct __processor_id_t *, $thread * thrd ); 67 67 68 68 static inline bool __post(single_sem & this, struct __processor_id_t * id) { … … 77 77 else { 78 78 if(__atomic_compare_exchange_n(&this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { 79 __unpark( id, expected __cfaabi_dbg_ctx2);79 __unpark( id, expected ); 80 80 return true; 81 81 } -
libcfa/src/concurrency/monitor.cfa
r33c3ded r223a633 122 122 123 123 unlock( this->lock ); 124 park( __cfaabi_dbg_ctx);124 park(); 125 125 126 126 __cfaabi_dbg_print_safe( "Kernel : %10p Entered mon %p\n", thrd, this); … … 201 201 // Release the next thread 202 202 /* paranoid */ verifyf( urgent->owner->waiting_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this ); 203 unpark( urgent->owner->waiting_thread __cfaabi_dbg_ctx2);203 unpark( urgent->owner->waiting_thread ); 204 204 205 205 // Park current thread waiting 206 park( __cfaabi_dbg_ctx);206 park(); 207 207 208 208 // Some one was waiting for us, enter … … 222 222 223 223 // Park current thread waiting 224 park( __cfaabi_dbg_ctx);224 park(); 225 225 226 226 /* paranoid */ verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this ); … … 264 264 //We need to wake-up the thread 265 265 /* paranoid */ verifyf( !new_owner || new_owner == this->owner, "Expected owner to be %p, got %p (m: %p)", new_owner, this->owner, this ); 266 unpark( new_owner __cfaabi_dbg_ctx2);266 unpark( new_owner ); 267 267 } 268 268 … … 493 493 // Wake the threads 494 494 for(int i = 0; i < thread_count; i++) { 495 unpark( threads[i] __cfaabi_dbg_ctx2);495 unpark( threads[i] ); 496 496 } 497 497 498 498 // Everything is ready to go to sleep 499 park( __cfaabi_dbg_ctx);499 park(); 500 500 501 501 // We are back, restore the owners and recursions … … 575 575 576 576 // unpark the thread we signalled 577 unpark( signallee __cfaabi_dbg_ctx2);577 unpark( signallee ); 578 578 579 579 //Everything is ready to go to sleep 580 park( __cfaabi_dbg_ctx);580 park(); 581 581 582 582 … … 679 679 680 680 // unpark the thread we signalled 681 unpark( next __cfaabi_dbg_ctx2);681 unpark( next ); 682 682 683 683 //Everything is ready to go to sleep 684 park( __cfaabi_dbg_ctx);684 park(); 685 685 686 686 // We are back, restore the owners and recursions … … 724 724 725 725 //Everything is ready to go to sleep 726 park( __cfaabi_dbg_ctx);726 park(); 727 727 728 728 -
libcfa/src/concurrency/mutex.cfa
r33c3ded r223a633 42 42 append( blocked_threads, kernelTLS.this_thread ); 43 43 unlock( lock ); 44 park( __cfaabi_dbg_ctx);44 park(); 45 45 } 46 46 else { … … 65 65 this.is_locked = (this.blocked_threads != 0); 66 66 unpark( 67 pop_head( this.blocked_threads ) __cfaabi_dbg_ctx267 pop_head( this.blocked_threads ) 68 68 ); 69 69 unlock( this.lock ); … … 97 97 append( blocked_threads, kernelTLS.this_thread ); 98 98 unlock( lock ); 99 park( __cfaabi_dbg_ctx);99 park(); 100 100 } 101 101 } … … 124 124 owner = thrd; 125 125 recursion_count = (thrd ? 1 : 0); 126 unpark( thrd __cfaabi_dbg_ctx2);126 unpark( thrd ); 127 127 } 128 128 unlock( lock ); … … 142 142 lock( lock __cfaabi_dbg_ctx2 ); 143 143 unpark( 144 pop_head( this.blocked_threads ) __cfaabi_dbg_ctx2144 pop_head( this.blocked_threads ) 145 145 ); 146 146 unlock( lock ); … … 151 151 while(this.blocked_threads) { 152 152 unpark( 153 pop_head( this.blocked_threads ) __cfaabi_dbg_ctx2153 pop_head( this.blocked_threads ) 154 154 ); 155 155 } … … 161 161 append( this.blocked_threads, kernelTLS.this_thread ); 162 162 unlock( this.lock ); 163 park( __cfaabi_dbg_ctx);163 park(); 164 164 } 165 165 … … 170 170 unlock(l); 171 171 unlock(this.lock); 172 park( __cfaabi_dbg_ctx);172 park(); 173 173 lock(l); 174 174 } -
libcfa/src/concurrency/preemption.cfa
r33c3ded r223a633 274 274 kernelTLS.this_stats = this->curr_cluster->stats; 275 275 #endif 276 __unpark( id, this __cfaabi_dbg_ctx2);276 __unpark( id, this ); 277 277 } 278 278 … … 411 411 static void * alarm_loop( __attribute__((unused)) void * args ) { 412 412 __processor_id_t id; 413 id.full_proc = false; 413 414 id.id = doregister(&id); 414 415 -
libcfa/src/concurrency/snzi.hfa
r33c3ded r223a633 36 36 static inline void depart( __snzi_node_t & ); 37 37 38 #define __snzi_half -1 38 static const int __snzi_half = -1; 39 39 40 40 //-------------------------------------------------- -
libcfa/src/concurrency/thread.cfa
r33c3ded r223a633 39 39 link.prev = 0p; 40 40 link.preferred = -1; 41 #if defined( __CFA_WITH_VERIFY__ ) 42 canary = 0x0D15EA5E0D15EA5E; 43 #endif 41 44 42 45 node.next = 0p; … … 48 51 49 52 void ^?{}($thread& this) with( this ) { 53 #if defined( __CFA_WITH_VERIFY__ ) 54 canary = 0xDEADDEADDEADDEAD; 55 #endif 50 56 unregister(curr_cluster, this); 51 57 ^self_cor{}; -
libcfa/src/concurrency/thread.hfa
r33c3ded r223a633 88 88 //---------- 89 89 // Park thread: block until corresponding call to unpark, won't block if unpark is already called 90 void park( __cfaabi_dbg_ctx_param);90 void park( void ); 91 91 92 92 //---------- 93 93 // Unpark a thread, if the thread is already blocked, schedule it 94 94 // if the thread is not yet block, signal that it should rerun immediately 95 void unpark( $thread * this __cfaabi_dbg_ctx_param2);95 void unpark( $thread * this ); 96 96 97 97 forall( dtype T | is_thread(T) ) 98 static inline void unpark( T & this __cfaabi_dbg_ctx_param2 ) { if(!&this) return; unpark( get_thread( this ) __cfaabi_dbg_ctx_fwd2);}98 static inline void unpark( T & this ) { if(!&this) return; unpark( get_thread( this ) );} 99 99 100 100 //---------- -
libcfa/src/exception.h
r33c3ded r223a633 76 76 // implemented in the .c file either so they all have to be inline. 77 77 78 trait is_exception(dtype exceptT ) {78 trait is_exception(dtype exceptT, dtype virtualT) { 79 79 /* The first field must be a pointer to a virtual table. 80 * That virtual table must be a decendent of the base exception virtual tab $80 * That virtual table must be a decendent of the base exception virtual table. 81 81 */ 82 v oid mark_exception(exceptT *);83 // This is never used and should be a no-op.82 virtualT const & get_exception_vtable(exceptT *); 83 // Always returns the virtual table for this type (associated types hack). 84 84 }; 85 85 86 trait is_termination_exception(dtype exceptT | is_exception(exceptT)) {86 trait is_termination_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) { 87 87 void defaultTerminationHandler(exceptT &); 88 88 }; 89 89 90 trait is_resumption_exception(dtype exceptT | is_exception(exceptT)) {90 trait is_resumption_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) { 91 91 void defaultResumptionHandler(exceptT &); 92 92 }; 93 93 94 forall(dtype exceptT | is_termination_exception(exceptT))94 forall(dtype exceptT, dtype virtualT | is_termination_exception(exceptT, virtualT)) 95 95 static inline void $throw(exceptT & except) { 96 96 __cfaehm_throw_terminate( … … 100 100 } 101 101 102 forall(dtype exceptT | is_resumption_exception(exceptT))102 forall(dtype exceptT, dtype virtualT | is_resumption_exception(exceptT, virtualT)) 103 103 static inline void $throwResume(exceptT & except) { 104 104 __cfaehm_throw_resume( … … 108 108 } 109 109 110 forall(dtype exceptT | is_exception(exceptT))110 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 111 111 static inline void cancel_stack(exceptT & except) __attribute__((noreturn)) { 112 112 __cfaehm_cancel_stack( (exception_t *)&except ); 113 113 } 114 114 115 forall(dtype exceptT | is_exception(exceptT))115 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 116 116 static inline void defaultTerminationHandler(exceptT & except) { 117 117 return cancel_stack( except ); 118 118 } 119 119 120 forall(dtype exceptT | is_exception(exceptT))120 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 121 121 static inline void defaultResumptionHandler(exceptT & except) { 122 122 throw except; -
libcfa/src/exception.hfa
r33c3ded r223a633 95 95 // visible anywhere you use the instantiation of the exception is used. 96 96 #define POLY_VTABLE_DECLARATION(exception_name, ...) \ 97 void mark_exception(exception_name(__VA_ARGS__) *); \97 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable(exception_name(__VA_ARGS__) *); \ 98 98 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name) 99 99 … … 125 125 #define VTABLE_ASSERTION(exception_name, parameters) \ 126 126 { VTABLE_TYPE(exception_name) parameters VTABLE_NAME(exception_name); } 127 128 // IS_EXCEPTION(exception_name [, (...parameters)]) 129 // IS_RESUMPTION_EXCEPTION(exception_name [, (parameters...)]) 130 // IS_TERMINATION_EXCEPTION(exception_name [, (parameters...)]) 131 // Create an assertion that exception_name, possibly with the qualifing parameters, is the given 132 // kind of exception with the standard vtable with the same parameters if applicable. 133 #define IS_EXCEPTION(...) _IS_EXCEPTION(is_exception, __VA_ARGS__, , ~) 134 #define IS_RESUMPTION_EXCEPTION(...) _IS_EXCEPTION(is_resumption_exception, __VA_ARGS__, , ~) 135 #define IS_TERMINATION_EXCEPTION(...) _IS_EXCEPTION(is_termination_exception, __VA_ARGS__, , ~) 127 136 128 137 // All internal helper macros begin with an underscore. … … 160 169 161 170 #define _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) \ 162 forall(_UNPACK assertions | VTABLE_ASSERTION(exception_name, parameters) ) \ 171 forall(_UNPACK assertions | \ 172 is_exception(exception_name parameters, VTABLE_TYPE(exception_name) parameters)) \ 163 173 void ?{}(exception_name parameters & this) 164 174 165 175 #define _FORALL_CTOR0_INSTANCE(exception_name, assertions, parameters) \ 166 176 _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) { \ 167 VTABLE_INIT(this, exception_name); \177 (this).virtual_table = &get_exception_vtable(&this); \ 168 178 } 169 179 … … 185 195 #define _VTABLE_DECLARATION(exception_name, parent_name, ...) \ 186 196 struct exception_name; \ 187 void mark_exception(exception_name *); \188 197 VTABLE_TYPE(exception_name); \ 198 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *); \ 189 199 extern VTABLE_TYPE(exception_name) VTABLE_NAME(exception_name); \ 190 200 VTABLE_TYPE(exception_name) { \ … … 197 207 198 208 #define _VTABLE_INSTANCE(exception_name, parent_name, ...) \ 199 void mark_exception(exception_name *) {} \ 209 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *) { \ 210 return VTABLE_NAME(exception_name); \ 211 } \ 200 212 void _GLUE2(exception_name,_copy)(exception_name * this, exception_name * other) { \ 201 213 *this = *other; \ … … 218 230 219 231 #define _POLY_VTABLE_INSTANCE(exception_name, parent_name, ...) \ 220 void mark_exception(exception_name(__VA_ARGS__) *) {} \ 232 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name); \ 233 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable( \ 234 exception_name(__VA_ARGS__) *) { \ 235 return VTABLE_NAME(exception_name); \ 236 } \ 221 237 void _GLUE2(exception_name,_copy)( \ 222 238 exception_name(__VA_ARGS__) * this, exception_name(__VA_ARGS__) * other) { \ … … 227 243 _GLUE2(exception_name,_copy), ^?{}, \ 228 244 _CLOSE 245 246 #define _IS_EXCEPTION(kind, exception_name, parameters, ...) \ 247 kind(exception_name parameters, VTABLE_TYPE(exception_name) parameters) -
libcfa/src/parseargs.cfa
r33c3ded r223a633 25 25 #include "limits.hfa" 26 26 27 extern int cfa_args_argc ;28 extern char ** cfa_args_argv ;29 extern char ** cfa_args_envp ;27 extern int cfa_args_argc __attribute__((weak)); 28 extern char ** cfa_args_argv __attribute__((weak)); 29 extern char ** cfa_args_envp __attribute__((weak)); 30 30 31 31 static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * usage, FILE * out) __attribute__ ((noreturn)); 32 32 33 33 void parse_args( cfa_option options[], size_t opt_count, const char * usage, char ** & left ) { 34 parse_args(cfa_args_argc, cfa_args_argv, options, opt_count, usage, left ); 34 if( 0p != &cfa_args_argc ) { 35 parse_args(cfa_args_argc, cfa_args_argv, options, opt_count, usage, left ); 36 } 37 else { 38 char * temp = ""; 39 parse_args(0, &temp, options, opt_count, usage, left ); 40 } 35 41 } 36 42
Note:
See TracChangeset
for help on using the changeset viewer.