- Timestamp:
- May 22, 2018, 4:46:29 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 59c034c6, d807ca28
- Parents:
- a8706fc (diff), a1a17a74 (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:
- src/libcfa
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/bits/containers.h
ra8706fc r2c88368 220 220 } 221 221 222 #define _next .0223 #define _prev .1222 #define next 0 223 #define prev 1 224 224 forall(dtype T | sized(T)) 225 225 static inline void push_front( __dllist(T) & this, T & node ) with( this ) { 226 verify(__get); 226 227 if ( head ) { 227 __get( node ) _next = head;228 __get( node ) _prev = __get( *head )_prev;228 __get( node ).next = head; 229 __get( node ).prev = __get( *head ).prev; 229 230 // inserted node must be consistent before it is seen 230 231 // prevent code movement across barrier 231 232 asm( "" : : : "memory" ); 232 __get( *head ) _prev = &node;233 T & prev = *__get( node )_prev;234 __get( prev )_next = &node;233 __get( *head ).prev = &node; 234 T & _prev = *__get( node ).prev; 235 __get( _prev ).next = &node; 235 236 } 236 237 else { 237 __get( node ) _next = &node;238 __get( node ) _prev = &node;238 __get( node ).next = &node; 239 __get( node ).prev = &node; 239 240 } 240 241 … … 246 247 forall(dtype T | sized(T)) 247 248 static inline void remove( __dllist(T) & this, T & node ) with( this ) { 249 verify(__get); 248 250 if ( &node == head ) { 249 if ( __get( *head ) _next == head ) {251 if ( __get( *head ).next == head ) { 250 252 head = NULL; 251 253 } 252 254 else { 253 head = __get( *head ) _next;255 head = __get( *head ).next; 254 256 } 255 257 } 256 __get( *__get( node ) _next )_prev = __get( node )_prev;257 __get( *__get( node ) _prev )_next = __get( node )_next;258 __get( node ) _next = NULL;259 __get( node ) _prev = NULL;260 } 261 #undef _next262 #undef _prev258 __get( *__get( node ).next ).prev = __get( node ).prev; 259 __get( *__get( node ).prev ).next = __get( node ).next; 260 __get( node ).next = NULL; 261 __get( node ).prev = NULL; 262 } 263 #undef next 264 #undef prev 263 265 #endif 264 266 -
src/libcfa/concurrency/alarm.c
ra8706fc r2c88368 37 37 38 38 void __kernel_set_timer( Duration alarm ) { 39 verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%luns)", alarm.tv); 39 40 setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL ); 40 41 } … … 68 69 } 69 70 70 __cfaabi_dbg_debug_do( bool validate( alarm_list_t * this ) { 71 #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__)) 72 bool validate( alarm_list_t * this ) { 71 73 alarm_node_t ** it = &this->head; 72 74 while( (*it) ) { … … 75 77 76 78 return it == this->tail; 77 }) 79 } 80 #endif 78 81 79 82 static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) { -
src/libcfa/concurrency/kernel
ra8706fc r2c88368 145 145 __dllist_t(struct processor) idles; 146 146 147 // List of processors 148 __spinlock_t thread_list_lock; 149 __dllist_t(struct thread_desc) threads; 150 147 151 // Link lists fields 148 152 struct { -
src/libcfa/concurrency/kernel.c
ra8706fc r2c88368 49 49 thread_desc * mainThread; 50 50 51 struct { __dllist_t(thread_desc) list; __spinlock_t lock; } global_threads ;52 51 struct { __dllist_t(cluster ) list; __spinlock_t lock; } global_clusters; 53 52 54 53 //----------------------------------------------------------------------------- 55 54 // Global state 56 57 // volatile thread_local bool preemption_in_progress = 0;58 // volatile thread_local bool preemption_enabled = false;59 // volatile thread_local unsigned short disable_preempt_count = 1;60 61 55 thread_local struct KernelThreadData kernelTLS = { 62 56 NULL, … … 123 117 node.next = NULL; 124 118 node.prev = NULL; 125 doregister( this);119 doregister(curr_cluster, this); 126 120 127 121 monitors{ &self_mon_p, 1, (fptr_t)0 }; … … 172 166 procs{ __get }; 173 167 idles{ __get }; 168 threads{ __get }; 174 169 175 170 doregister(this); … … 523 518 __cfaabi_dbg_print_safe("Kernel : Starting\n"); 524 519 525 global_threads. list{ __get };526 global_threads. lock{};527 520 global_clusters.list{ __get }; 528 521 global_clusters.lock{}; … … 624 617 ^(mainThread){}; 625 618 619 ^(global_clusters.list){}; 620 ^(global_clusters.lock){}; 621 626 622 __cfaabi_dbg_print_safe("Kernel : Shutdown complete\n"); 627 623 } … … 697 693 else { 698 694 int len = snprintf( abort_text, abort_text_size, "Error occurred outside of any thread.\n" ); 695 __cfaabi_dbg_bits_write( abort_text, len ); 699 696 } 700 697 } … … 760 757 //----------------------------------------------------------------------------- 761 758 // Global Queues 762 void doregister( thread_desc & thrd ) {763 // lock ( global_thread.lock );764 // push_front( global_thread.list, thrd );765 // unlock ( global_thread.lock );766 }767 768 void unregister( thread_desc & thrd ) {769 // lock ( global_thread.lock );770 // remove( global_thread.list, thrd );771 // unlock( global_thread.lock );772 }773 774 759 void doregister( cluster & cltr ) { 775 // lock ( global_cluster.lock);776 // push_front( global_cluster.list, cltr );777 // unlock ( global_cluster.lock );760 lock ( global_clusters.lock __cfaabi_dbg_ctx2); 761 push_front( global_clusters.list, cltr ); 762 unlock ( global_clusters.lock ); 778 763 } 779 764 780 765 void unregister( cluster & cltr ) { 781 // lock ( global_cluster.lock ); 782 // remove( global_cluster.list, cltr ); 783 // unlock( global_cluster.lock ); 784 } 785 766 lock ( global_clusters.lock __cfaabi_dbg_ctx2); 767 remove( global_clusters.list, cltr ); 768 unlock( global_clusters.lock ); 769 } 770 771 void doregister( cluster * cltr, thread_desc & thrd ) { 772 lock (cltr->thread_list_lock __cfaabi_dbg_ctx2); 773 push_front(cltr->threads, thrd); 774 unlock (cltr->thread_list_lock); 775 } 776 777 void unregister( cluster * cltr, thread_desc & thrd ) { 778 lock (cltr->thread_list_lock __cfaabi_dbg_ctx2); 779 remove(cltr->threads, thrd ); 780 unlock(cltr->thread_list_lock); 781 } 786 782 787 783 void doregister( cluster * cltr, processor * proc ) { 788 //lock (cltr->proc_list_lock __cfaabi_dbg_ctx2);789 //push_front(cltr->procs, *proc);790 //unlock (cltr->proc_list_lock);784 lock (cltr->proc_list_lock __cfaabi_dbg_ctx2); 785 push_front(cltr->procs, *proc); 786 unlock (cltr->proc_list_lock); 791 787 } 792 788 793 789 void unregister( cluster * cltr, processor * proc ) { 794 //lock (cltr->proc_list_lock __cfaabi_dbg_ctx2);795 //remove(cltr->procs, *proc );796 //unlock(cltr->proc_list_lock);790 lock (cltr->proc_list_lock __cfaabi_dbg_ctx2); 791 remove(cltr->procs, *proc ); 792 unlock(cltr->proc_list_lock); 797 793 } 798 794 -
src/libcfa/concurrency/kernel_private.h
ra8706fc r2c88368 101 101 102 102 103 void doregister( struct thread_desc & thrd);104 void unregister( struct thread_desc & thrd);103 void doregister( struct cluster & cltr ); 104 void unregister( struct cluster & cltr ); 105 105 106 void doregister( struct cluster & cltr);107 void unregister( struct cluster & cltr);106 void doregister( struct cluster * cltr, struct thread_desc & thrd ); 107 void unregister( struct cluster * cltr, struct thread_desc & thrd ); 108 108 109 109 void doregister( struct cluster * cltr, struct processor * proc ); -
src/libcfa/concurrency/preemption.c
ra8706fc r2c88368 15 15 16 16 #include "preemption.h" 17 #include <assert.h> 17 18 18 19 extern "C" { … … 91 92 //Loop throught every thing expired 92 93 while( node = get_expired( alarms, currtime ) ) { 94 // __cfaabi_dbg_print_buffer_decl( " KERNEL: preemption tick.\n" ); 93 95 94 96 // Check if this is a kernel … … 103 105 Duration period = node->period; 104 106 if( period > 0 ) { 107 // __cfaabi_dbg_print_buffer_local( " KERNEL: alarm period is %lu.\n", period.tv ); 105 108 node->alarm = currtime + period; // Alarm is periodic, add currtime to it (used cached current time) 106 109 insert( alarms, node ); // Reinsert the node for the next time it triggers … … 112 115 113 116 // If there are still alarms pending, reset the timer 114 if( alarms->head ) { __kernel_set_timer( alarms->head->alarm - currtime ); } 117 if( alarms->head ) { 118 __cfaabi_dbg_print_buffer_decl( " KERNEL: @%lu(%lu) resetting alarm to %lu.\n", currtime.tv, __kernel_get_time().tv, (alarms->head->alarm - currtime).tv); 119 Duration delta = alarms->head->alarm - currtime; 120 Duration caped = max(delta, 50`us); 121 // itimerval tim = { caped }; 122 // __cfaabi_dbg_print_buffer_local( " Values are %lu, %lu, %lu %lu.\n", delta.tv, caped.tv, tim.it_value.tv_sec, tim.it_value.tv_usec); 123 124 __kernel_set_timer( caped ); 125 } 115 126 } 116 127 … … 335 346 if( !preemption_ready() ) { return; } 336 347 337 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p ).\n", kernelTLS.this_processor, kernelTLS.this_thread);348 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p @ %p).\n", kernelTLS.this_processor, kernelTLS.this_thread, (void *)(cxt->uc_mcontext.CFA_REG_IP) ); 338 349 339 350 // Sync flag : prevent recursive calls to the signal handler 340 351 kernelTLS.preemption_state.in_progress = true; 341 352 342 // We are about to CtxSwitch out of the signal handler, let other handlers in 343 signal_unblock( SIGUSR1 ); 353 // Clear sighandler mask before context switching. 354 static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" ); 355 if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL ) == -1 ) { 356 abort( "internal error, sigprocmask" ); 357 } 344 358 345 359 // TODO: this should go in finish action … … 377 391 case EAGAIN : 378 392 case EINTR : 393 {__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );} 379 394 continue; 380 395 case EINVAL : … … 424 439 sigset_t oldset; 425 440 int ret; 426 ret = sigprocmask(0, NULL, &oldset);441 ret = pthread_sigmask(0, NULL, &oldset); 427 442 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 428 443 429 444 ret = sigismember(&oldset, SIGUSR1); 430 445 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 431 432 446 if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); } 447 448 ret = sigismember(&oldset, SIGALRM); 449 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 450 if(ret == 0) { abort("ERROR SIGALRM is enabled"); } 451 452 ret = sigismember(&oldset, SIGTERM); 453 if(ret < 0) { abort("ERROR sigismember returned %d", ret); } 454 if(ret == 1) { abort("ERROR SIGTERM is disabled"); } 433 455 } 434 456 -
src/libcfa/concurrency/thread.c
ra8706fc r2c88368 42 42 node.next = NULL; 43 43 node.prev = NULL; 44 doregister( this);44 doregister(curr_cluster, this); 45 45 46 46 monitors{ &self_mon_p, 1, (fptr_t)0 }; … … 48 48 49 49 void ^?{}(thread_desc& this) with( this ) { 50 unregister( this);50 unregister(curr_cluster, this); 51 51 ^self_cor{}; 52 52 } -
src/libcfa/time
ra8706fc r2c88368 1 // 1 // 2 2 // Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo 3 3 // 4 4 // The contents of this file are covered under the licence agreement in the 5 5 // file "LICENCE" distributed with Cforall. 6 // 7 // time -- 8 // 6 // 7 // time -- 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Wed Mar 14 23:18:57 2018 … … 12 12 // Last Modified On : Sat Apr 14 17:48:23 2018 13 13 // Update Count : 636 14 // 14 // 15 15 16 16 #pragma once … … 91 91 static inline int64_t ?`w( Duration dur ) { return dur.tv / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); } 92 92 93 static inline Duration max( Duration lhs, Duration rhs ) { return (lhs.tv < rhs.tv) ? rhs : lhs;} 94 static inline Duration min( Duration lhs, Duration rhs ) { return !(rhs.tv < lhs.tv) ? lhs : rhs;} 95 93 96 94 97 //######################### C timeval #########################
Note: See TracChangeset
for help on using the changeset viewer.