Changes in src/libcfa/concurrency/alarm.c [4aa2fb2:1c273d0]
- File:
-
- 1 edited
-
src/libcfa/concurrency/alarm.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/concurrency/alarm.c
r4aa2fb2 r1c273d0 16 16 17 17 extern "C" { 18 #include <errno.h> 19 #include <stdio.h> 20 #include <string.h> 18 21 #include <time.h> 22 #include <unistd.h> 19 23 #include <sys/time.h> 20 24 } … … 22 26 #include "alarm.h" 23 27 #include "kernel_private.h" 28 #include "libhdr.h" 24 29 #include "preemption.h" 25 30 … … 31 36 timespec curr; 32 37 clock_gettime( CLOCK_REALTIME, &curr ); 33 return ((__cfa_time_t)curr.tv_sec * TIMEGRAN) + curr.tv_nsec; 38 __cfa_time_t curr_time = ((__cfa_time_t)curr.tv_sec * TIMEGRAN) + curr.tv_nsec; 39 LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : current time is %lu\n", curr_time ); 40 return curr_time; 34 41 } 35 42 36 43 void __kernel_set_timer( __cfa_time_t alarm ) { 44 LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : set timer to %lu\n", (__cfa_time_t)alarm ); 37 45 itimerval val; 38 46 val.it_value.tv_sec = alarm / TIMEGRAN; // seconds … … 71 79 } 72 80 81 LIB_DEBUG_DO( bool validate( alarm_list_t * this ) { 82 alarm_node_t ** it = &this->head; 83 while( (*it) ) { 84 it = &(*it)->next; 85 } 86 87 return it == this->tail; 88 }) 89 73 90 static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) { 74 assert( !n->next );91 verify( !n->next ); 75 92 if( p == this->tail ) { 76 93 this->tail = &n->next; … … 80 97 } 81 98 *p = n; 99 100 verify( validate( this ) ); 82 101 } 83 102 … … 89 108 90 109 insert_at( this, n, it ); 110 111 verify( validate( this ) ); 91 112 } 92 113 … … 100 121 head->next = NULL; 101 122 } 123 verify( validate( this ) ); 102 124 return head; 103 125 } … … 105 127 static inline void remove_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t it ) { 106 128 verify( it ); 107 verify( (*it) ->next== n );129 verify( (*it) == n ); 108 130 109 (*it) ->next= n->next;131 (*it) = n->next; 110 132 if( !n-> next ) { 111 133 this->tail = it; 112 134 } 113 135 n->next = NULL; 136 137 verify( validate( this ) ); 114 138 } 115 139 116 140 static inline void remove( alarm_list_t * this, alarm_node_t * n ) { 117 141 alarm_node_t ** it = &this->head; 118 while( (*it) && (*it) ->next!= n ) {142 while( (*it) && (*it) != n ) { 119 143 it = &(*it)->next; 120 144 } 121 145 146 verify( validate( this ) ); 147 122 148 if( *it ) { remove_at( this, n, it ); } 149 150 verify( validate( this ) ); 123 151 } 124 152 125 153 void register_self( alarm_node_t * this ) { 126 154 disable_interrupts(); 127 assert( !systemProcessor->pending_alarm );128 lock( &systemProcessor->alarm_lock );155 verify( !systemProcessor->pending_alarm ); 156 lock( &systemProcessor->alarm_lock, __PRETTY_FUNCTION__ ); 129 157 { 158 verify( validate( &systemProcessor->alarms ) ); 159 bool first = !systemProcessor->alarms.head; 160 130 161 insert( &systemProcessor->alarms, this ); 131 162 if( systemProcessor->pending_alarm ) { 132 163 tick_preemption(); 133 164 } 165 if( first ) { 166 __kernel_set_timer( systemProcessor->alarms.head->alarm - __kernel_get_time() ); 167 } 134 168 } 135 169 unlock( &systemProcessor->alarm_lock ); 136 170 this->set = true; 137 enable_interrupts( );171 enable_interrupts( __PRETTY_FUNCTION__ ); 138 172 } 139 173 140 174 void unregister_self( alarm_node_t * this ) { 175 // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : unregister %p start\n", this ); 141 176 disable_interrupts(); 142 lock( &systemProcessor->alarm_lock ); 143 remove( &systemProcessor->alarms, this ); 177 lock( &systemProcessor->alarm_lock, __PRETTY_FUNCTION__ ); 178 { 179 verify( validate( &systemProcessor->alarms ) ); 180 remove( &systemProcessor->alarms, this ); 181 } 144 182 unlock( &systemProcessor->alarm_lock ); 145 183 disable_interrupts(); 146 184 this->set = false; 185 // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Kernel : unregister %p end\n", this ); 147 186 }
Note:
See TracChangeset
for help on using the changeset viewer.