Changeset 139775e for libcfa/src/concurrency/kernel
- Timestamp:
- Nov 6, 2020, 4:48:52 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:
- 75baaa3
- Parents:
- 55acc3a (diff), 836c9925 (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/src/concurrency/kernel
- Files:
-
- 2 edited
-
fwd.hfa (modified) (6 diffs)
-
startup.cfa (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
r55acc3a r139775e 35 35 extern "Cforall" { 36 36 extern __attribute__((aligned(128))) thread_local struct KernelThreadData { 37 struct $thread * volatile this_thread; 38 struct processor * volatile this_processor; 39 struct __stats_t * volatile this_stats; 37 struct $thread * volatile this_thread; 38 struct processor * volatile this_processor; 39 struct __processor_id_t * volatile this_proc_id; 40 struct __stats_t * volatile this_stats; 40 41 41 42 struct { … … 54 55 uint64_t bck_seed; 55 56 } ready_rng; 56 } kernelTLS__attribute__ ((tls_model ( "initial-exec" )));57 } __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" ))); 57 58 59 extern bool __preemption_enabled(); 58 60 61 static inline KernelThreadData & kernelTLS( void ) { 62 /* paranoid */ verify( ! __preemption_enabled() ); 63 return __cfaabi_tls; 64 } 65 66 extern uintptr_t __cfatls_get( unsigned long int member ); 67 // #define publicTLS_get( member ) ((typeof(__cfaabi_tls.member))__cfatls_get( __builtin_offsetof(KernelThreadData, member) )) 68 #define publicTLS_get( member ) (__cfaabi_tls.member) 69 // extern forall(otype T) T __cfatls_get( T * member, T value ); 70 // #define publicTLS_set( member, value ) __cfatls_set( (typeof(member)*)__builtin_offsetof(KernelThreadData, member), value ); 59 71 60 72 static inline uint64_t __tls_rand() { 61 73 #if defined(__SIZEOF_INT128__) 62 return __lehmer64( kernelTLS .rand_seed );74 return __lehmer64( kernelTLS().rand_seed ); 63 75 #else 64 return __xorshift64( kernelTLS .rand_seed );76 return __xorshift64( kernelTLS().rand_seed ); 65 77 #endif 66 78 } … … 74 86 static inline unsigned __tls_rand_fwd() { 75 87 76 kernelTLS .ready_rng.fwd_seed = (A * kernelTLS.ready_rng.fwd_seed + C) & (M - 1);77 return kernelTLS .ready_rng.fwd_seed >> D;88 kernelTLS().ready_rng.fwd_seed = (A * kernelTLS().ready_rng.fwd_seed + C) & (M - 1); 89 return kernelTLS().ready_rng.fwd_seed >> D; 78 90 } 79 91 80 92 static inline unsigned __tls_rand_bck() { 81 unsigned int r = kernelTLS .ready_rng.bck_seed >> D;82 kernelTLS .ready_rng.bck_seed = AI * (kernelTLS.ready_rng.bck_seed - C) & (M - 1);93 unsigned int r = kernelTLS().ready_rng.bck_seed >> D; 94 kernelTLS().ready_rng.bck_seed = AI * (kernelTLS().ready_rng.bck_seed - C) & (M - 1); 83 95 return r; 84 96 } … … 91 103 92 104 static inline void __tls_rand_advance_bck(void) { 93 kernelTLS .ready_rng.bck_seed = kernelTLS.ready_rng.fwd_seed;105 kernelTLS().ready_rng.bck_seed = kernelTLS().ready_rng.fwd_seed; 94 106 } 95 107 } 96 108 97 #if 0 // def __ARM_ARCH98 // function prototypes are only really used by these macros on ARM99 void disable_global_interrupts();100 void enable_global_interrupts();101 109 102 #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \103 disable_global_interrupts(); \104 target = kernelTLS.member; \105 enable_global_interrupts(); \106 target; } )107 #define TL_SET( member, value ) disable_global_interrupts(); \108 kernelTLS.member = value; \109 enable_global_interrupts();110 #else111 #define TL_GET( member ) kernelTLS.member112 #define TL_SET( member, value ) kernelTLS.member = value;113 #endif114 110 115 111 extern void disable_interrupts(); … … 120 116 extern void park( void ); 121 117 extern void unpark( struct $thread * this ); 122 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 118 static inline struct $thread * active_thread () { 119 struct $thread * t = publicTLS_get( this_thread ); 120 /* paranoid */ verify( t ); 121 return t; 122 } 123 123 124 124 extern bool force_yield( enum __Preemption_Reason ); … … 139 139 #if !defined(__CFA_NO_STATISTICS__) 140 140 static inline struct __stats_t * __tls_stats() { 141 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);142 /* paranoid */ verify( kernelTLS .this_stats );143 return kernelTLS .this_stats;141 /* paranoid */ verify( ! __preemption_enabled() ); 142 /* paranoid */ verify( kernelTLS().this_stats ); 143 return kernelTLS().this_stats; 144 144 } 145 145 -
libcfa/src/concurrency/kernel/startup.cfa
r55acc3a r139775e 118 118 //----------------------------------------------------------------------------- 119 119 // Global state 120 thread_local struct KernelThreadData kernelTLS__attribute__ ((tls_model ( "initial-exec" ))) @= {120 thread_local struct KernelThreadData __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" ))) @= { 121 121 NULL, // cannot use 0p 122 NULL, 122 123 NULL, 123 124 NULL, … … 155 156 // Kernel boot procedures 156 157 static void __kernel_startup(void) { 157 verify( ! kernelTLS.preemption_state.enabled);158 /* paranoid */ verify( ! __preemption_enabled() ); 158 159 __cfadbg_print_safe(runtime_core, "Kernel : Starting\n"); 159 160 … … 211 212 212 213 //initialize the global state variables 213 kernelTLS.this_processor = mainProcessor; 214 kernelTLS.this_thread = mainThread; 214 __cfaabi_tls.this_processor = mainProcessor; 215 __cfaabi_tls.this_proc_id = (__processor_id_t*)mainProcessor; 216 __cfaabi_tls.this_thread = mainThread; 215 217 216 218 #if !defined( __CFA_NO_STATISTICS__ ) 217 kernelTLS.this_stats = (__stats_t *)& storage_mainProcStats;218 __init_stats( kernelTLS.this_stats );219 __cfaabi_tls.this_stats = (__stats_t *)& storage_mainProcStats; 220 __init_stats( __cfaabi_tls.this_stats ); 219 221 #endif 220 222 … … 227 229 // Add the main thread to the ready queue 228 230 // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread 229 __schedule_thread( (__processor_id_t *)mainProcessor,mainThread);231 __schedule_thread(mainThread); 230 232 231 233 // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX 232 234 // context. Hence, the main thread does not begin through __cfactx_invoke_thread, like all other threads. The trick here is that 233 235 // mainThread is on the ready queue when this call is made. 234 __kernel_first_resume( kernelTLS.this_processor );236 __kernel_first_resume( __cfaabi_tls.this_processor ); 235 237 236 238 … … 249 251 __cfadbg_print_safe(runtime_core, "Kernel : Started\n--------------------------------------------------\n\n"); 250 252 251 verify( ! kernelTLS.preemption_state.enabled);253 /* paranoid */ verify( ! __preemption_enabled() ); 252 254 enable_interrupts( __cfaabi_dbg_ctx ); 253 verify( TL_GET( preemption_state.enabled ) ); 255 /* paranoid */ verify( __preemption_enabled() ); 256 254 257 } 255 258 … … 260 263 mainCluster->io.ctxs = 0p; 261 264 262 /* paranoid */ verify( TL_GET( preemption_state.enabled) );265 /* paranoid */ verify( __preemption_enabled() ); 263 266 disable_interrupts(); 264 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled);267 /* paranoid */ verify( ! __preemption_enabled() ); 265 268 266 269 __cfadbg_print_safe(runtime_core, "\n--------------------------------------------------\nKernel : Shutting down\n"); … … 270 273 // which is currently here 271 274 __atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE); 272 __kernel_last_resume( kernelTLS.this_processor );275 __kernel_last_resume( __cfaabi_tls.this_processor ); 273 276 mainThread->self_cor.state = Halted; 274 277 … … 319 322 __stats_t local_stats; 320 323 __init_stats( &local_stats ); 321 kernelTLS.this_stats = &local_stats;324 __cfaabi_tls.this_stats = &local_stats; 322 325 #endif 323 326 324 327 processor * proc = (processor *) arg; 325 kernelTLS.this_processor = proc; 326 kernelTLS.this_thread = 0p; 327 kernelTLS.preemption_state.[enabled, disable_count] = [false, 1]; 328 __cfaabi_tls.this_processor = proc; 329 __cfaabi_tls.this_proc_id = (__processor_id_t*)proc; 330 __cfaabi_tls.this_thread = 0p; 331 __cfaabi_tls.preemption_state.[enabled, disable_count] = [false, 1]; 328 332 // SKULLDUGGERY: We want to create a context for the processor coroutine 329 333 // which is needed for the 2-step context switch. However, there is no reason … … 337 341 338 342 //Set global state 339 kernelTLS.this_thread = 0p;343 __cfaabi_tls.this_thread = 0p; 340 344 341 345 //We now have a proper context from which to schedule threads … … 367 371 $coroutine * dst = get_coroutine(this->runner); 368 372 369 verify( ! kernelTLS.preemption_state.enabled);370 371 kernelTLS.this_thread->curr_cor = dst;373 /* paranoid */ verify( ! __preemption_enabled() ); 374 375 __cfaabi_tls.this_thread->curr_cor = dst; 372 376 __stack_prepare( &dst->stack, 65000 ); 373 377 __cfactx_start(main, dst, this->runner, __cfactx_invoke_coroutine); 374 378 375 verify( ! kernelTLS.preemption_state.enabled);379 /* paranoid */ verify( ! __preemption_enabled() ); 376 380 377 381 dst->last = &src->self_cor; … … 391 395 /* paranoid */ verify(src->state == Active); 392 396 393 verify( ! kernelTLS.preemption_state.enabled);397 /* paranoid */ verify( ! __preemption_enabled() ); 394 398 } 395 399 … … 399 403 $coroutine * dst = get_coroutine(this->runner); 400 404 401 verify( ! kernelTLS.preemption_state.enabled);402 verify( dst->starter == src );403 verify( dst->context.SP );405 /* paranoid */ verify( ! __preemption_enabled() ); 406 /* paranoid */ verify( dst->starter == src ); 407 /* paranoid */ verify( dst->context.SP ); 404 408 405 409 // SKULLDUGGERY in debug the processors check that the … … 543 547 544 548 P( terminated ); 545 verify( kernelTLS.this_processor!= &this);549 /* paranoid */ verify( active_processor() != &this); 546 550 } 547 551 … … 693 697 #if defined(__CFA_WITH_VERIFY__) 694 698 static bool verify_fwd_bck_rng(void) { 695 kernelTLS.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&verify_fwd_bck_rng);699 __cfaabi_tls.ready_rng.fwd_seed = 25214903917_l64u * (rdtscl() ^ (uintptr_t)&verify_fwd_bck_rng); 696 700 697 701 unsigned values[10];
Note:
See TracChangeset
for help on using the changeset viewer.