Changeset 58fe85a for libcfa/src/concurrency/thread.cfa
- Timestamp:
- Jan 7, 2021, 3:27:00 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:
- 2b4daf2, 64aeca0
- Parents:
- 3c64c668 (diff), eef8dfb (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/thread.cfa
r3c64c668 r58fe85a 19 19 20 20 #include "kernel_private.hfa" 21 #include "exception.hfa" 21 22 22 23 #define __CFA_INVOKE_PRIVATE__ … … 28 29 context{ 0p, 0p }; 29 30 self_cor{ name, storage, storageSize }; 31 ticket = TICKET_RUNNING; 30 32 state = Start; 31 33 preempted = __NO_PREEMPTION; … … 35 37 self_mon_p = &self_mon; 36 38 curr_cluster = &cl; 37 next = 0p; 39 link.next = 0p; 40 link.prev = 0p; 41 link.preferred = -1; 42 #if defined( __CFA_WITH_VERIFY__ ) 43 canary = 0x0D15EA5E0D15EA5Ep; 44 #endif 45 46 seqable.next = 0p; 47 seqable.back = 0p; 38 48 39 49 node.next = 0p; … … 45 55 46 56 void ^?{}($thread& this) with( this ) { 57 #if defined( __CFA_WITH_VERIFY__ ) 58 canary = 0xDEADDEADDEADDEADp; 59 #endif 47 60 unregister(curr_cluster, this); 48 61 ^self_cor{}; 62 } 63 64 FORALL_DATA_INSTANCE(ThreadCancelled, (dtype thread_t), (thread_t)) 65 66 forall(dtype T) 67 void copy(ThreadCancelled(T) * dst, ThreadCancelled(T) * src) { 68 dst->virtual_table = src->virtual_table; 69 dst->the_thread = src->the_thread; 70 dst->the_exception = src->the_exception; 71 } 72 73 forall(dtype T) 74 const char * msg(ThreadCancelled(T) *) { 75 return "ThreadCancelled"; 76 } 77 78 forall(dtype T) 79 static void default_thread_cancel_handler(ThreadCancelled(T) & ) { 80 abort( "Unhandled thread cancellation.\n" ); 81 } 82 83 forall(dtype T | is_thread(T) | IS_EXCEPTION(ThreadCancelled, (T))) 84 void ?{}( thread_dtor_guard_t & this, 85 T & thrd, void(*defaultResumptionHandler)(ThreadCancelled(T) &)) { 86 $monitor * m = get_monitor(thrd); 87 $thread * desc = get_thread(thrd); 88 89 // Setup the monitor guard 90 void (*dtor)(T& mutex this) = ^?{}; 91 bool join = defaultResumptionHandler != (void(*)(ThreadCancelled(T)&))0; 92 (this.mg){&m, (void(*)())dtor, join}; 93 94 95 /* paranoid */ verifyf( Halted == desc->state || Cancelled == desc->state, "Expected thread to be Halted or Cancelled, was %d\n", (int)desc->state ); 96 97 // After the guard set-up and any wait, check for cancellation. 98 struct _Unwind_Exception * cancellation = desc->self_cor.cancellation; 99 if ( likely( 0p == cancellation ) ) { 100 return; 101 } else if ( Cancelled == desc->state ) { 102 return; 103 } 104 desc->state = Cancelled; 105 if (!join) { 106 defaultResumptionHandler = default_thread_cancel_handler; 107 } 108 109 ThreadCancelled(T) except; 110 // TODO: Remove explitate vtable set once trac#186 is fixed. 111 except.virtual_table = &get_exception_vtable(&except); 112 except.the_thread = &thrd; 113 except.the_exception = __cfaehm_cancellation_exception( cancellation ); 114 throwResume except; 115 116 except.the_exception->virtual_table->free( except.the_exception ); 117 free( cancellation ); 118 desc->self_cor.cancellation = 0p; 119 } 120 121 void ^?{}( thread_dtor_guard_t & this ) { 122 ^(this.mg){}; 49 123 } 50 124 … … 59 133 60 134 this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP]; 61 verify( this_thrd->context.SP );135 /* paranoid */ verify( this_thrd->context.SP ); 62 136 63 __schedule_thread( this_thrd);137 __schedule_thread( this_thrd ); 64 138 enable_interrupts( __cfaabi_dbg_ctx ); 65 139 } … … 84 158 } 85 159 160 //----------------------------------------------------------------------------- 161 forall(dtype T | is_thread(T) | IS_RESUMPTION_EXCEPTION(ThreadCancelled, (T))) 162 T & join( T & this ) { 163 thread_dtor_guard_t guard = { this, defaultResumptionHandler }; 164 return this; 165 } 166 167 uint64_t thread_rand() { 168 disable_interrupts(); 169 uint64_t ret = __tls_rand(); 170 enable_interrupts( __cfaabi_dbg_ctx ); 171 return ret; 172 } 173 86 174 // Local Variables: // 87 175 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.