Changes in / [ce7bdc4:78cdb06]
- Files:
-
- 13 edited
-
libcfa/src/concurrency/coroutine.cfa (modified) (2 diffs)
-
libcfa/src/concurrency/invoke.h (modified) (2 diffs)
-
libcfa/src/concurrency/kernel.cfa (modified) (5 diffs)
-
libcfa/src/concurrency/kernel.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/preemption.cfa (modified) (13 diffs)
-
libcfa/src/fstream.cfa (modified) (3 diffs)
-
libcfa/src/fstream.hfa (modified) (3 diffs)
-
libcfa/src/heap.cfa (modified) (3 diffs)
-
libcfa/src/interpose.cfa (modified) (2 diffs)
-
libcfa/src/startup.cfa (modified) (1 diff)
-
libcfa/src/stdlib.hfa (modified) (2 diffs)
-
tests/concurrent/thread.cfa (modified) (1 diff)
-
tests/time.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Mon Nov 28 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Nov 30 09:59:36 201913 // Update Count : 1412 // Last Modified On : Fri Mar 30 17:20:57 2018 13 // Update Count : 9 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){ 0p, 0p};92 (this.context){NULL, NULL}; 93 93 (this.stack){storage, storageSize}; 94 94 this.name = name; 95 95 state = Start; 96 starter = 0p;97 last = 0p;98 cancellation = 0p;96 starter = NULL; 97 last = NULL; 98 cancellation = NULL; 99 99 } 100 100 -
libcfa/src/concurrency/invoke.h
rce7bdc4 r78cdb06 10 10 // Created On : Tue Jan 17 12:27:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Nov 28 22:34:07201913 // Update Count : 4 112 // Last Modified On : Sat Jun 22 18:19:13 2019 13 // Update Count : 40 14 14 // 15 15 … … 51 51 52 52 struct { 53 void * stack;54 53 volatile unsigned short disable_count; 55 54 volatile bool enabled; -
libcfa/src/concurrency/kernel.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Tue Jan 17 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 29 17:59:16201913 // Update Count : 3512 // Last Modified On : Thu Nov 21 16:46:59 2019 13 // Update Count : 27 14 14 // 15 15 … … 26 26 #include <signal.h> 27 27 #include <unistd.h> 28 #include <limits.h> // PTHREAD_STACK_MIN29 28 } 30 29 … … 134 133 NULL, 135 134 NULL, 136 { NULL,1, false, false },135 { 1, false, false }, 137 136 6u //this should be seeded better but due to a bug calling rdtsc doesn't work 138 137 }; … … 234 233 235 234 pthread_join( kernel_thread, NULL ); 236 free( this.stack );237 235 } 238 236 … … 447 445 __cfaabi_dbg_print_safe("Kernel : Starting core %p\n", this); 448 446 449 pthread_attr_t attr; 450 int ret; 451 ret = pthread_attr_init( &attr ); // initialize attribute 452 if ( ret ) { 453 abort( "%s : internal error, pthread_attr_init failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 454 } // if 455 456 size_t stacksize; 457 ret = pthread_attr_getstacksize( &attr, &stacksize ); // default stack size, normally defined by shell limit 458 if ( ret ) { 459 abort( "%s : internal error, pthread_attr_getstacksize failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 460 } // if 461 assert( stacksize >= PTHREAD_STACK_MIN ); 462 463 this->stack = malloc( stacksize ); 464 ret = pthread_attr_setstack( &attr, this->stack, stacksize ); 465 if ( ret ) { 466 abort( "%s : internal error, pthread_attr_setstack failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 467 } // if 468 469 ret = pthread_create( &this->kernel_thread, &attr, CtxInvokeProcessor, (void *)this ); 470 if ( ret ) { 471 abort( "%s : internal error, pthread_create failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 472 } // if 473 // pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this ); 447 pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this ); 474 448 475 449 __cfaabi_dbg_print_safe("Kernel : core %p started\n", this); -
libcfa/src/concurrency/kernel.hfa
rce7bdc4 r78cdb06 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 28 21:24:12201913 // Update Count : 1 712 // Last Modified On : Sat Jun 22 11:39:17 2019 13 // Update Count : 16 14 14 // 15 15 … … 135 135 semaphore terminated; 136 136 137 // pthread Stack138 void * stack;139 140 137 // Link lists fields 141 138 struct __dbg_node_proc { -
libcfa/src/concurrency/preemption.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Mon Jun 5 14:20:42 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Nov 30 08:02:56 201913 // Update Count : 3 912 // Last Modified On : Tue Jun 5 17:35:49 2018 13 // Update Count : 37 14 14 // 15 15 … … 24 24 #include <string.h> 25 25 #include <unistd.h> 26 #include <limits.h> // PTHREAD_STACK_MIN27 26 } 28 27 … … 82 81 // Get next expired node 83 82 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) { 84 if( !alarms->head ) return 0p;// If no alarms return null85 if( alarms->head->alarm >= currtime ) return 0p;// If alarms head not expired return null86 return pop(alarms); // Otherwise just pop head83 if( !alarms->head ) return NULL; // If no alarms return null 84 if( alarms->head->alarm >= currtime ) return NULL; // If alarms head not expired return null 85 return pop(alarms); // Otherwise just pop head 87 86 } 88 87 89 88 // Tick one frame of the Discrete Event Simulation for alarms 90 89 static void tick_preemption() { 91 alarm_node_t * node = 0p;// Used in the while loop but cannot be declared in the while condition92 alarm_list_t * alarms = &event_kernel->alarms; // Local copy for ease of reading93 Time currtime = __kernel_get_time(); // Check current time once soeverything "happens at once"90 alarm_node_t * node = NULL; // Used in the while loop but cannot be declared in the while condition 91 alarm_list_t * alarms = &event_kernel->alarms; // Local copy for ease of reading 92 Time currtime = __kernel_get_time(); // Check current time once so we everything "happens at once" 94 93 95 94 //Loop throught every thing expired … … 244 243 sigaddset( &mask, sig ); 245 244 246 if ( pthread_sigmask( SIG_UNBLOCK, &mask, 0p) == -1 ) {245 if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) { 247 246 abort( "internal error, pthread_sigmask" ); 248 247 } … … 255 254 sigaddset( &mask, sig ); 256 255 257 if ( pthread_sigmask( SIG_BLOCK, &mask, 0p) == -1 ) {256 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) { 258 257 abort( "internal error, pthread_sigmask" ); 259 258 } … … 302 301 303 302 // Setup proper signal handlers 304 __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler303 __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // CtxSwitch handler 305 304 306 305 signal_block( SIGALRM ); 307 306 308 pthread_attr_t attr; 309 int ret; 310 ret = pthread_attr_init( &attr ); // initialize attribute 311 if ( ret ) { 312 abort( "%s : internal error, pthread_attr_init failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 313 } // if 314 315 size_t stacksize; 316 ret = pthread_attr_getstacksize( &attr, &stacksize ); // default stack size, normally defined by shell limit 317 if ( ret ) { 318 abort( "%s : internal error, pthread_attr_getstacksize failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 319 } // if 320 assert( stacksize >= PTHREAD_STACK_MIN ); 321 322 kernelTLS.preemption_state.stack = malloc( stacksize ); 323 ret = pthread_attr_setstack( &attr, kernelTLS.preemption_state.stack, stacksize ); 324 if ( ret ) { 325 abort( "%s : internal error, pthread_attr_setstack failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 326 } // if 327 328 ret = pthread_create( &alarm_thread, &attr, alarm_loop, 0p ); 329 if ( ret ) { 330 abort( "%s : internal error, pthread_create failed, error(%d) %s.", __PRETTY_FUNCTION__, ret, strerror( ret ) ); 331 } // if 307 pthread_create( &alarm_thread, NULL, alarm_loop, NULL ); 332 308 } 333 309 … … 340 316 sigset_t mask; 341 317 sigfillset( &mask ); 342 sigprocmask( SIG_BLOCK, &mask, 0p);318 sigprocmask( SIG_BLOCK, &mask, NULL ); 343 319 344 320 // Notify the alarm thread of the shutdown … … 347 323 348 324 // Wait for the preemption thread to finish 349 350 pthread_join( alarm_thread, 0p ); 351 free( kernelTLS.preemption_state.stack ); 325 pthread_join( alarm_thread, NULL ); 352 326 353 327 // Preemption is now fully stopped … … 406 380 static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" ); 407 381 #endif 408 if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), 0p) == -1 ) {382 if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL ) == -1 ) { 409 383 abort( "internal error, sigprocmask" ); 410 384 } … … 425 399 sigset_t mask; 426 400 sigfillset(&mask); 427 if ( pthread_sigmask( SIG_BLOCK, &mask, 0p) == -1 ) {401 if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) { 428 402 abort( "internal error, pthread_sigmask" ); 429 403 } … … 446 420 {__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );} 447 421 continue; 448 case EINVAL :422 case EINVAL : 449 423 abort( "Timeout was invalid." ); 450 424 default: … … 479 453 EXIT: 480 454 __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n" ); 481 return 0p;455 return NULL; 482 456 } 483 457 … … 492 466 sigset_t oldset; 493 467 int ret; 494 ret = pthread_sigmask(0, 0p, &oldset);468 ret = pthread_sigmask(0, NULL, &oldset); 495 469 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 496 470 -
libcfa/src/fstream.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 29 06:56:46 201913 // Update Count : 35 512 // Last Modified On : Tue Sep 10 22:19:56 2019 13 // Update Count : 354 14 14 // 15 15 … … 66 66 } // ?{} 67 67 68 void ^?{}( ofstream & os ) {69 close( os );70 } // ^?{}71 72 68 void sepOn( ofstream & os ) { os.sepOnOff = ! getNL( os ); } 73 69 void sepOff( ofstream & os ) { os.sepOnOff = false; } … … 199 195 } // ?{} 200 196 201 void ^?{}( ifstream & is ) {202 close( is );203 } // ^?{}204 205 197 void nlOn( ifstream & os ) { os.nlOnOff = true; } 206 198 void nlOff( ifstream & os ) { os.nlOnOff = false; } -
libcfa/src/fstream.hfa
rce7bdc4 r78cdb06 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 29 06:56:02201913 // Update Count : 16 812 // Last Modified On : Mon Jul 15 18:10:23 2019 13 // Update Count : 167 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 );75 74 76 75 extern ofstream & sout, & stdout, & serr, & stderr; // aliases … … 102 101 void ?{}( ifstream & is, const char * name, const char * mode ); 103 102 void ?{}( ifstream & is, const char * name ); 104 void ^?{}( ifstream & is );105 103 106 104 extern ifstream & sin, & stdin; // aliases -
libcfa/src/heap.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Tue Dec 19 21:58:35 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 29 17:33:58201913 // Update Count : 6 4112 // Last Modified On : Sun Nov 24 17:56:15 2019 13 // Update Count : 638 14 14 // 15 15 … … 71 71 72 72 73 // static bool traceHeapTerm = false; 74 75 // inline bool traceHeapTerm() { 76 // return traceHeapTerm; 77 // } // traceHeapTerm 78 79 // bool traceHeapTermOn() { 80 // bool temp = traceHeapTerm; 81 // traceHeapTerm = true; 82 // return temp; 83 // } // traceHeapTermOn 84 85 // bool traceHeapTermOff() { 86 // bool temp = traceHeapTerm; 87 // traceHeapTerm = false; 88 // return temp; 89 // } // traceHeapTermOff 90 91 73 92 enum { 74 93 // Define the default extension heap amount in units of bytes. When the uC++ supplied heap reaches the brk address, … … 96 115 if ( allocFree != 0 ) { 97 116 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT. 98 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 pid102 __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug117 // 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 pid 121 // __cfaabi_dbg_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug 103 122 } // if 104 123 } // prtUnfreed -
libcfa/src/interpose.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Nov 30 07:09:42 201913 // Update Count : 11 912 // Last Modified On : Thu Nov 21 16:47:02 2019 13 // Update Count : 118 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 != 0p; i += 1 ) {199 char * name = 0p, * offset_begin = 0p, * offset_end = 0p;198 for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) { 199 char * name = NULL, * offset_begin = NULL, * offset_end = NULL; 200 200 201 201 for ( char * p = messages[i]; *p; ++p ) { -
libcfa/src/startup.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Tue Jul 24 16:21:57 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Nov 30 07:07:56 201913 // Update Count : 1 312 // Last Modified On : Wed Jul 25 16:42:01 2018 13 // Update Count : 11 14 14 // 15 15 16 16 #include "startup.hfa" 17 #include <time.h> // tzset 17 #include <unistd.h> 18 18 19 19 20 extern "C" { 20 21 static void __cfaabi_appready_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_APPREADY ) )); 21 22 void __cfaabi_appready_startup( void ) { 22 tzset(); // initialize time global variables23 23 #ifdef __CFA_DEBUG__ 24 24 extern void heapAppStart(); -
libcfa/src/stdlib.hfa
rce7bdc4 r78cdb06 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 9 23:08:02201913 // Update Count : 40012 // Last Modified On : Fri Nov 22 15:13:14 2019 13 // Update Count : 399 14 14 // 15 15 … … 210 210 211 211 static inline { 212 int ato( const char * sptr ) { return (int)strtol( sptr, 0 p, 10 ); }213 unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0 p, 10 ); }214 long int ato( const char * sptr ) { return strtol( sptr, 0 p, 10 ); }215 unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0 p, 10 ); }216 long long int ato( const char * sptr ) { return strtoll( sptr, 0 p, 10 ); }217 unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0 p, 10 ); }218 219 float ato( const char * sptr ) { return strtof( sptr, 0 p); }220 double ato( const char * sptr ) { return strtod( sptr, 0 p); }221 long double ato( const char * sptr ) { return strtold( sptr, 0 p); }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); }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 ); } 226 226 } // distribution 227 227 -
tests/concurrent/thread.cfa
rce7bdc4 r78cdb06 7 7 thread Second { semaphore* lock; }; 8 8 9 void ?{}( First & this, semaphore & lock ) { ((thread&)this) .self_cor.name = "Thread 1"; this.lock = &lock; }10 void ?{}( Second & this, semaphore & lock ) { ((thread&)this) .self_cor.name = "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/time.cfa
rce7bdc4 r78cdb06 10 10 // Created On : Tue Mar 27 17:24:56 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 29 23:05:30 201913 // Update Count : 2 412 // Last Modified On : Thu Dec 20 23:09:21 2018 13 // Update Count : 23 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; 22 23 d1 = 0; 23 24 sout | d1 | d2 | d3;
Note:
See TracChangeset
for help on using the changeset viewer.