Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/alarm.cfa

    rd3ab183 r2d8f7b0  
    5151        this.alarm = alarm;
    5252        this.period = period;
     53        next = 0;
    5354        set = false;
    5455        kernel_alarm = false;
     
    5960        this.alarm = alarm;
    6061        this.period = period;
     62        next = 0;
    6163        set = false;
    6264        kernel_alarm = true;
     
    6971}
    7072
    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__))
     74bool validate( alarm_list_t * this ) {
     75        alarm_node_t ** it = &this->head;
     76        while( (*it) ) {
     77                it = &(*it)->next;
    8078        }
    8179
    82         verify( validate( *this ) );
     80        return it == this->tail;
     81}
     82#endif
     83
     84static 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
     97void 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 ) );
    83106}
    84107
    85108alarm_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;
    88110        if( head ) {
    89                 remove(*head);
     111                this->head = head->next;
     112                if( !head->next ) {
     113                        this->tail = &this->head;
     114                }
     115                head->next = 0p;
    90116        }
    91         verify( validate( *this ) );
     117        verify( validate( this ) );
    92118        return head;
    93119}
    94120
     121static 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
     134static 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
    95147void register_self( alarm_node_t * this ) {
    96         alarm_list_t & alarms = event_kernel->alarms;
     148        alarm_list_t * alarms = &event_kernel->alarms;
    97149
    98150        disable_interrupts();
     
    100152        {
    101153                verify( validate( alarms ) );
    102                 bool first = ! & alarms`first;
     154                bool first = !alarms->head;
    103155
    104                 insert( &alarms, this );
     156                insert( alarms, this );
    105157                if( first ) {
    106                         __kernel_set_timer( alarms`first.alarm - __kernel_get_time() );
     158                        __kernel_set_timer( alarms->head->alarm - __kernel_get_time() );
    107159                }
    108160        }
     
    116168        lock( event_kernel->lock __cfaabi_dbg_ctx2 );
    117169        {
    118                 verify( validate( event_kernel->alarms ) );
    119                 remove( *this );
     170                verify( validate( &event_kernel->alarms ) );
     171                remove( &event_kernel->alarms, this );
    120172        }
    121173        unlock( event_kernel->lock );
     
    135187
    136188        /* paranoid */ verify( !node.set );
    137         /* paranoid */ verify( & node`next == 0p );
    138         /* paranoid */ verify( & node`prev == 0p );
     189        /* paranoid */ verify( node.next == 0p );
    139190}
    140191
Note: See TracChangeset for help on using the changeset viewer.