Changes in / [b798713:f80f840]
- Files:
-
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
benchmark/Makefile.in
rb798713 rf80f840 352 352 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 353 353 $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \ 354 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \ 355 $(AM_CFLAGS) $(CFLAGS) 354 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS) 356 355 357 356 AM_V_CFA = $(am__v_CFA_@AM_V@) -
driver/cfa.cc
rb798713 rf80f840 401 401 args[nargs++] = "-Xlinker"; 402 402 args[nargs++] = "--undefined=__cfaabi_appready_startup"; 403 args[nargs++] = "-z"; 404 args[nargs++] = "execstack"; 403 405 404 406 // include the cfa library in case it is needed … … 409 411 args[nargs++] = "-Wl,--pop-state"; 410 412 args[nargs++] = "-lcfa"; 411 args[nargs++] = "- lpthread";413 args[nargs++] = "-pthread"; 412 414 args[nargs++] = "-ldl"; 413 415 args[nargs++] = "-lrt"; -
libcfa/configure
rb798713 rf80f840 3000 3000 case $CONFIGURATION in 3001 3001 "debug" ) 3002 CONFIG_CFLAGS="-O g-g"3002 CONFIG_CFLAGS="-O0 -g" 3003 3003 CONFIG_CFAFLAGS="-debug" 3004 3004 CONFIG_BUILDLIB="yes" -
libcfa/configure.ac
rb798713 rf80f840 68 68 case $CONFIGURATION in 69 69 "debug" ) 70 CONFIG_CFLAGS="-O g-g"70 CONFIG_CFLAGS="-O0 -g" 71 71 CONFIG_CFAFLAGS="-debug" 72 72 CONFIG_BUILDLIB="yes" -
libcfa/src/Makefile.am
rb798713 rf80f840 33 33 # The built sources must not depend on the installed headers 34 34 AM_CFAFLAGS = -quiet -cfalib -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@ 35 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@35 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC -pthread @ARCH_FLAGS@ @CONFIG_CFLAGS@ 36 36 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ 37 37 CFACC = @CFACC@ -
libcfa/src/Makefile.in
rb798713 rf80f840 417 417 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 418 418 $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \ 419 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \ 420 $(AM_CFLAGS) $(CFLAGS) 419 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS) 421 420 422 421 AM_V_CFA = $(am__v_CFA_@AM_V@) … … 446 445 # The built sources must not depend on the installed headers 447 446 AM_CFAFLAGS = -quiet -cfalib -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@ 448 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@447 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC -pthread @ARCH_FLAGS@ @CONFIG_CFLAGS@ 449 448 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ 450 449 @BUILDLIB_FALSE@headers_nosrc = -
libcfa/src/concurrency/alarm.cfa
rb798713 rf80f840 10 10 // Created On : Fri Jun 2 11:31:25 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri May 25 06:25:47 201813 // Update Count : 6 712 // Last Modified On : Tue Dec 3 22:47:24 2019 13 // Update Count : 68 14 14 // 15 15 … … 40 40 void __kernel_set_timer( Duration alarm ) { 41 41 verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm.tv); 42 setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL);42 setitimer( ITIMER_REAL, &(itimerval){ alarm }, 0p ); 43 43 } 44 44 … … 113 113 this->tail = &this->head; 114 114 } 115 head->next = NULL;115 head->next = 0p; 116 116 } 117 117 verify( validate( this ) ); … … 127 127 this->tail = it; 128 128 } 129 n->next = NULL;129 n->next = 0p; 130 130 131 131 verify( validate( this ) ); -
libcfa/src/concurrency/coroutine.cfa
rb798713 rf80f840 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 30 17:20:57 201813 // Update Count : 912 // Last Modified On : Thu Dec 5 14:37:29 2019 13 // Update Count : 15 14 14 // 15 15 … … 90 90 91 91 void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize ) with( this ) { 92 (this.context){ NULL, NULL};92 (this.context){0p, 0p}; 93 93 (this.stack){storage, storageSize}; 94 94 this.name = name; 95 95 state = Start; 96 starter = NULL;97 last = NULL;98 cancellation = NULL;96 starter = 0p; 97 last = 0p; 98 cancellation = 0p; 99 99 } 100 100 … … 131 131 132 132 [void *, size_t] __stack_alloc( size_t storageSize ) { 133 staticconst size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment133 const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment 134 134 assert(__page_size != 0l); 135 135 size_t size = libCeiling( storageSize, 16 ) + stack_data_size; … … 157 157 158 158 void __stack_prepare( __stack_info_t * this, size_t create_size ) { 159 staticconst size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment159 const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment 160 160 bool userStack; 161 161 void * storage; -
libcfa/src/concurrency/coroutine.hfa
rb798713 rf80f840 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 21 17:49:39201913 // Update Count : 912 // Last Modified On : Tue Dec 3 22:47:58 2019 13 // Update Count : 10 14 14 // 15 15 … … 38 38 void ^?{}( coroutine_desc & this ); 39 39 40 static inline void ?{}( coroutine_desc & this) { this{ "Anonymous Coroutine", NULL, 0 }; }41 static inline void ?{}( coroutine_desc & this, size_t stackSize) { this{ "Anonymous Coroutine", NULL, stackSize }; }40 static inline void ?{}( coroutine_desc & this) { this{ "Anonymous Coroutine", 0p, 0 }; } 41 static inline void ?{}( coroutine_desc & this, size_t stackSize) { this{ "Anonymous Coroutine", 0p, stackSize }; } 42 42 static inline void ?{}( coroutine_desc & this, void * storage, size_t storageSize ) { this{ "Anonymous Coroutine", storage, storageSize }; } 43 static inline void ?{}( coroutine_desc & this, const char * name) { this{ name, NULL, 0 }; }44 static inline void ?{}( coroutine_desc & this, const char * name, size_t stackSize ) { this{ name, NULL, stackSize }; }43 static inline void ?{}( coroutine_desc & this, const char * name) { this{ name, 0p, 0 }; } 44 static inline void ?{}( coroutine_desc & this, const char * name, size_t stackSize ) { this{ name, 0p, stackSize }; } 45 45 46 46 //----------------------------------------------------------------------------- … … 89 89 src->state = Active; 90 90 91 if( unlikely(src->cancellation != NULL) ) {91 if( unlikely(src->cancellation != 0p) ) { 92 92 _CtxCoroutine_Unwind(src->cancellation, src); 93 93 } … … 128 128 coroutine_desc * dst = get_coroutine(cor); 129 129 130 if( unlikely(dst->context.SP == NULL) ) {130 if( unlikely(dst->context.SP == 0p) ) { 131 131 __stack_prepare(&dst->stack, 65000); 132 132 CtxStart(&cor, CtxInvokeCoroutine); -
libcfa/src/concurrency/invoke.h
rb798713 rf80f840 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jun 22 18:19:13 201913 // Update Count : 4 012 // Last Modified On : Thu Dec 5 16:26:03 2019 13 // Update Count : 44 14 14 // 15 15 … … 215 215 216 216 static inline void ?{}(__monitor_group_t & this) { 217 (this.data){ NULL};217 (this.data){0p}; 218 218 (this.size){0}; 219 219 (this.func){NULL}; -
libcfa/src/concurrency/kernel.cfa
rb798713 rf80f840 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 21 16:46:59201913 // Update Count : 2712 // Last Modified On : Thu Dec 5 16:25:52 2019 13 // Update Count : 52 14 14 // 15 15 … … 26 26 #include <signal.h> 27 27 #include <unistd.h> 28 #include <limits.h> // PTHREAD_STACK_MIN 29 #include <sys/mman.h> // mprotect 28 30 } 29 31 … … 40 42 //----------------------------------------------------------------------------- 41 43 // Some assembly required 42 #if 44 #if defined( __i386 ) 43 45 #define CtxGet( ctx ) \ 44 46 __asm__ volatile ( \ … … 123 125 124 126 extern "C" { 125 struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters;127 struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters; 126 128 } 127 129 … … 131 133 // Global state 132 134 thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) = { 133 NULL, 135 NULL, // cannot use 0p 134 136 NULL, 135 137 { 1, false, false }, … … 140 142 // Struct to steal stack 141 143 struct current_stack_info_t { 142 __stack_t * storage; // pointer to stack object143 void * base;// base of stack144 void * limit;// stack grows towards stack limit145 void * context;// address of cfa_context_t144 __stack_t * storage; // pointer to stack object 145 void * base; // base of stack 146 void * limit; // stack grows towards stack limit 147 void * context; // address of cfa_context_t 146 148 }; 147 149 … … 172 174 name = "Main Thread"; 173 175 state = Start; 174 starter = NULL;175 last = NULL;176 cancellation = NULL;176 starter = 0p; 177 last = 0p; 178 cancellation = 0p; 177 179 } 178 180 … … 188 190 link.prev = 0p; 189 191 190 node.next = NULL;191 node.prev = NULL;192 node.next = 0p; 193 node.prev = 0p; 192 194 doregister(curr_cluster, this); 193 195 … … 214 216 terminated{ 0 }; 215 217 do_terminate = false; 216 preemption_alarm = NULL;218 preemption_alarm = 0p; 217 219 pending_preemption = false; 218 220 runner.proc = &this; … … 234 236 } 235 237 236 pthread_join( kernel_thread, NULL ); 238 pthread_join( kernel_thread, 0p ); 239 free( this.stack ); 237 240 } 238 241 … … 284 287 __cfaabi_dbg_print_safe("Kernel : core %p started\n", this); 285 288 286 thread_desc * readyThread = NULL; 287 for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ ) 288 { 289 thread_desc * readyThread = 0p; 290 for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ ) { 289 291 readyThread = nextThread( this->cltr ); 290 292 291 if(readyThread) 292 { 293 if(readyThread) { 293 294 verify( ! kernelTLS.preemption_state.enabled ); 294 295 … … 301 302 302 303 spin_count = 0; 303 } 304 else 305 { 304 } else { 306 305 // spin(this, &spin_count); 307 306 halt(this); … … 423 422 processor * proc = (processor *) arg; 424 423 kernelTLS.this_processor = proc; 425 kernelTLS.this_thread = NULL;424 kernelTLS.this_thread = 0p; 426 425 kernelTLS.preemption_state.[enabled, disable_count] = [false, 1]; 427 426 // SKULLDUGGERY: We want to create a context for the processor coroutine … … 436 435 437 436 //Set global state 438 kernelTLS.this_thread = NULL;437 kernelTLS.this_thread = 0p; 439 438 440 439 //We now have a proper context from which to schedule threads … … 452 451 __cfaabi_dbg_print_safe("Kernel : core %p main ended (%p)\n", proc, &proc->runner); 453 452 454 return NULL; 453 return 0p; 454 } 455 456 static void Abort( int ret, const char * func ) { 457 if ( ret ) { // pthread routines return errno values 458 abort( "%s : internal error, error(%d) %s.", func, ret, strerror( ret ) ); 459 } // if 460 } // Abort 461 462 void * create_pthread( pthread_t * pthread, void * (*start)(void *), void * arg ) { 463 pthread_attr_t attr; 464 465 Abort( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute 466 467 size_t stacksize; 468 // default stack size, normally defined by shell limit 469 Abort( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" ); 470 assert( stacksize >= PTHREAD_STACK_MIN ); 471 472 void * stack; 473 __cfaabi_dbg_debug_do( 474 stack = memalign( __page_size, stacksize + __page_size ); 475 // pthread has no mechanism to create the guard page in user supplied stack. 476 if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) { 477 abort( "mprotect : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) ); 478 } // if 479 ); 480 __cfaabi_dbg_no_debug_do( 481 stack = malloc( stacksize ); 482 ); 483 484 Abort( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" ); 485 486 Abort( pthread_create( pthread, &attr, start, arg ), "pthread_create" ); 487 return stack; 455 488 } 456 489 … … 458 491 __cfaabi_dbg_print_safe("Kernel : Starting core %p\n", this); 459 492 460 pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this );493 this->stack = create_pthread( &this->kernel_thread, CtxInvokeProcessor, (void *)this ); 461 494 462 495 __cfaabi_dbg_print_safe("Kernel : core %p started\n", this); … … 515 548 verify( ! kernelTLS.preemption_state.enabled ); 516 549 517 verifyf( thrd->link.next == NULL, "Expected null got %p", thrd->link.next );550 verifyf( thrd->link.next == 0p, "Expected null got %p", thrd->link.next ); 518 551 519 552 … … 695 728 void ?{}(processorCtx_t & this, processor * proc) { 696 729 (this.__cor){ "Processor" }; 697 this.__cor.starter = NULL;730 this.__cor.starter = 0p; 698 731 this.proc = proc; 699 732 } … … 704 737 terminated{ 0 }; 705 738 do_terminate = false; 706 preemption_alarm = NULL;739 preemption_alarm = 0p; 707 740 pending_preemption = false; 708 741 kernel_thread = pthread_self(); … … 907 940 908 941 void V(semaphore & this) with( this ) { 909 thread_desc * thrd = NULL;942 thread_desc * thrd = 0p; 910 943 lock( lock __cfaabi_dbg_ctx2 ); 911 944 count += 1; -
libcfa/src/concurrency/kernel.hfa
rb798713 rf80f840 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jun 22 11:39:17201913 // Update Count : 1 612 // Last Modified On : Wed Dec 4 07:54:51 2019 13 // Update Count : 18 14 14 // 15 15 … … 89 89 static inline void ?{}(FinishAction & this) { 90 90 this.action_code = No_Action; 91 this.thrd = NULL;92 this.lock = NULL;91 this.thrd = 0p; 92 this.lock = 0p; 93 93 } 94 94 static inline void ^?{}(FinishAction &) {} … … 135 135 // Termination synchronisation 136 136 semaphore terminated; 137 138 // pthread Stack 139 void * stack; 137 140 138 141 // Link lists fields -
libcfa/src/concurrency/kernel_private.hfa
rb798713 rf80f840 10 10 // Created On : Mon Feb 13 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 29 14:06:40 201813 // Update Count : 312 // Last Modified On : Sat Nov 30 19:25:02 2019 13 // Update Count : 8 14 14 // 15 15 … … 57 57 void main(processorCtx_t *); 58 58 59 void * create_pthread( pthread_t *, void * (*)(void *), void * ); 60 59 61 static inline void wake_fast(processor * this) { 60 62 __cfaabi_dbg_print_safe("Kernel : Waking up processor %p\n", this); -
libcfa/src/concurrency/monitor.cfa
rb798713 rf80f840 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 30 14:30:26 201813 // Update Count : 912 // Last Modified On : Wed Dec 4 07:55:14 2019 13 // Update Count : 10 14 14 // 15 15 … … 363 363 this.waiting_thread = waiting_thread; 364 364 this.count = count; 365 this.next = NULL;365 this.next = 0p; 366 366 this.user_info = user_info; 367 367 } … … 369 369 void ?{}(__condition_criterion_t & this ) with( this ) { 370 370 ready = false; 371 target = NULL;372 owner = NULL;373 next = NULL;371 target = 0p; 372 owner = 0p; 373 next = 0p; 374 374 } 375 375 … … 378 378 this.target = target; 379 379 this.owner = &owner; 380 this.next = NULL;380 this.next = 0p; 381 381 } 382 382 … … 387 387 388 388 // Check that everything is as expected 389 assertf( this.monitors != NULL, "Waiting with no monitors (%p)", this.monitors );389 assertf( this.monitors != 0p, "Waiting with no monitors (%p)", this.monitors ); 390 390 verifyf( this.monitor_count != 0, "Waiting with 0 monitors (%"PRIiFAST16")", this.monitor_count ); 391 391 verifyf( this.monitor_count < 32u, "Excessive monitor count (%"PRIiFAST16")", this.monitor_count ); … … 449 449 450 450 // Lock all monitors 451 lock_all( this.monitors, NULL, count );451 lock_all( this.monitors, 0p, count ); 452 452 453 453 //Pop the head of the waiting queue … … 471 471 472 472 //Check that everything is as expected 473 verifyf( this.monitors != NULL, "Waiting with no monitors (%p)", this.monitors );473 verifyf( this.monitors != 0p, "Waiting with no monitors (%p)", this.monitors ); 474 474 verifyf( this.monitor_count != 0, "Waiting with 0 monitors (%"PRIiFAST16")", this.monitor_count ); 475 475 … … 674 674 675 675 static inline void reset_mask( monitor_desc * this ) { 676 this->mask.accepted = NULL;677 this->mask.data = NULL;676 this->mask.accepted = 0p; 677 this->mask.data = 0p; 678 678 this->mask.size = 0; 679 679 } … … 816 816 } 817 817 818 __cfaabi_dbg_print_safe( "Kernel : Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : NULL);819 return ready2run ? node->waiting_thread : NULL;818 __cfaabi_dbg_print_safe( "Kernel : Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : 0p ); 819 return ready2run ? node->waiting_thread : 0p; 820 820 } 821 821 … … 824 824 if( !this.monitors ) { 825 825 // __cfaabi_dbg_print_safe( "Branding\n" ); 826 assertf( thrd->monitors.data != NULL, "No current monitor to brand condition %p", thrd->monitors.data );826 assertf( thrd->monitors.data != 0p, "No current monitor to brand condition %p", thrd->monitors.data ); 827 827 this.monitor_count = thrd->monitors.size; 828 828 -
libcfa/src/concurrency/monitor.hfa
rb798713 rf80f840 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Oct 7 18:06:45 201713 // Update Count : 1 012 // Last Modified On : Wed Dec 4 07:55:32 2019 13 // Update Count : 11 14 14 // 15 15 … … 31 31 entry_queue{}; 32 32 signal_stack{}; 33 owner = NULL;33 owner = 0p; 34 34 recursion = 0; 35 mask.accepted = NULL;36 mask.data = NULL;35 mask.accepted = 0p; 36 mask.data = 0p; 37 37 mask.size = 0; 38 dtor_node = NULL;38 dtor_node = 0p; 39 39 } 40 40 … … 122 122 123 123 static inline void ?{}( condition & this ) { 124 this.monitors = NULL;124 this.monitors = 0p; 125 125 this.monitor_count = 0; 126 126 } -
libcfa/src/concurrency/mutex.cfa
rb798713 rf80f840 11 11 // Author : Thierry Delisle 12 12 // Created On : Fri May 25 01:37:11 2018 13 // Last Modified By : Thierry Delisle14 // Last Modified On : Fri May 25 01:37:51 201815 // Update Count : 013 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Wed Dec 4 09:16:39 2019 15 // Update Count : 1 16 16 // 17 17 … … 73 73 this.lock{}; 74 74 this.blocked_threads{}; 75 this.owner = NULL;75 this.owner = 0p; 76 76 this.recursion_count = 0; 77 77 } … … 83 83 void lock(recursive_mutex_lock & this) with(this) { 84 84 lock( lock __cfaabi_dbg_ctx2 ); 85 if( owner == NULL) {85 if( owner == 0p ) { 86 86 owner = kernelTLS.this_thread; 87 87 recursion_count = 1; … … 101 101 bool ret = false; 102 102 lock( lock __cfaabi_dbg_ctx2 ); 103 if( owner == NULL) {103 if( owner == 0p ) { 104 104 owner = kernelTLS.this_thread; 105 105 recursion_count = 1; -
libcfa/src/concurrency/mutex.hfa
rb798713 rf80f840 11 11 // Author : Thierry Delisle 12 12 // Created On : Fri May 25 01:24:09 2018 13 // Last Modified By : Thierry Delisle14 // Last Modified On : Fri May 25 01:24:12 201815 // Update Count : 013 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Wed Dec 4 09:16:53 2019 15 // Update Count : 1 16 16 // 17 17 … … 110 110 111 111 static inline void ?{}(lock_scope(L) & this) { 112 this.locks = NULL;112 this.locks = 0p; 113 113 this.count = 0; 114 114 } -
libcfa/src/concurrency/preemption.cfa
rb798713 rf80f840 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Jun 5 17:35:49 201813 // Update Count : 3712 // Last Modified On : Thu Dec 5 16:34:05 2019 13 // Update Count : 43 14 14 // 15 15 … … 24 24 #include <string.h> 25 25 #include <unistd.h> 26 #include <limits.h> // PTHREAD_STACK_MIN 26 27 } 27 28 … … 64 65 event_kernel_t * event_kernel; // kernel public handle to even kernel 65 66 static pthread_t alarm_thread; // pthread handle to alarm thread 67 static void * alarm_stack; // pthread stack for alarm thread 66 68 67 69 static void ?{}(event_kernel_t & this) with( this ) { … … 81 83 // Get next expired node 82 84 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) { 83 if( !alarms->head ) return NULL;// If no alarms return null84 if( alarms->head->alarm >= currtime ) return NULL;// If alarms head not expired return null85 return pop(alarms); 85 if( !alarms->head ) return 0p; // If no alarms return null 86 if( alarms->head->alarm >= currtime ) return 0p; // If alarms head not expired return null 87 return pop(alarms); // Otherwise just pop head 86 88 } 87 89 88 90 // Tick one frame of the Discrete Event Simulation for alarms 89 91 static void tick_preemption() { 90 alarm_node_t * node = NULL;// Used in the while loop but cannot be declared in the while condition91 alarm_list_t * alarms = &event_kernel->alarms; 92 Time currtime = __kernel_get_time(); // Check current time once so weeverything "happens at once"92 alarm_node_t * node = 0p; // Used in the while loop but cannot be declared in the while condition 93 alarm_list_t * alarms = &event_kernel->alarms; // Local copy for ease of reading 94 Time currtime = __kernel_get_time(); // Check current time once so everything "happens at once" 93 95 94 96 //Loop throught every thing expired … … 243 245 sigaddset( &mask, sig ); 244 246 245 if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL) == -1 ) {247 if ( pthread_sigmask( SIG_UNBLOCK, &mask, 0p ) == -1 ) { 246 248 abort( "internal error, pthread_sigmask" ); 247 249 } … … 254 256 sigaddset( &mask, sig ); 255 257 256 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL) == -1 ) {258 if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) { 257 259 abort( "internal error, pthread_sigmask" ); 258 260 } … … 301 303 302 304 // Setup proper signal handlers 303 __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); 305 __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler 304 306 305 307 signal_block( SIGALRM ); 306 308 307 pthread_create( &alarm_thread, NULL, alarm_loop, NULL);309 alarm_stack = create_pthread( &alarm_thread, alarm_loop, 0p ); 308 310 } 309 311 … … 316 318 sigset_t mask; 317 319 sigfillset( &mask ); 318 sigprocmask( SIG_BLOCK, &mask, NULL);320 sigprocmask( SIG_BLOCK, &mask, 0p ); 319 321 320 322 // Notify the alarm thread of the shutdown … … 323 325 324 326 // Wait for the preemption thread to finish 325 pthread_join( alarm_thread, NULL ); 327 328 pthread_join( alarm_thread, 0p ); 329 free( alarm_stack ); 326 330 327 331 // Preemption is now fully stopped … … 380 384 static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" ); 381 385 #endif 382 if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL) == -1 ) {386 if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), 0p ) == -1 ) { 383 387 abort( "internal error, sigprocmask" ); 384 388 } … … 399 403 sigset_t mask; 400 404 sigfillset(&mask); 401 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL) == -1 ) {405 if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) { 402 406 abort( "internal error, pthread_sigmask" ); 403 407 } … … 420 424 {__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );} 421 425 continue; 422 426 case EINVAL : 423 427 abort( "Timeout was invalid." ); 424 428 default: … … 453 457 EXIT: 454 458 __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n" ); 455 return NULL;459 return 0p; 456 460 } 457 461 … … 466 470 sigset_t oldset; 467 471 int ret; 468 ret = pthread_sigmask(0, NULL, &oldset);472 ret = pthread_sigmask(0, 0p, &oldset); 469 473 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 470 474 -
libcfa/src/concurrency/thread.cfa
rb798713 rf80f840 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 30 17:19:52 201813 // Update Count : 812 // Last Modified On : Wed Dec 4 09:17:49 2019 13 // Update Count : 9 14 14 // 15 15 … … 33 33 // Thread ctors and dtors 34 34 void ?{}(thread_desc & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) { 35 context{ NULL, NULL};35 context{ 0p, 0p }; 36 36 self_cor{ name, storage, storageSize }; 37 37 state = Start; … … 44 44 link.prev = 0p; 45 45 46 node.next = NULL;47 node.prev = NULL;46 node.next = 0p; 47 node.prev = 0p; 48 48 doregister(curr_cluster, this); 49 49 -
libcfa/src/concurrency/thread.hfa
rb798713 rf80f840 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jun 21 17:51:33201913 // Update Count : 512 // Last Modified On : Wed Dec 4 09:18:14 2019 13 // Update Count : 6 14 14 // 15 15 … … 61 61 void ^?{}(thread_desc & this); 62 62 63 static inline void ?{}(thread_desc & this) { this{ "Anonymous Thread", *mainCluster, NULL, 65000 }; }64 static inline void ?{}(thread_desc & this, size_t stackSize ) { this{ "Anonymous Thread", *mainCluster, NULL, stackSize }; }63 static inline void ?{}(thread_desc & this) { this{ "Anonymous Thread", *mainCluster, 0p, 65000 }; } 64 static inline void ?{}(thread_desc & this, size_t stackSize ) { this{ "Anonymous Thread", *mainCluster, 0p, stackSize }; } 65 65 static inline void ?{}(thread_desc & this, void * storage, size_t storageSize ) { this{ "Anonymous Thread", *mainCluster, storage, storageSize }; } 66 static inline void ?{}(thread_desc & this, struct cluster & cl ) { this{ "Anonymous Thread", cl, NULL, 65000 }; }67 static inline void ?{}(thread_desc & this, struct cluster & cl, size_t stackSize ) { this{ "Anonymous Thread", cl, NULL, stackSize }; }66 static inline void ?{}(thread_desc & this, struct cluster & cl ) { this{ "Anonymous Thread", cl, 0p, 65000 }; } 67 static inline void ?{}(thread_desc & this, struct cluster & cl, size_t stackSize ) { this{ "Anonymous Thread", cl, 0p, stackSize }; } 68 68 static inline void ?{}(thread_desc & this, struct cluster & cl, void * storage, size_t storageSize ) { this{ "Anonymous Thread", cl, storage, storageSize }; } 69 static inline void ?{}(thread_desc & this, const char * const name) { this{ name, *mainCluster, NULL, 65000 }; }70 static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl ) { this{ name, cl, NULL, 65000 }; }71 static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, NULL, stackSize }; }69 static inline void ?{}(thread_desc & this, const char * const name) { this{ name, *mainCluster, 0p, 65000 }; } 70 static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl ) { this{ name, cl, 0p, 65000 }; } 71 static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, 0p, stackSize }; } 72 72 73 73 //----------------------------------------------------------------------------- -
libcfa/src/fstream.cfa
rb798713 rf80f840 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Sep 10 22:19:56 201913 // Update Count : 35 412 // Last Modified On : Fri Nov 29 06:56:46 2019 13 // Update Count : 355 14 14 // 15 15 … … 66 66 } // ?{} 67 67 68 void ^?{}( ofstream & os ) { 69 close( os ); 70 } // ^?{} 71 68 72 void sepOn( ofstream & os ) { os.sepOnOff = ! getNL( os ); } 69 73 void sepOff( ofstream & os ) { os.sepOnOff = false; } … … 195 199 } // ?{} 196 200 201 void ^?{}( ifstream & is ) { 202 close( is ); 203 } // ^?{} 204 197 205 void nlOn( ifstream & os ) { os.nlOnOff = true; } 198 206 void nlOff( ifstream & os ) { os.nlOnOff = false; } -
libcfa/src/fstream.hfa
rb798713 rf80f840 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 15 18:10:23201913 // Update Count : 16 712 // Last Modified On : Fri Nov 29 06:56:02 2019 13 // Update Count : 168 14 14 // 15 15 … … 72 72 void ?{}( ofstream & os, const char * name, const char * mode ); 73 73 void ?{}( ofstream & os, const char * name ); 74 void ^?{}( ofstream & os ); 74 75 75 76 extern ofstream & sout, & stdout, & serr, & stderr; // aliases … … 101 102 void ?{}( ifstream & is, const char * name, const char * mode ); 102 103 void ?{}( ifstream & is, const char * name ); 104 void ^?{}( ifstream & is ); 103 105 104 106 extern ifstream & sin, & stdin; // aliases -
libcfa/src/heap.cfa
rb798713 rf80f840 10 10 // Created On : Tue Dec 19 21:58:35 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Nov 24 17:56:15201913 // Update Count : 6 3812 // Last Modified On : Wed Dec 4 21:42:46 2019 13 // Update Count : 646 14 14 // 15 15 … … 35 35 static bool traceHeap = false; 36 36 37 inline bool traceHeap() { 38 return traceHeap; 39 } // traceHeap 37 inline bool traceHeap() { return traceHeap; } 40 38 41 39 bool traceHeapOn() { … … 51 49 } // traceHeapOff 52 50 51 bool traceHeapTerm() { return false; } 52 53 53 54 54 static bool prtFree = false; … … 71 71 72 72 73 // static bool traceHeapTerm = false;74 75 // inline bool traceHeapTerm() {76 // return traceHeapTerm;77 // } // traceHeapTerm78 79 // bool traceHeapTermOn() {80 // bool temp = traceHeapTerm;81 // traceHeapTerm = true;82 // return temp;83 // } // traceHeapTermOn84 85 // bool traceHeapTermOff() {86 // bool temp = traceHeapTerm;87 // traceHeapTerm = false;88 // return temp;89 // } // traceHeapTermOff90 91 92 73 enum { 93 74 // Define the default extension heap amount in units of bytes. When the uC++ supplied heap reaches the brk address, … … 115 96 if ( allocFree != 0 ) { 116 97 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT. 117 //char helpText[512];118 //int len = snprintf( helpText, sizeof(helpText), "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) bytes of storage allocated but not freed.\n"119 //"Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n",120 //(long int)getpid(), allocFree, allocFree ); // always print the UNIX pid121 // __cfaabi_dbg_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug98 char helpText[512]; 99 int len = snprintf( helpText, sizeof(helpText), "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) bytes of storage allocated but not freed.\n" 100 "Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n", 101 (long int)getpid(), allocFree, allocFree ); // always print the UNIX pid 102 __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug 122 103 } // if 123 104 } // prtUnfreed … … 713 694 static void ^?{}( HeapManager & ) { 714 695 #ifdef __STATISTICS__ 715 //if ( traceHeapTerm() ) {716 //printStats();717 //if ( prtfree() ) prtFree( heapManager, true );718 //} // if696 if ( traceHeapTerm() ) { 697 printStats(); 698 // if ( prtfree() ) prtFree( heapManager, true ); 699 } // if 719 700 #endif // __STATISTICS__ 720 701 } // ~HeapManager … … 874 855 #endif // __STATISTICS__ 875 856 876 if ( unlikely( size == 0 ) ) { free( oaddr ); return 0p; } // special cases 857 // If size is equal to 0, either NULL or a pointer suitable to be passed to free() is returned. 858 if ( unlikely( size == 0 ) ) { free( oaddr ); return mallocNoStats( size ); } // special cases 877 859 if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size ); 878 860 … … 1101 1083 #endif // __STATISTICS__ 1102 1084 1103 if ( unlikely( size == 0 ) ) { free( oaddr ); return 0p; } // special cases 1085 // If size is equal to 0, either NULL or a pointer suitable to be passed to free() is returned. 1086 if ( unlikely( size == 0 ) ) { free( oaddr ); return mallocNoStats( size ); } // special cases 1104 1087 if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size ); 1105 1088 -
libcfa/src/interpose.cfa
rb798713 rf80f840 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 21 16:47:02 201913 // Update Count : 11 812 // Last Modified On : Sat Nov 30 07:09:42 2019 13 // Update Count : 119 14 14 // 15 15 … … 196 196 __cfaabi_bits_print_nolock( STDERR_FILENO, "Stack back trace for: %s\n", messages[0]); 197 197 198 for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {199 char * name = NULL, * offset_begin = NULL, * offset_end = NULL;198 for ( int i = Start; i < size - abort_lastframe && messages != 0p; i += 1 ) { 199 char * name = 0p, * offset_begin = 0p, * offset_end = 0p; 200 200 201 201 for ( char * p = messages[i]; *p; ++p ) { -
libcfa/src/startup.cfa
rb798713 rf80f840 10 10 // Created On : Tue Jul 24 16:21:57 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jul 25 16:42:01 201813 // Update Count : 1 112 // Last Modified On : Sat Nov 30 07:07:56 2019 13 // Update Count : 13 14 14 // 15 15 16 16 #include "startup.hfa" 17 #include <unistd.h> 18 17 #include <time.h> // tzset 19 18 20 19 extern "C" { 21 20 static void __cfaabi_appready_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_APPREADY ) )); 22 21 void __cfaabi_appready_startup( void ) { 22 tzset(); // initialize time global variables 23 23 #ifdef __CFA_DEBUG__ 24 24 extern void heapAppStart(); -
libcfa/src/stdlib.hfa
rb798713 rf80f840 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 2 2 15:13:14201913 // Update Count : 39912 // Last Modified On : Fri Nov 29 23:08:02 2019 13 // Update Count : 400 14 14 // 15 15 … … 210 210 211 211 static inline { 212 int ato( const char * sptr ) { return (int)strtol( sptr, 0 , 10 ); }213 unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0 , 10 ); }214 long int ato( const char * sptr ) { return strtol( sptr, 0 , 10 ); }215 unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0 , 10 ); }216 long long int ato( const char * sptr ) { return strtoll( sptr, 0 , 10 ); }217 unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0 , 10 ); }218 219 float ato( const char * sptr ) { return strtof( sptr, 0 ); }220 double ato( const char * sptr ) { return strtod( sptr, 0 ); }221 long double ato( const char * sptr ) { return strtold( sptr, 0 ); }222 223 float _Complex ato( const char * sptr ) { return strto( sptr, NULL); }224 double _Complex ato( const char * sptr ) { return strto( sptr, NULL); }225 long double _Complex ato( const char * sptr ) { return strto( sptr, NULL); }212 int ato( const char * sptr ) { return (int)strtol( sptr, 0p, 10 ); } 213 unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0p, 10 ); } 214 long int ato( const char * sptr ) { return strtol( sptr, 0p, 10 ); } 215 unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0p, 10 ); } 216 long long int ato( const char * sptr ) { return strtoll( sptr, 0p, 10 ); } 217 unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0p, 10 ); } 218 219 float ato( const char * sptr ) { return strtof( sptr, 0p ); } 220 double ato( const char * sptr ) { return strtod( sptr, 0p ); } 221 long double ato( const char * sptr ) { return strtold( sptr, 0p ); } 222 223 float _Complex ato( const char * sptr ) { return strto( sptr, 0p ); } 224 double _Complex ato( const char * sptr ) { return strto( sptr, 0p ); } 225 long double _Complex ato( const char * sptr ) { return strto( sptr, 0p ); } 226 226 } // distribution 227 227 -
longrun_tests/Makefile.in
rb798713 rf80f840 486 486 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 487 487 $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \ 488 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \ 489 $(AM_CFLAGS) $(CFLAGS) 488 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS) 490 489 491 490 AM_V_CFA = $(am__v_CFA_@AM_V@) -
src/Concurrency/Keywords.cc
rb798713 rf80f840 309 309 if( !type_decl ) SemanticError( cast, context_error ); 310 310 if( !dtor_decl ) SemanticError( cast, context_error ); 311 Expression * arg = cast->arg; 312 cast->arg = nullptr; 313 delete cast; 314 return new CastExpr( 315 UntypedExpr::createDeref( 316 new UntypedExpr( new NameExpr( getter_name ), { arg } ) 317 ), 318 new ReferenceType( 319 noQualifiers, 320 new StructInstType( noQualifiers, type_decl ) ) 321 ); 311 assert( cast->result == nullptr ); 312 cast->set_result( new ReferenceType( noQualifiers, new StructInstType( noQualifiers, type_decl ) ) ); 313 cast->concrete_target.field = field_name; 314 cast->concrete_target.getter = getter_name; 322 315 } 323 316 return cast; -
src/Parser/parser.yy
rb798713 rf80f840 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : S un Aug 4 21:48:23201913 // Update Count : 43 6412 // Last Modified On : Sat Dec 7 10:43:44 2019 13 // Update Count : 4394 14 14 // 15 15 … … 211 211 } // forCtrl 212 212 213 KeywordCastExpr::Target Aggregate2Target( DeclarationNode::Aggregate aggr ) { 214 KeywordCastExpr::Target target; 215 switch ( aggr ) { 216 case DeclarationNode::Coroutine: target = KeywordCastExpr::Coroutine; break; 217 case DeclarationNode::Monitor: target = KeywordCastExpr::Monitor; break; 218 case DeclarationNode::Thread: target = KeywordCastExpr::Thread; break; 219 default: abort(); 220 } // switch 221 return target; 222 } // Aggregate2Target 223 213 224 214 225 bool forall = false, yyy = false; // aggregate have one or more forall qualifiers ? … … 365 376 %type<decl> abstract_parameter_declaration 366 377 367 %type<aggKey> aggregate_key 378 %type<aggKey> aggregate_key aggregate_data aggregate_control 368 379 %type<decl> aggregate_type aggregate_type_nobody 369 380 … … 650 661 | postfix_expression '.' '[' field_name_list ']' // CFA, tuple field selector 651 662 { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $4 ) ) ); } 663 | postfix_expression '.' aggregate_control 664 { $$ = new ExpressionNode( build_keyword_cast( Aggregate2Target( $3 ), $1 ) ); } 652 665 | postfix_expression ARROW identifier 653 666 { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); } … … 793 806 | '(' type_no_function ')' cast_expression 794 807 { $$ = new ExpressionNode( build_cast( $2, $4 ) ); } 795 // keyword cast cannot be grouped because of reduction in aggregate_key 796 | '(' GENERATOR '&' ')' cast_expression // CFA 797 { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); } 798 | '(' COROUTINE '&' ')' cast_expression // CFA 799 { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); } 800 | '(' THREAD '&' ')' cast_expression // CFA 801 { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Thread, $5 ) ); } 802 | '(' MONITOR '&' ')' cast_expression // CFA 803 { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Monitor, $5 ) ); } 808 | '(' aggregate_control '&' ')' cast_expression // CFA 809 { $$ = new ExpressionNode( build_keyword_cast( Aggregate2Target( $2 ), $5 ) ); } 804 810 // VIRTUAL cannot be opt because of look ahead issues 805 811 | '(' VIRTUAL ')' cast_expression // CFA … … 2059 2065 2060 2066 aggregate_key: 2067 aggregate_data 2068 | aggregate_control 2069 ; 2070 2071 aggregate_data: 2061 2072 STRUCT 2062 2073 { yyy = true; $$ = DeclarationNode::Struct; } 2063 2074 | UNION 2064 2075 { yyy = true; $$ = DeclarationNode::Union; } 2065 | EXCEPTION 2076 | EXCEPTION // CFA 2066 2077 { yyy = true; $$ = DeclarationNode::Exception; } 2067 | GENERATOR 2078 ; 2079 2080 aggregate_control: // CFA 2081 GENERATOR 2068 2082 { yyy = true; $$ = DeclarationNode::Coroutine; } 2069 2083 | COROUTINE … … 2096 2110 distInl( $3 ); 2097 2111 } 2112 | INLINE aggregate_control ';' // CFA 2113 { SemanticError( yylloc, "INLINE aggregate control currently unimplemented." ); $$ = nullptr; } 2098 2114 | typedef_declaration ';' // CFA 2099 2115 | cfa_field_declaring_list ';' // CFA, new style field declaration -
src/ResolvExpr/AlternativeFinder.cc
rb798713 rf80f840 69 69 void postvisit( CastExpr * castExpr ); 70 70 void postvisit( VirtualCastExpr * castExpr ); 71 void postvisit( KeywordCastExpr * castExpr ); 71 72 void postvisit( UntypedMemberExpr * memberExpr ); 72 73 void postvisit( MemberExpr * memberExpr ); … … 1255 1256 } 1256 1257 1258 void AlternativeFinder::Finder::postvisit( KeywordCastExpr * castExpr ) { 1259 assertf( castExpr->get_result(), "Cast target should have been set in Validate." ); 1260 auto ref = dynamic_cast<ReferenceType*>(castExpr->get_result()); 1261 assert(ref); 1262 auto inst = dynamic_cast<StructInstType*>(ref->base); 1263 assert(inst); 1264 auto target = inst->baseStruct; 1265 1266 AlternativeFinder finder( indexer, env ); 1267 1268 auto pick_alternatives = [target, this](AltList & found, bool expect_ref) { 1269 for(auto & alt : found) { 1270 Type * expr = alt.expr->get_result(); 1271 if(expect_ref) { 1272 auto res = dynamic_cast<ReferenceType*>(expr); 1273 if(!res) { continue; } 1274 expr = res->base; 1275 } 1276 1277 if(auto insttype = dynamic_cast<TypeInstType*>(expr)) { 1278 auto td = alt.env.lookup(insttype->name); 1279 if(!td) { continue; } 1280 expr = td->type; 1281 } 1282 1283 if(auto base = dynamic_cast<StructInstType*>(expr)) { 1284 if(base->baseStruct == target) { 1285 alternatives.push_back( 1286 std::move(alt) 1287 ); 1288 } 1289 } 1290 } 1291 }; 1292 1293 try { 1294 // Attempt 1 : turn (thread&)X into (thread_desc&)X.__thrd 1295 // Clone is purely for memory management 1296 std::unique_ptr<Expression> tech1 { new UntypedMemberExpr(new NameExpr(castExpr->concrete_target.field), castExpr->arg->clone()) }; 1297 1298 // don't prune here, since it's guaranteed all alternatives will have the same type 1299 finder.findWithoutPrune( tech1.get() ); 1300 pick_alternatives(finder.alternatives, false); 1301 1302 return; 1303 } catch(SemanticErrorException & ) {} 1304 1305 // Fallback : turn (thread&)X into (thread_desc&)get_thread(X) 1306 std::unique_ptr<Expression> fallback { UntypedExpr::createDeref( new UntypedExpr(new NameExpr(castExpr->concrete_target.getter), { castExpr->arg->clone() })) }; 1307 // don't prune here, since it's guaranteed all alternatives will have the same type 1308 finder.findWithoutPrune( fallback.get() ); 1309 1310 pick_alternatives(finder.alternatives, true); 1311 1312 // Whatever happens here, we have no more fallbacks 1313 } 1314 1257 1315 namespace { 1258 1316 /// Gets name from untyped member expression (member must be NameExpr) -
src/SynTree/Expression.h
rb798713 rf80f840 231 231 enum Target { 232 232 Coroutine, Thread, Monitor, NUMBER_OF_TARGETS 233 } target; 233 }; 234 struct Concrete { 235 std::string field; 236 std::string getter; 237 }; 238 Target target; 239 Concrete concrete_target; 234 240 235 241 KeywordCastExpr( Expression * arg, Target target ); -
src/cfa.make
rb798713 rf80f840 4 4 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 5 5 $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \ 6 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \ 7 $(AM_CFLAGS) $(CFLAGS) 6 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS) 8 7 9 8 AM_V_CFA = $(am__v_CFA_@AM_V@) -
tests/Makefile.am
rb798713 rf80f840 46 46 47 47 # adjust CC to current flags 48 CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})48 CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS}) 49 49 CFACC = $(CC) 50 50 … … 53 53 54 54 # adjusted CC but without the actual distcc call 55 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})55 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS}) 56 56 57 57 PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} && -
tests/Makefile.in
rb798713 rf80f840 214 214 215 215 # adjust CC to current flags 216 CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})216 CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS}) 217 217 CCAS = @CCAS@ 218 218 CCASDEPMODE = @CCASDEPMODE@ … … 358 358 LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ 359 359 $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \ 360 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \ 361 $(AM_CFLAGS) $(CFLAGS) 360 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS) 362 361 363 362 AM_V_CFA = $(am__v_CFA_@AM_V@) … … 405 404 406 405 # adjusted CC but without the actual distcc call 407 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ,$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})406 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS}) 408 407 PRETTY_PATH = mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} && 409 408 avl_test_SOURCES = avltree/avl_test.cfa avltree/avl0.cfa avltree/avl1.cfa avltree/avl2.cfa avltree/avl3.cfa avltree/avl4.cfa avltree/avl-private.cfa -
tests/concurrent/thread.cfa
rb798713 rf80f840 7 7 thread Second { semaphore* lock; }; 8 8 9 void ?{}( First & this, semaphore & lock ) { ((thread&)this){ "Thread 1"}; this.lock = &lock; }10 void ?{}( Second & this, semaphore & lock ) { ((thread&)this){ "Thread 2"}; this.lock = &lock; }9 void ?{}( First & this, semaphore & lock ) { ((thread&)this){ "Thread 1" }; this.lock = &lock; } 10 void ?{}( Second & this, semaphore & lock ) { ((thread&)this){ "Thread 2" }; this.lock = &lock; } 11 11 12 12 void main(First& this) { -
tests/linking/withthreads.cfa
rb798713 rf80f840 34 34 // Local Variables: // 35 35 // tab-width: 4 // 36 // compile-command: "cfa nothreads.cfa" //36 // compile-command: "cfa withthreads.cfa" // 37 37 // End: // -
tests/references.cfa
rb798713 rf80f840 124 124 int *p = &a; 125 125 asm ( 126 "incl %[p]\n\t" :127 : [p] " m" (*p)126 "incl %[p]\n\t" 127 : [p] "+m" (*p) 128 128 ); 129 129 printf("%d\n", a); -
tests/time.cfa
rb798713 rf80f840 10 10 // Created On : Tue Mar 27 17:24:56 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Dec 20 23:09:21 201813 // Update Count : 2 312 // Last Modified On : Fri Nov 29 23:05:30 2019 13 // Update Count : 24 14 14 // 15 15 … … 20 20 Duration d1 = 3`h, d2 = 2`s, d3 = 3.375`s, d4 = 12`s, d5 = 1`s + 10_000`ns; 21 21 sout | d1 | d2 | d3 | d4 | d5; 22 int i;23 22 d1 = 0; 24 23 sout | d1 | d2 | d3;
Note: See TracChangeset
for help on using the changeset viewer.