- File:
-
- 1 edited
-
libcfa/src/concurrency/alarm.cfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/alarm.cfa
re0c235c r4aeaee5 10 10 // Created On : Fri Jun 2 11:31:25 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Jan 5 08:41:36202013 // Update Count : 6912 // Last Modified On : Wed Jun 17 16:11:35 2020 13 // Update Count : 75 14 14 // 15 15 16 16 #define __cforall_thread__ 17 17 18 extern "C" {19 18 #include <errno.h> 20 19 #include <stdio.h> 20 #include <unistd.h> 21 21 #include <string.h> 22 #include <unistd.h>23 22 #include <sys/time.h> 24 }25 23 26 24 #include "alarm.hfa" 27 #include "kernel _private.hfa"25 #include "kernel/fwd.hfa" 28 26 #include "preemption.hfa" 29 27 … … 47 45 //============================================================================================= 48 46 49 void ?{}( alarm_node_t & this, thread_desc * thrd, Time alarm, Duration period) with( this ) {47 void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period) with( this ) { 50 48 this.thrd = thrd; 51 49 this.alarm = alarm; 52 50 this.period = period; 53 next = 0;54 51 set = false; 55 kernel_alarm = false;52 type = User; 56 53 } 57 54 58 void ?{}( alarm_node_t & this, processor * proc, Time alarm, Duration period ) with( this ) {55 void ?{}( alarm_node_t & this, processor * proc, Time alarm, Duration period ) with( this ) { 59 56 this.proc = proc; 60 57 this.alarm = alarm; 61 58 this.period = period; 62 next = 0;63 59 set = false; 64 kernel_alarm = true; 60 type = Kernel; 61 } 62 void ?{}( alarm_node_t & this, Alarm_Callback callback, Time alarm, Duration period ) with( this ) { 63 this.alarm = alarm; 64 this.period = period; 65 this.callback = callback; 66 set = false; 67 type = Callback; 65 68 } 66 69 … … 71 74 } 72 75 73 #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__)) 74 bool validate( alarm_list_t * this ) { 75 alarm_node_t ** it = &this->head; 76 while( (*it) ) { 77 it = &(*it)->next; 76 void insert( alarm_list_t * this, alarm_node_t * n ) { 77 alarm_node_t * it = & (*this)`first; 78 while( it && (n->alarm > it->alarm) ) { 79 it = & (*it)`next; 80 } 81 if ( it ) { 82 insert_before( *it, *n ); 83 } else { 84 insert_last(*this, *n); 78 85 } 79 86 80 return it == this->tail; 81 } 82 #endif 83 84 static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) { 85 verify( !n->next ); 86 if( p == this->tail ) { 87 this->tail = &n->next; 88 } 89 else { 90 n->next = *p; 91 } 92 *p = n; 93 94 verify( validate( this ) ); 95 } 96 97 void insert( alarm_list_t * this, alarm_node_t * n ) { 98 alarm_node_t ** it = &this->head; 99 while( (*it) && (n->alarm > (*it)->alarm) ) { 100 it = &(*it)->next; 101 } 102 103 insert_at( this, n, it ); 104 105 verify( validate( this ) ); 87 verify( validate( *this ) ); 106 88 } 107 89 108 90 alarm_node_t * pop( alarm_list_t * this ) { 109 alarm_node_t * head = this->head; 91 verify( validate( *this ) ); 92 alarm_node_t * head = & (*this)`first; 110 93 if( head ) { 111 this->head = head->next; 112 if( !head->next ) { 113 this->tail = &this->head; 114 } 115 head->next = 0p; 94 remove(*head); 116 95 } 117 verify( validate( this ) );96 verify( validate( *this ) ); 118 97 return head; 119 98 } 120 99 121 static inline void remove_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t it ) {122 verify( it );123 verify( (*it) == n );124 125 (*it) = n->next;126 if( !n-> next ) {127 this->tail = it;128 }129 n->next = 0p;130 131 verify( validate( this ) );132 }133 134 static inline void remove( alarm_list_t * this, alarm_node_t * n ) {135 alarm_node_t ** it = &this->head;136 while( (*it) && (*it) != n ) {137 it = &(*it)->next;138 }139 140 verify( validate( this ) );141 142 if( *it ) { remove_at( this, n, it ); }143 144 verify( validate( this ) );145 }146 147 100 void register_self( alarm_node_t * this ) { 148 alarm_list_t * alarms = &event_kernel->alarms;101 alarm_list_t & alarms = event_kernel->alarms; 149 102 150 103 disable_interrupts(); … … 152 105 { 153 106 verify( validate( alarms ) ); 154 bool first = ! alarms->head;107 bool first = ! & alarms`first; 155 108 156 insert( alarms, this );109 insert( &alarms, this ); 157 110 if( first ) { 158 __kernel_set_timer( alarms ->head->alarm - __kernel_get_time() );111 __kernel_set_timer( alarms`first.alarm - __kernel_get_time() ); 159 112 } 160 113 } … … 168 121 lock( event_kernel->lock __cfaabi_dbg_ctx2 ); 169 122 { 170 verify( validate( &event_kernel->alarms ) );171 remove( &event_kernel->alarms,this );123 verify( validate( event_kernel->alarms ) ); 124 remove( *this ); 172 125 } 173 126 unlock( event_kernel->lock ); … … 176 129 } 177 130 131 //============================================================================================= 132 // Utilities 133 //============================================================================================= 134 135 void sleep( Duration duration ) { 136 alarm_node_t node = { active_thread(), __kernel_get_time() + duration, 0`s }; 137 138 register_self( &node ); 139 park(); 140 141 /* paranoid */ verify( !node.set ); 142 /* paranoid */ verify( & node`next == 0p ); 143 /* paranoid */ verify( & node`prev == 0p ); 144 } 145 178 146 // Local Variables: // 179 147 // mode: c //
Note:
See TracChangeset
for help on using the changeset viewer.