Changeset d3ab183 for libcfa/src/concurrency/alarm.cfa
- Timestamp:
- May 4, 2020, 8:59:09 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 08a994e, f90d10f
- Parents:
- 4d741e9
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/alarm.cfa
r4d741e9 rd3ab183 51 51 this.alarm = alarm; 52 52 this.period = period; 53 next = 0;54 53 set = false; 55 54 kernel_alarm = false; … … 60 59 this.alarm = alarm; 61 60 this.period = period; 62 next = 0;63 61 set = false; 64 62 kernel_alarm = true; … … 71 69 } 72 70 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; 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); 78 80 } 79 81 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 ) ); 82 verify( validate( *this ) ); 106 83 } 107 84 108 85 alarm_node_t * pop( alarm_list_t * this ) { 109 alarm_node_t * head = this->head; 86 verify( validate( *this ) ); 87 alarm_node_t * head = & (*this)`first; 110 88 if( head ) { 111 this->head = head->next; 112 if( !head->next ) { 113 this->tail = &this->head; 114 } 115 head->next = 0p; 89 remove(*head); 116 90 } 117 verify( validate( this ) );91 verify( validate( *this ) ); 118 92 return head; 119 93 } 120 94 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 95 void register_self( alarm_node_t * this ) { 148 alarm_list_t * alarms = &event_kernel->alarms;96 alarm_list_t & alarms = event_kernel->alarms; 149 97 150 98 disable_interrupts(); … … 152 100 { 153 101 verify( validate( alarms ) ); 154 bool first = ! alarms->head;102 bool first = ! & alarms`first; 155 103 156 insert( alarms, this );104 insert( &alarms, this ); 157 105 if( first ) { 158 __kernel_set_timer( alarms ->head->alarm - __kernel_get_time() );106 __kernel_set_timer( alarms`first.alarm - __kernel_get_time() ); 159 107 } 160 108 } … … 168 116 lock( event_kernel->lock __cfaabi_dbg_ctx2 ); 169 117 { 170 verify( validate( &event_kernel->alarms ) );171 remove( &event_kernel->alarms,this );118 verify( validate( event_kernel->alarms ) ); 119 remove( *this ); 172 120 } 173 121 unlock( event_kernel->lock ); … … 187 135 188 136 /* paranoid */ verify( !node.set ); 189 /* paranoid */ verify( node.next == 0p ); 137 /* paranoid */ verify( & node`next == 0p ); 138 /* paranoid */ verify( & node`prev == 0p ); 190 139 } 191 140
Note: See TracChangeset
for help on using the changeset viewer.