Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/pthread.cfa

    r555af62 r9d47c1f  
    2020#include <errno.h>
    2121#include "locks.hfa"
    22 #include "bits/stack.hfa"
    23 #include "bits/sequence.hfa"
    24 
    2522
    2623#define check_nonnull(x) asm("": "+rm"(x)); if( x == 0p ) return EINVAL;
     
    3431
    3532struct pthread_values{
    36         inline Seqable;
     33        inline dlink(pthread_values);
    3734        void * value;
    3835        bool in_use;
    3936};
    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 }
     37P9_EMBEDDED( pthread_values, dlink(pthread_values) )
    5038
    5139struct pthread_keys {
    5240        bool in_use;
    5341        void (* destructor)( void * );
    54         Sequence(pthread_values) threads;
     42    dlist( pthread_values ) threads;
    5543};
    5644
     
    7866
    7967struct Pthread_kernel_threads{
    80         inline Colable;
     68        inline dlink(Pthread_kernel_threads);
    8169        processor p;
    8270};
    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;
     71P9_EMBEDDED( Pthread_kernel_threads, dlink(Pthread_kernel_threads) )
     72
     73static dlist(Pthread_kernel_threads) cfa_pthreads_kernel_threads;
    8974static bool cfa_pthreads_kernel_threads_zero = false;   // set to zero ?
    9075static int cfa_pthreads_no_kernel_threads = 1;  // number of kernel threads
     
    231216                                        key = &cfa_pthread_keys[i];
    232217                                        value->in_use = false;
    233                                         remove(key->threads, *value);
     218                                        remove(*value);
     219
    234220                                        // if  a  key  value  has  a  non-NULL  destructor pointer,  and  the  thread  has  a  non-NULL  value associated with that key,
    235221                                        // 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.
     
    551537
    552538                // 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        }
    559550                unlock(key_lock);
    560551                return 0;
     
    585576                if ( ! entry.in_use ) {
    586577                        entry.in_use = true;
    587                         add(cfa_pthread_keys[key].threads, entry);
     578                        insert_last(cfa_pthread_keys[key].threads, entry);
    588579                } // if
    589580                entry.value = (void *)value;
     
    612603        //######################### Parallelism #########################
    613604        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);
    617609                } // for
    618610        } // pthread_delete_kernel_threads_
     
    631623                lock( concurrency_lock );
    632624                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() );
    634626                } // for
    635627                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));
    637629                } // for
    638630                unlock( concurrency_lock );
Note: See TracChangeset for help on using the changeset viewer.