- Timestamp:
- May 5, 2020, 10:51:15 AM (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:
- b6f2b21
- Parents:
- 61dd73d (diff), d3ab183 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- libcfa/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/alarm.cfa
r61dd73d rf90d10f 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 -
libcfa/src/concurrency/alarm.hfa
r61dd73d rf90d10f 23 23 #include "time.hfa" 24 24 25 #include <containers/list.hfa> 26 25 27 struct $thread; 26 28 struct processor; … … 40 42 Time alarm; // time when alarm goes off 41 43 Duration period; // if > 0 => period of alarm 42 alarm_node_t * next; // intrusive link list field 44 45 DLISTED_MGD_IMPL_IN(alarm_node_t) 43 46 44 47 union { … … 50 53 bool kernel_alarm :1; // true if this is not a user defined alarm 51 54 }; 52 53 typedef alarm_node_t ** __alarm_it_t; 55 DLISTED_MGD_IMPL_OUT(alarm_node_t) 54 56 55 57 void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period ); … … 57 59 void ^?{}( alarm_node_t & this ); 58 60 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 } 61 typedef dlist(alarm_node_t, alarm_node_t) alarm_list_t; 68 62 69 63 void insert( alarm_list_t * this, alarm_node_t * n ); -
libcfa/src/concurrency/io.cfa
r61dd73d rf90d10f 20 20 21 21 #if !defined(HAVE_LINUX_IO_URING_H) 22 void __kernel_io_startup( cluster & ) {22 void __kernel_io_startup( cluster &, bool ) { 23 23 // Nothing to do without io_uring 24 24 } 25 25 26 void __kernel_io_ start_thrd( cluster & ) {26 void __kernel_io_finish_start( cluster & ) { 27 27 // Nothing to do without io_uring 28 28 } 29 29 30 void __kernel_io_ stop_thrd( cluster & ) {30 void __kernel_io_prepare_stop( cluster & ) { 31 31 // Nothing to do without io_uring 32 32 } 33 33 34 void __kernel_io_shutdown( cluster & ) {34 void __kernel_io_shutdown( cluster &, bool ) { 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 700 697 extern ssize_t read (int fd, void *buf, size_t count); 701 698 } … … 907 904 908 905 (*sqe){ IORING_OP_CLOSE, fd }; 909 910 __submit_wait911 #endif912 }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 #else919 __submit_prelude920 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;926 906 927 907 __submit_wait … … 1040 1020 return IS_DEFINED(IORING_OP_CLOSE); 1041 1021 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 1047 1022 if( /*func == (fptr_t)read || */ 1048 1023 func == (fptr_t)cfa_read ) -
libcfa/src/concurrency/preemption.cfa
r61dd73d rf90d10f 84 84 // Get next expired node 85 85 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) { 86 if( ! alarms->head) return 0p; // If no alarms return null87 if( alarms->head->alarm >= currtime ) return 0p; // If alarms head not expired return null86 if( ! & (*alarms)`first ) return 0p; // If no alarms return null 87 if( (*alarms)`first.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->head) {122 if( & (*alarms)`first ) { 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->head->alarm - currtime;125 Duration cap ed = max(delta, 50`us);124 Duration delta = (*alarms)`first.alarm - currtime; 125 Duration capped = 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 ed );129 __kernel_set_timer( capped ); 130 130 } 131 131 } -
libcfa/src/containers/list.hfa
r61dd73d rf90d10f 71 71 // will collapse to single pointer with tag bit 72 72 }; 73 inline void ?{}( $mgd_link(tE) &this, tE* elem ) {73 static 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 inline void ?{}( $mgd_link(tE) &this, void * terminator ) {78 static 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 void ?=?( $mgd_link(tE) &this, tInit i ) {84 static inline void ?=?( $mgd_link(tE) &this, tInit i ) { 85 85 ^?{}( this ); 86 86 ?{}( this, i ); … … 93 93 $mgd_link(tE) prev; 94 94 }; 95 inline void ?{}( $dlinks(tE) &this ) {95 static 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 void ?{}( dlist(Tnode, Telem) & this ) {134 static inline void ?{}( dlist(Tnode, Telem) & this ) { 135 135 $mgd_link(Telem) selfRef = (void *) &this; 136 136 ( this.$links ) { selfRef, selfRef }; 137 137 } 138 138 139 Telem & ?`first( dlist(Tnode, Telem) &l ) {139 static inline Telem & ?`first( dlist(Tnode, Telem) &l ) { 140 140 return * l.$links.next.elem; 141 141 } 142 142 143 Telem & ?`last( dlist(Tnode, Telem) &l ) {143 static inline 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 #endif 146 176 147 177 static inline void insert_after(Tnode &list_pos, Telem &to_insert) { … … 152 182 assert($next_link(singleton_to_insert).elem == 0p); 153 183 $prev_link(singleton_to_insert) = & $tempcv_n2e(list_pos); 154 $next_link(singleton_to_insert) = $next_link(list_pos) .elem;184 $next_link(singleton_to_insert) = $next_link(list_pos); 155 185 if ($next_link(list_pos).is_terminator) { 156 186 dlist(Tnode, Telem) *list = $next_link(list_pos).terminator; … … 175 205 assert($next_link(singleton_to_insert).elem == 0p); 176 206 $next_link(singleton_to_insert) = & $tempcv_n2e(list_pos); 177 $prev_link(singleton_to_insert) = $prev_link(list_pos) .elem;207 $prev_link(singleton_to_insert) = $prev_link(list_pos); 178 208 if ($prev_link(list_pos).is_terminator) { 179 209 dlist(Tnode, Telem) *list = $prev_link(list_pos).terminator;
Note: See TracChangeset
for help on using the changeset viewer.