Changeset 2a84d06d for src/libcfa/concurrency
- Timestamp:
- Mar 27, 2018, 5:22:58 PM (6 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:
- 43725bd
- Parents:
- af1ed1ad
- Location:
- src/libcfa/concurrency
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/alarm.c
raf1ed1ad r2a84d06d 10 10 // Created On : Fri Jun 2 11:31:25 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 21 22:35:18 201713 // Update Count : 112 // Last Modified On : Tue Mar 27 14:12:11 2018 13 // Update Count : 41 14 14 // 15 15 … … 27 27 28 28 29 static inline void ?{}( itimerval & this, __cfa_time_t * alarm ) with( this ) { 30 it_value.tv_sec = alarm->val / (1`cfa_s).val; // seconds 31 it_value.tv_usec = max( (alarm->val % (1`cfa_s).val) / (1`cfa_us).val, 1000 ); // microseconds 32 it_interval.tv_sec = 0; 33 it_interval.tv_usec = 0; 34 } 35 36 static inline void ?{}( __cfa_time_t & this, timespec * curr ) { 37 uint64_t secs = curr->tv_sec; 38 uint64_t nsecs = curr->tv_nsec; 39 this.val = from_s(secs).val + nsecs; 29 static inline void ?{}( itimerval & this, Duration alarm ) with( this ) { 30 it_value { alarm }; // seconds, microseconds 31 it_interval{ 0 }; 40 32 } 41 33 … … 44 36 //============================================================================================= 45 37 46 __cfa_time_t__kernel_get_time() {38 Time __kernel_get_time() { 47 39 timespec curr; 48 clock_gettime( CLOCK_ REALTIME, &curr );49 return ( __cfa_time_t){ &curr };40 clock_gettime( CLOCK_MONOTONIC_RAW, &curr ); // CLOCK_REALTIME 41 return (Time){ curr }; 50 42 } 51 43 52 void __kernel_set_timer( __cfa_time_t alarm ) { 53 itimerval val = { &alarm }; 54 setitimer( ITIMER_REAL, &val, NULL ); 44 void __kernel_set_timer( Duration alarm ) { 45 setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL ); 55 46 } 56 47 … … 59 50 //============================================================================================= 60 51 61 void ?{}( alarm_node_t & this, thread_desc * thrd, __cfa_time_t alarm = 0`cfa_s, __cfa_time_t period = 0`cfa_s) with( this ) {52 void ?{}( alarm_node_t & this, thread_desc * thrd, Time alarm, Duration period ) with( this ) { 62 53 this.thrd = thrd; 63 54 this.alarm = alarm; … … 68 59 } 69 60 70 void ?{}( alarm_node_t & this, processor * proc, __cfa_time_t alarm = 0`cfa_s, __cfa_time_t period = 0`cfa_s) with( this ) {61 void ?{}( alarm_node_t & this, processor * proc, Time alarm, Duration period ) with( this ) { 71 62 this.proc = proc; 72 63 this.alarm = alarm; -
src/libcfa/concurrency/alarm.h
raf1ed1ad r2a84d06d 10 10 // Created On : Fri Jun 2 11:31:25 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:59:27 201713 // Update Count : 312 // Last Modified On : Mon Mar 26 16:25:41 2018 13 // Update Count : 11 14 14 // 15 15 … … 21 21 #include <assert.h> 22 22 23 #include " bits/cfatime.h"23 #include "time" 24 24 25 25 struct thread_desc; … … 30 30 //============================================================================================= 31 31 32 __cfa_time_t__kernel_get_time();33 void __kernel_set_timer( __cfa_time_talarm );32 Time __kernel_get_time(); 33 void __kernel_set_timer( Duration alarm ); 34 34 35 35 //============================================================================================= … … 38 38 39 39 struct alarm_node_t { 40 __cfa_time_t alarm;// time when alarm goes off41 __cfa_time_t period;// if > 0 => period of alarm40 Time alarm; // time when alarm goes off 41 Duration period; // if > 0 => period of alarm 42 42 alarm_node_t * next; // intrusive link list field 43 43 … … 53 53 typedef alarm_node_t ** __alarm_it_t; 54 54 55 void ?{}( alarm_node_t & this, thread_desc * thrd, __cfa_time_t alarm = 0`cfa_s, __cfa_time_t period = 0`cfa_s);56 void ?{}( alarm_node_t & this, processor * proc, __cfa_time_t alarm = 0`cfa_s, __cfa_time_t period = 0`cfa_s);55 void ?{}( alarm_node_t & this, thread_desc * thrd, Time alarm, Duration period ); 56 void ?{}( alarm_node_t & this, processor * proc, Time alarm, Duration period ); 57 57 void ^?{}( alarm_node_t & this ); 58 58 -
src/libcfa/concurrency/kernel
raf1ed1ad r2a84d06d 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:58:39 201713 // Update Count : 212 // Last Modified On : Fri Mar 23 17:08:20 2018 13 // Update Count : 3 14 14 // 15 15 … … 19 19 20 20 #include "invoke.h" 21 #include " bits/cfatime.h"21 #include "time" 22 22 23 23 extern "C" { … … 49 49 50 50 // Preemption rate on this cluster 51 __cfa_time_tpreemption_rate;51 Duration preemption_rate; 52 52 }; 53 53 54 extern __cfa_time_tdefault_preemption();54 extern Duration default_preemption(); 55 55 56 56 void ?{} (cluster & this); -
src/libcfa/concurrency/preemption.c
raf1ed1ad r2a84d06d 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 9 16:38:13201813 // Update Count : 1412 // Last Modified On : Tue Mar 27 11:28:51 2018 13 // Update Count : 24 14 14 // 15 15 … … 27 27 28 28 #if !defined(__CFA_DEFAULT_PREEMPTION__) 29 #define __CFA_DEFAULT_PREEMPTION__ 10` cfa_ms29 #define __CFA_DEFAULT_PREEMPTION__ 10`ms 30 30 #endif 31 31 32 __cfa_time_tdefault_preemption() __attribute__((weak)) {32 Duration default_preemption() __attribute__((weak)) { 33 33 return __CFA_DEFAULT_PREEMPTION__; 34 34 } … … 78 78 79 79 // Get next expired node 80 static inline alarm_node_t * get_expired( alarm_list_t * alarms, __cfa_time_tcurrtime ) {80 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) { 81 81 if( !alarms->head ) return NULL; // If no alarms return null 82 82 if( alarms->head->alarm >= currtime ) return NULL; // If alarms head not expired return null … … 88 88 alarm_node_t * node = NULL; // Used in the while loop but cannot be declared in the while condition 89 89 alarm_list_t * alarms = &event_kernel->alarms; // Local copy for ease of reading 90 __cfa_time_t currtime = __kernel_get_time();// Check current time once so we everything "happens at once"90 Time currtime = __kernel_get_time(); // Check current time once so we everything "happens at once" 91 91 92 92 //Loop throught every thing expired … … 102 102 103 103 // Check if this is a periodic alarm 104 __cfa_time_tperiod = node->period;104 Duration period = node->period; 105 105 if( period > 0 ) { 106 106 node->alarm = currtime + period; // Alarm is periodic, add currtime to it (used cached current time) … … 117 117 118 118 // Update the preemption of a processor and notify interested parties 119 void update_preemption( processor * this, __cfa_time_tduration ) {119 void update_preemption( processor * this, Duration duration ) { 120 120 alarm_node_t * alarm = this->preemption_alarm; 121 121 122 122 // Alarms need to be enabled 123 if ( duration > 0 && ! alarm->set ) {123 if ( duration > 0 && ! alarm->set ) { 124 124 alarm->alarm = __kernel_get_time() + duration; 125 125 alarm->period = duration; … … 291 291 // Used by thread to control when they want to receive preemption signals 292 292 void ?{}( preemption_scope & this, processor * proc ) { 293 (this.alarm){ proc, 0`cfa_s, 0`cfa_s };293 (this.alarm){ proc, (Time){ 0 }, 0`s }; 294 294 this.proc = proc; 295 295 this.proc->preemption_alarm = &this.alarm; … … 301 301 disable_interrupts(); 302 302 303 update_preemption( this.proc, 0` cfa_s );303 update_preemption( this.proc, 0`s ); 304 304 } 305 305 -
src/libcfa/concurrency/preemption.h
raf1ed1ad r2a84d06d 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 21 22:34:25 201713 // Update Count : 112 // Last Modified On : Fri Mar 23 17:18:53 2018 13 // Update Count : 2 14 14 // 15 15 … … 21 21 void kernel_start_preemption(); 22 22 void kernel_stop_preemption(); 23 void update_preemption( processor * this, __cfa_time_tduration );23 void update_preemption( processor * this, Duration duration ); 24 24 void tick_preemption(); 25 25
Note: See TracChangeset
for help on using the changeset viewer.