- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/alarm.cfa
rd3ab183 r2d8f7b0 51 51 this.alarm = alarm; 52 52 this.period = period; 53 next = 0; 53 54 set = false; 54 55 kernel_alarm = false; … … 59 60 this.alarm = alarm; 60 61 this.period = period; 62 next = 0; 61 63 set = false; 62 64 kernel_alarm = true; … … 69 71 } 70 72 71 void insert( alarm_list_t * this, alarm_node_t * n ) { 72 alarm_node_t * it = & (*this)`first; 73 while( it && (n->alarm > it->alarm) ) { 74 it = & (*it)`next; 75 } 76 if ( it ) { 77 insert_before( *it, *n ); 78 } else { 79 insert_last(*this, *n); 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; 80 78 } 81 79 82 verify( validate( *this ) ); 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 ) ); 83 106 } 84 107 85 108 alarm_node_t * pop( alarm_list_t * this ) { 86 verify( validate( *this ) ); 87 alarm_node_t * head = & (*this)`first; 109 alarm_node_t * head = this->head; 88 110 if( head ) { 89 remove(*head); 111 this->head = head->next; 112 if( !head->next ) { 113 this->tail = &this->head; 114 } 115 head->next = 0p; 90 116 } 91 verify( validate( *this ) );117 verify( validate( this ) ); 92 118 return head; 93 119 } 94 120 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 95 147 void register_self( alarm_node_t * this ) { 96 alarm_list_t & alarms =event_kernel->alarms;148 alarm_list_t * alarms = &event_kernel->alarms; 97 149 98 150 disable_interrupts(); … … 100 152 { 101 153 verify( validate( alarms ) ); 102 bool first = ! & alarms`first;154 bool first = !alarms->head; 103 155 104 insert( &alarms, this );156 insert( alarms, this ); 105 157 if( first ) { 106 __kernel_set_timer( alarms `first.alarm - __kernel_get_time() );158 __kernel_set_timer( alarms->head->alarm - __kernel_get_time() ); 107 159 } 108 160 } … … 116 168 lock( event_kernel->lock __cfaabi_dbg_ctx2 ); 117 169 { 118 verify( validate( event_kernel->alarms ) );119 remove( *this );170 verify( validate( &event_kernel->alarms ) ); 171 remove( &event_kernel->alarms, this ); 120 172 } 121 173 unlock( event_kernel->lock ); … … 135 187 136 188 /* paranoid */ verify( !node.set ); 137 /* paranoid */ verify( & node`next == 0p ); 138 /* paranoid */ verify( & node`prev == 0p ); 189 /* paranoid */ verify( node.next == 0p ); 139 190 } 140 191
Note: See TracChangeset
for help on using the changeset viewer.