- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/pthread.cfa
r555af62 r9d47c1f 20 20 #include <errno.h> 21 21 #include "locks.hfa" 22 #include "bits/stack.hfa"23 #include "bits/sequence.hfa"24 25 22 26 23 #define check_nonnull(x) asm("": "+rm"(x)); if( x == 0p ) return EINVAL; … … 34 31 35 32 struct pthread_values{ 36 inline Seqable;33 inline dlink(pthread_values); 37 34 void * value; 38 35 bool in_use; 39 36 }; 40 41 static inline { 42 pthread_values *& Back( pthread_values * n ) { 43 return (pthread_values *)Back( (Seqable *)n ); 44 } 45 46 pthread_values *& Next( pthread_values * n ) { 47 return (pthread_values *)Next( (Colable *)n ); 48 } 49 } 37 P9_EMBEDDED( pthread_values, dlink(pthread_values) ) 50 38 51 39 struct pthread_keys { 52 40 bool in_use; 53 41 void (* destructor)( void * ); 54 Sequence(pthread_values) threads;42 dlist( pthread_values ) threads; 55 43 }; 56 44 … … 78 66 79 67 struct Pthread_kernel_threads{ 80 inline Colable;68 inline dlink(Pthread_kernel_threads); 81 69 processor p; 82 70 }; 83 84 Pthread_kernel_threads *& Next( Pthread_kernel_threads * n ) { 85 return (Pthread_kernel_threads *)Next( (Colable *)n ); 86 } 87 88 static Stack(Pthread_kernel_threads) cfa_pthreads_kernel_threads; 71 P9_EMBEDDED( Pthread_kernel_threads, dlink(Pthread_kernel_threads) ) 72 73 static dlist(Pthread_kernel_threads) cfa_pthreads_kernel_threads; 89 74 static bool cfa_pthreads_kernel_threads_zero = false; // set to zero ? 90 75 static int cfa_pthreads_no_kernel_threads = 1; // number of kernel threads … … 231 216 key = &cfa_pthread_keys[i]; 232 217 value->in_use = false; 233 remove(key->threads, *value); 218 remove(*value); 219 234 220 // if a key value has a non-NULL destructor pointer, and the thread has a non-NULL value associated with that key, 235 221 // the value of the key is set to NULL, and then the function pointed to is called with the previously associated value as its sole argument. … … 551 537 552 538 // Remove key from all threads with a value. 553 pthread_values& p; 554 Sequence(pthread_values)& head = cfa_pthread_keys[key].threads; 555 for ( SeqIter(pthread_values) iter = { head }; iter | p; ) { 556 remove(head, p); 557 p.in_use = false; 558 } 539 540 // Sequence(pthread_values)& head = cfa_pthread_keys[key].threads; 541 // for ( SeqIter(pthread_values) iter = { head }; iter | p; ) { 542 // remove(head, p); 543 // p.in_use = false; 544 // } 545 pthread_values * p = &try_pop_front( cfa_pthread_keys[key].threads ); 546 for ( ; p; ) { 547 p->in_use = false; 548 p = &try_pop_front( cfa_pthread_keys[key].threads ); 549 } 559 550 unlock(key_lock); 560 551 return 0; … … 585 576 if ( ! entry.in_use ) { 586 577 entry.in_use = true; 587 add(cfa_pthread_keys[key].threads, entry);578 insert_last(cfa_pthread_keys[key].threads, entry); 588 579 } // if 589 580 entry.value = (void *)value; … … 612 603 //######################### Parallelism ######################### 613 604 void pthread_delete_kernel_threads_() __THROW { // see uMain::~uMain 614 Pthread_kernel_threads& p; 615 for ( StackIter(Pthread_kernel_threads) iter = {cfa_pthreads_kernel_threads}; iter | p; ) { 616 delete(&p); 605 Pthread_kernel_threads * p = &try_pop_front(cfa_pthreads_kernel_threads); 606 for ( ; p; ) { 607 delete(p); 608 p = &try_pop_front(cfa_pthreads_kernel_threads); 617 609 } // for 618 610 } // pthread_delete_kernel_threads_ … … 631 623 lock( concurrency_lock ); 632 624 for ( ; new_level > cfa_pthreads_no_kernel_threads; cfa_pthreads_no_kernel_threads += 1 ) { // add processors ? 633 push(cfa_pthreads_kernel_threads, *new() );625 insert_last(cfa_pthreads_kernel_threads, *new() ); 634 626 } // for 635 627 for ( ; new_level < cfa_pthreads_no_kernel_threads; cfa_pthreads_no_kernel_threads -= 1 ) { // remove processors ? 636 delete(& pop(cfa_pthreads_kernel_threads));628 delete(&try_pop_front(cfa_pthreads_kernel_threads)); 637 629 } // for 638 630 unlock( concurrency_lock );
Note: See TracChangeset
for help on using the changeset viewer.