Changes in / [f90d10f:61dd73d]
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/alarm.cfa
rf90d10f r61dd73d 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 -
libcfa/src/concurrency/alarm.hfa
rf90d10f r61dd73d 23 23 #include "time.hfa" 24 24 25 #include <containers/list.hfa>26 27 25 struct $thread; 28 26 struct processor; … … 42 40 Time alarm; // time when alarm goes off 43 41 Duration period; // if > 0 => period of alarm 44 45 DLISTED_MGD_IMPL_IN(alarm_node_t) 42 alarm_node_t * next; // intrusive link list field 46 43 47 44 union { … … 53 50 bool kernel_alarm :1; // true if this is not a user defined alarm 54 51 }; 55 DLISTED_MGD_IMPL_OUT(alarm_node_t) 52 53 typedef alarm_node_t ** __alarm_it_t; 56 54 57 55 void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period ); … … 59 57 void ^?{}( alarm_node_t & this ); 60 58 61 typedef dlist(alarm_node_t, alarm_node_t) alarm_list_t; 59 struct alarm_list_t { 60 alarm_node_t * head; 61 __alarm_it_t tail; 62 }; 63 64 static inline void ?{}( alarm_list_t & this ) with( this ) { 65 head = 0; 66 tail = &head; 67 } 62 68 63 69 void insert( alarm_list_t * this, alarm_node_t * n ); -
libcfa/src/concurrency/io.cfa
rf90d10f r61dd73d 20 20 21 21 #if !defined(HAVE_LINUX_IO_URING_H) 22 void __kernel_io_startup( cluster & , bool) {22 void __kernel_io_startup( cluster & ) { 23 23 // Nothing to do without io_uring 24 24 } 25 25 26 void __kernel_io_ finish_start( cluster & ) {26 void __kernel_io_start_thrd( cluster & ) { 27 27 // Nothing to do without io_uring 28 28 } 29 29 30 void __kernel_io_ prepare_stop( cluster & ) {30 void __kernel_io_stop_thrd ( cluster & ) { 31 31 // Nothing to do without io_uring 32 32 } 33 33 34 void __kernel_io_shutdown( cluster & , bool) {34 void __kernel_io_shutdown( cluster & ) { 35 35 // Nothing to do without io_uring 36 36 } … … 695 695 extern int close(int fd); 696 696 697 struct statx; 698 extern int statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf); 699 697 700 extern ssize_t read (int fd, void *buf, size_t count); 698 701 } … … 904 907 905 908 (*sqe){ IORING_OP_CLOSE, fd }; 909 910 __submit_wait 911 #endif 912 } 913 914 int cfa_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf) { 915 #if !defined(HAVE_LINUX_IO_URING_H) || !defined(IORING_OP_STATX) 916 //return statx( dirfd, pathname, flags, mask, statxbuf ); 917 return syscall( __NR_statx, dirfd, pathname, flags, mask, statxbuf ); 918 #else 919 __submit_prelude 920 921 (*sqe){ IORING_OP_STATX, dirfd }; 922 sqe->addr = (uint64_t)pathname; 923 sqe->statx_flags = flags; 924 sqe->len = mask; 925 sqe->off = (uint64_t)statxbuf; 906 926 907 927 __submit_wait … … 1020 1040 return IS_DEFINED(IORING_OP_CLOSE); 1021 1041 1042 if( /*func == (fptr_t)statx || */ 1043 func == (fptr_t)cfa_statx ) 1044 #define _CFA_IO_FEATURE_IORING_OP_STATX , 1045 return IS_DEFINED(IORING_OP_STATX); 1046 1022 1047 if( /*func == (fptr_t)read || */ 1023 1048 func == (fptr_t)cfa_read ) -
libcfa/src/concurrency/preemption.cfa
rf90d10f r61dd73d 84 84 // Get next expired node 85 85 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) { 86 if( ! & (*alarms)`first) return 0p; // If no alarms return null87 if( (*alarms)`first.alarm >= currtime ) return 0p; // If alarms head not expired return null86 if( !alarms->head ) return 0p; // If no alarms return null 87 if( alarms->head->alarm >= currtime ) return 0p; // If alarms head not expired return null 88 88 return pop(alarms); // Otherwise just pop head 89 89 } … … 120 120 121 121 // If there are still alarms pending, reset the timer 122 if( & (*alarms)`first) {122 if( alarms->head ) { 123 123 __cfaabi_dbg_print_buffer_decl( " KERNEL: @%ju(%ju) resetting alarm to %ju.\n", currtime.tv, __kernel_get_time().tv, (alarms->head->alarm - currtime).tv); 124 Duration delta = (*alarms)`first.alarm - currtime;125 Duration cap ped = max(delta, 50`us);124 Duration delta = alarms->head->alarm - currtime; 125 Duration caped = max(delta, 50`us); 126 126 // itimerval tim = { caped }; 127 127 // __cfaabi_dbg_print_buffer_local( " Values are %lu, %lu, %lu %lu.\n", delta.tv, caped.tv, tim.it_value.tv_sec, tim.it_value.tv_usec); 128 128 129 __kernel_set_timer( cap ped );129 __kernel_set_timer( caped ); 130 130 } 131 131 } -
libcfa/src/containers/list.hfa
rf90d10f r61dd73d 71 71 // will collapse to single pointer with tag bit 72 72 }; 73 staticinline void ?{}( $mgd_link(tE) &this, tE* elem ) {73 inline void ?{}( $mgd_link(tE) &this, tE* elem ) { 74 74 (this.elem){ elem }; 75 75 (this.terminator){ 0p }; 76 76 (this.is_terminator){ 0 }; 77 77 } 78 staticinline void ?{}( $mgd_link(tE) &this, void * terminator ) {78 inline void ?{}( $mgd_link(tE) &this, void * terminator ) { 79 79 (this.elem){ 0p }; 80 80 (this.terminator){ terminator }; … … 82 82 } 83 83 forall ( otype tInit | { void ?{}( $mgd_link(tE) &, tInit); } ) 84 static inlinevoid ?=?( $mgd_link(tE) &this, tInit i ) {84 void ?=?( $mgd_link(tE) &this, tInit i ) { 85 85 ^?{}( this ); 86 86 ?{}( this, i ); … … 93 93 $mgd_link(tE) prev; 94 94 }; 95 staticinline void ?{}( $dlinks(tE) &this ) {95 inline void ?{}( $dlinks(tE) &this ) { 96 96 (this.next){ (tE *)0p }; 97 97 (this.prev){ (tE *)0p }; … … 132 132 // an empty dlist 133 133 // links refer to self, making a tight circle 134 static inlinevoid ?{}( dlist(Tnode, Telem) & this ) {134 void ?{}( dlist(Tnode, Telem) & this ) { 135 135 $mgd_link(Telem) selfRef = (void *) &this; 136 136 ( this.$links ) { selfRef, selfRef }; 137 137 } 138 138 139 static inlineTelem & ?`first( dlist(Tnode, Telem) &l ) {139 Telem & ?`first( dlist(Tnode, Telem) &l ) { 140 140 return * l.$links.next.elem; 141 141 } 142 142 143 static inlineTelem & ?`last( dlist(Tnode, Telem) &l ) {143 Telem & ?`last( dlist(Tnode, Telem) &l ) { 144 144 return * l.$links.prev.elem; 145 145 } 146 147 #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))148 static bool $validate_fwd( dlist(Tnode, Telem) & this ) {149 Tnode * it = & $tempcv_e2n( this`first );150 if (!it) return (& this`last == 0p);151 152 while( $next_link(*it).elem ) {153 it = & $tempcv_e2n( * $next_link(*it).elem );154 }155 156 return ( it == & $tempcv_e2n( this`last ) ) &&157 ( $next_link(*it).is_terminator ) &&158 ( ((dlist(Tnode, Telem)*)$next_link(*it).terminator) == &this );159 }160 static bool $validate_rev( dlist(Tnode, Telem) & this ) {161 Tnode * it = & $tempcv_e2n( this`last );162 if (!it) return (& this`first == 0p);163 164 while( $prev_link(*it).elem ) {165 it = & $tempcv_e2n( * $prev_link(*it).elem );166 }167 168 return ( it == & $tempcv_e2n( this`first ) ) &&169 ( $prev_link(*it).is_terminator ) &&170 ( ((dlist(Tnode, Telem)*)$prev_link(*it).terminator) == &this );171 }172 static bool validate( dlist(Tnode, Telem) & this ) {173 return $validate_fwd(this) && $validate_rev(this);174 }175 #endif176 146 177 147 static inline void insert_after(Tnode &list_pos, Telem &to_insert) { … … 182 152 assert($next_link(singleton_to_insert).elem == 0p); 183 153 $prev_link(singleton_to_insert) = & $tempcv_n2e(list_pos); 184 $next_link(singleton_to_insert) = $next_link(list_pos) ;154 $next_link(singleton_to_insert) = $next_link(list_pos).elem; 185 155 if ($next_link(list_pos).is_terminator) { 186 156 dlist(Tnode, Telem) *list = $next_link(list_pos).terminator; … … 205 175 assert($next_link(singleton_to_insert).elem == 0p); 206 176 $next_link(singleton_to_insert) = & $tempcv_n2e(list_pos); 207 $prev_link(singleton_to_insert) = $prev_link(list_pos) ;177 $prev_link(singleton_to_insert) = $prev_link(list_pos).elem; 208 178 if ($prev_link(list_pos).is_terminator) { 209 179 dlist(Tnode, Telem) *list = $prev_link(list_pos).terminator; -
tests/list/dlist-insert-remove.cfa
rf90d10f r61dd73d 258 258 dlist(fred_in_mine, fred) lf; 259 259 260 verify(validate(lf));261 262 260 printMyFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 263 261 printYourFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 … … 266 264 insert_first(lf, f1); 267 265 268 verify(validate(lf));269 270 266 printMyFreddies(f1, f2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) 271 267 printYourFreddies(f1, f2, 0); // 3.14; 3.14; 0.5; 0.5 (unmodified) … … 279 275 dlist(fred_in_yours, fred) lf; 280 276 281 verify(validate(lf));282 283 277 printMyFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 284 278 printYourFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 … … 287 281 insert_first(lf, f1); 288 282 289 verify(validate(lf));290 291 283 printMyFreddies(f1, f2, 0); // 3.14; 3.14; 0.5; 0.5 (unmodified) 292 284 printYourFreddies(f1, f2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) … … 300 292 dlist(mary, mary) lm; 301 293 302 verify(validate(lm));303 294 printMariatheotokos(m1, m2, 1); // 3.14; 3.14; 0.5; 0.5 304 295 … … 307 298 308 299 printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) 309 verify(validate(lm));310 300 } 311 301 … … 327 317 dlist(fred_in_mine, fred) lf; 328 318 329 verify(validate(lf));330 331 319 printMyFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 332 320 printYourFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 … … 335 323 insert_last(lf, f2); 336 324 337 verify(validate(lf));338 339 325 printMyFreddies(f1, f2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) 340 326 printYourFreddies(f1, f2, 0); // 3.14; 3.14; 0.5; 0.5 (unmodified) … … 348 334 dlist(fred_in_yours, fred) lf; 349 335 350 verify(validate(lf));351 352 336 printMyFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 353 337 printYourFreddies(f1, f2, 1); // 3.14; 3.14; 0.5; 0.5 … … 356 340 insert_last(lf, f2); 357 341 358 verify(validate(lf));359 360 342 printMyFreddies(f1, f2, 0); // 3.14; 3.14; 0.5; 0.5 (unmodified) 361 343 printYourFreddies(f1, f2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) … … 369 351 dlist(mary, mary) lm; 370 352 371 verify(validate(lm));372 353 printMariatheotokos(m1, m2, 1); // 3.14; 3.14; 0.5; 0.5 373 354 … … 375 356 insert_last(lm, m2); 376 357 377 verify(validate(lm));378 358 printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) 379 359 } … … 404 384 assert(& lf`last == & f1); 405 385 406 verify(validate(lf));407 408 386 insert_after(f1`in_mine, f2); 409 410 verify(validate(lf));411 387 412 388 printMyFreddies(f1, f2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) … … 432 408 assert(& lf`last == & f1); 433 409 434 verify(validate(lf));435 436 410 insert_after(f1`in_yours, f2); 437 438 verify(validate(lf));439 411 440 412 printMyFreddies(f1, f2, 0); // 3.14; 3.14; 0.5; 0.5 (unmodified) … … 460 432 assert(& lm`last == & m1); 461 433 462 verify(validate(lm));463 464 434 insert_after(m1, m2); 465 466 verify(validate(lm));467 435 468 436 printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) … … 497 465 assert(& lf`last == & f2); 498 466 499 verify(validate(lf));500 501 467 insert_before(f2`in_mine, f1); 502 503 verify(validate(lf));504 468 505 469 printMyFreddies(f1, f2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) … … 525 489 assert(& lf`last == & f2); 526 490 527 verify(validate(lf));528 529 491 insert_before(f2`in_yours, f1); 530 531 verify(validate(lf));532 492 533 493 printMyFreddies(f1, f2, 0); // 3.14; 3.14; 0.5; 0.5 (unmodified) … … 553 513 assert(& lm`last == & m2); 554 514 555 verify(validate(lm));556 557 515 insert_before(m2, m1); 558 559 verify(validate(lm));560 516 561 517 printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified) … … 866 822 printYourFreddies(fly`first, fly`last, 1); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 867 823 868 verify(validate(fly));869 verify(validate(flm));870 871 824 remove(f1`in_mine); 872 873 verify(validate(fly));874 verify(validate(flm));875 825 876 826 printMyFreddies(flm`first, flm`last, 0); // 2.7, 3.7; 2.7; 3.7; 3.7, 2.7 (modified) … … 904 854 printYourFreddies(fly`first, fly`last, 1); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 905 855 906 verify(validate(fly));907 verify(validate(flm));908 909 856 remove(f1`in_yours); 910 911 verify(validate(fly));912 verify(validate(flm));913 857 914 858 printMyFreddies(flm`first, flm`last, 0); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 (unmodified) … … 936 880 printMariatheotokos(ml`first, ml`last, 1); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 937 881 938 verify(validate(ml));939 940 882 remove(m1); 941 942 verify(validate(ml));943 883 944 884 printMariatheotokos(ml`first, ml`last, 0); // 2.7, 3.7; 2.7; 3.7; 3.7, 2.7 (modified) … … 981 921 printYourFreddies(fly`first, fly`last, 1); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 982 922 983 verify(validate(fly));984 verify(validate(flm));985 986 923 remove(f3`in_mine); 987 988 verify(validate(fly));989 verify(validate(flm));990 924 991 925 printMyFreddies(flm`first, flm`last, 0); // 1.7, 2.7; 1.7; 2.7; 2.7, 1.7 (modified) … … 1019 953 printYourFreddies(fly`first, fly`last, 1); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 1020 954 1021 verify(validate(fly));1022 verify(validate(flm));1023 1024 955 remove(f3`in_yours); 1025 1026 verify(validate(fly));1027 verify(validate(flm));1028 956 1029 957 printMyFreddies(flm`first, flm`last, 0); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 (unmodified) … … 1051 979 printMariatheotokos(ml`first, ml`last, 1); // 1.7, 2.7, 3.7; 1.7; 3.7; 3.7, 2.7, 1.7 1052 980 1053 verify(validate(ml));1054 1055 981 remove(m3); 1056 1057 verify(validate(ml));1058 982 1059 983 printMariatheotokos(ml`first, ml`last, 0); // 1.7, 2.7; 1.7; 2.7; 2.7, 1.7 (modified) … … 1090 1014 printYourFreddies(fly`first, fly`last, 1); // 0.7; 0.7; 0.7; 0.7 1091 1015 1092 verify(validate(fly));1093 verify(validate(flm));1094 1095 1016 remove(f`in_mine); 1096 1097 verify(validate(fly));1098 verify(validate(flm));1099 1017 1100 1018 assert(& flm`first == 0p); … … 1111 1029 1112 1030 insert_last(flm, f); 1113 verify(validate(fly));1114 verify(validate(flm));1115 1031 printMyFreddies(flm`first, flm`last, 0); // 0.7; 0.7; 0.7; 0.7 1116 1032 } … … 1129 1045 printYourFreddies(fly`first, fly`last, 1); // 0.7; 0.7; 0.7; 0.7 1130 1046 1131 verify(validate(fly));1132 verify(validate(flm));1133 1134 1047 remove(f`in_yours); 1135 1136 verify(validate(fly));1137 verify(validate(flm));1138 1048 1139 1049 assert(& fly`first == 0p); … … 1150 1060 1151 1061 insert_last(fly, f); 1152 verify(validate(fly));1153 verify(validate(flm));1154 1062 printYourFreddies(fly`first, fly`last, 0); // 0.7; 0.7; 0.7; 0.7 1155 1063 } … … 1164 1072 printMariatheotokos(ml`first, ml`last, 1); // 0.7; 0.7; 0.7; 0.7 1165 1073 1166 verify(validate(ml));1167 1168 1074 remove(m); 1169 1170 verify(validate(ml));1171 1075 1172 1076 assert(& ml`first == 0p); … … 1181 1085 1182 1086 insert_last(ml, m); 1183 verify(validate(ml));1184 1087 printMariatheotokos(ml`first, ml`last, 0); // 0.7; 0.7; 0.7; 0.7 1185 1088 }
Note: See TracChangeset
for help on using the changeset viewer.