Changes in / [f5478c8:3de176d]


Ignore:
Location:
src
Files:
4 deleted
18 edited

Legend:

Unmodified
Added
Removed
  • src/Concurrency/Waitfor.cc

    rf5478c8 r3de176d  
    416416                                makeAccStatement( acceptables, index, "is_dtor", detectIsDtor( clause.target.function )                                    , indexer ),
    417417                                makeAccStatement( acceptables, index, "func"   , new CastExpr( clause.target.function, fptr_t )                            , indexer ),
    418                                 makeAccStatement( acceptables, index, "data"   , new VariableExpr( monitors )                                              , indexer ),
     418                                makeAccStatement( acceptables, index, "list"   , new VariableExpr( monitors )                                              , indexer ),
    419419                                makeAccStatement( acceptables, index, "size"   , new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ), indexer ),
    420420                                setter->clone()
  • src/benchmark/Makefile.am

    rf5478c8 r3de176d  
    9494        ctxswitch-cfa_thread.run        \
    9595        ctxswitch-upp_coroutine.run     \
    96         ctxswitch-upp_thread.run        \
    97         ctxswitch-goroutine.run         \
    98         ctxswitch-java_thread.run
     96        ctxswitch-upp_thread.run
    9997
    10098ctxswitch-cfa_coroutine$(EXEEXT):
     
    112110ctxswitch-pthread$(EXEEXT):
    113111        @@BACKEND_CC@ ctxswitch/pthreads.c  -DBENCH_N=50000000  -I. -lrt -pthread                    ${AM_CFLAGS} ${CFLAGS} ${ccflags}
    114 
    115 ctxswitch-goroutine$(EXEEXT):
    116         @go build -o a.out ctxswitch/goroutine.go
    117 
    118 ctxswitch-java_thread$(EXEEXT):
    119         @javac ctxswitch/JavaThread.java
    120         @echo "#!/bin/sh" > a.out
    121         @echo "cd ctxswitch && java JavaThread" >> a.out
    122         @chmod a+x a.out
    123112
    124113## =========================================================================================================
     
    194183        creation-cfa_thread.run                 \
    195184        creation-upp_coroutine.run              \
    196         creation-upp_thread.run                 \
    197         creation-goroutine.run                  \
    198         creation-java_thread.run
     185        creation-upp_thread.run
    199186
    200187creation-cfa_coroutine$(EXEEXT):
     
    215202creation-pthread$(EXEEXT):
    216203        @@BACKEND_CC@ creation/pthreads.c  -DBENCH_N=250000     -I. -lrt -pthread                    ${AM_CFLAGS} ${CFLAGS} ${ccflags}
    217 
    218 creation-goroutine$(EXEEXT):
    219         @go build -o a.out creation/goroutine.go
    220 
    221 creation-java_thread$(EXEEXT):
    222         @javac creation/JavaThread.java
    223         @echo "#!/bin/sh" > a.out
    224         @echo "cd creation && java JavaThread" >> a.out
    225         @chmod a+x a.out
    226204
    227205## =========================================================================================================
  • src/benchmark/Makefile.in

    rf5478c8 r3de176d  
    507507        ctxswitch-cfa_thread.run        \
    508508        ctxswitch-upp_coroutine.run     \
    509         ctxswitch-upp_thread.run        \
    510         ctxswitch-goroutine.run         \
    511         ctxswitch-java_thread.run
     509        ctxswitch-upp_thread.run
    512510
    513511ctxswitch-cfa_coroutine$(EXEEXT):
     
    525523ctxswitch-pthread$(EXEEXT):
    526524        @@BACKEND_CC@ ctxswitch/pthreads.c  -DBENCH_N=50000000  -I. -lrt -pthread                    ${AM_CFLAGS} ${CFLAGS} ${ccflags}
    527 
    528 ctxswitch-goroutine$(EXEEXT):
    529         @go build -o a.out ctxswitch/goroutine.go
    530 
    531 ctxswitch-java_thread$(EXEEXT):
    532         @javac ctxswitch/JavaThread.java
    533         @echo "#!/bin/sh" > a.out
    534         @echo "cd ctxswitch && java JavaThread" >> a.out
    535         @chmod a+x a.out
    536525
    537526mutex$(EXEEXT) :\
     
    603592        creation-cfa_thread.run                 \
    604593        creation-upp_coroutine.run              \
    605         creation-upp_thread.run                 \
    606         creation-goroutine.run                  \
    607         creation-java_thread.run
     594        creation-upp_thread.run
    608595
    609596creation-cfa_coroutine$(EXEEXT):
     
    624611creation-pthread$(EXEEXT):
    625612        @@BACKEND_CC@ creation/pthreads.c  -DBENCH_N=250000     -I. -lrt -pthread                    ${AM_CFLAGS} ${CFLAGS} ${ccflags}
    626 
    627 creation-goroutine$(EXEEXT):
    628         @go build -o a.out creation/goroutine.go
    629 
    630 creation-java_thread$(EXEEXT):
    631         @javac creation/JavaThread.java
    632         @echo "#!/bin/sh" > a.out
    633         @echo "cd creation && java JavaThread" >> a.out
    634         @chmod a+x a.out
    635613
    636614compile$(EXEEXT) :\
  • src/benchmark/bench.h

    rf5478c8 r3de176d  
    11#pragma once
    22
    3 #if defined(__cforall)
     3#if defined(__CFORALL__)
    44extern "C" {
    55#endif
     
    88        #include <sys/times.h>                                  // times
    99        #include <time.h>
    10 #if defined(__cforall)
     10#if defined(__CFORALL__)
    1111}
    1212#endif
  • src/libcfa/Makefile.am

    rf5478c8 r3de176d  
    100100        math                            \
    101101        gmp                             \
    102         bits/containers.h               \
    103102        bits/defs.h             \
    104103        bits/locks.h            \
  • src/libcfa/Makefile.in

    rf5478c8 r3de176d  
    264264        containers/result containers/vector concurrency/coroutine \
    265265        concurrency/thread concurrency/kernel concurrency/monitor \
    266         ${shell echo stdhdr/*} math gmp bits/containers.h bits/defs.h \
    267         bits/locks.h concurrency/invoke.h libhdr.h libhdr/libalign.h \
     266        ${shell echo stdhdr/*} math gmp bits/defs.h bits/locks.h \
     267        concurrency/invoke.h libhdr.h libhdr/libalign.h \
    268268        libhdr/libdebug.h libhdr/libtools.h
    269269HEADERS = $(nobase_cfa_include_HEADERS)
     
    437437        math                            \
    438438        gmp                             \
    439         bits/containers.h               \
    440439        bits/defs.h             \
    441440        bits/locks.h            \
  • src/libcfa/bits/containers.h

    rf5478c8 r3de176d  
    1515#pragma once
    1616
    17 #include "bits/defs.h"
     17#include <stddef.h>
     18
    1819#include "libhdr.h"
    19 
    20 //-----------------------------------------------------------------------------
    21 // Array
    22 //-----------------------------------------------------------------------------
    23 
    24 #ifdef __cforall
    25         forall(dtype T)
    26 #else
    27         #define T void
    28 #endif
    29 struct __small_array {
    30         T *           data;
    31         __lock_size_t size;
    32 };
    33 #undef T
    34 
    35 #ifdef __cforall
    36         #define __small_array_t(T) __small_array(T)
    37 #else
    38         #define __small_array_t(T) struct __small_array
    39 #endif
    40 
    41 #ifdef __cforall
    42         // forall(otype T | sized(T))
    43         // static inline void ?{}(__small_array(T) & this) {}
    44 
    45         forall(dtype T | sized(T))
    46         static inline T& ?[?]( __small_array(T) & this, __lock_size_t idx) {
    47                 return ((typeof(this.data))this.data)[idx];
    48         }
    49 
    50         forall(dtype T | sized(T))
    51         static inline T& ?[?]( const __small_array(T) & this, __lock_size_t idx) {
    52                 return ((typeof(this.data))this.data)[idx];
    53         }
    54 
    55         forall(dtype T | sized(T))
    56         static inline T* begin( const __small_array(T) & this ) {
    57                 return ((typeof(this.data))this.data);
    58         }
    59 
    60         forall(dtype T | sized(T))
    61         static inline T* end( const __small_array(T) & this ) {
    62                 return ((typeof(this.data))this.data) + this.size;
    63         }
    64 #endif
    6520
    6621//-----------------------------------------------------------------------------
     
    6823//-----------------------------------------------------------------------------
    6924
    70 #ifdef __cforall
     25#ifdef __CFORALL__
    7126        trait is_node(dtype T) {
    7227                T*& get_next( T& );
     
    7732// Stack
    7833//-----------------------------------------------------------------------------
    79 #ifdef __cforall
     34#ifdef __CFORALL__
    8035        forall(dtype TYPE | is_node(TYPE))
    8136        #define T TYPE
     
    8641        T * top;
    8742};
    88 #undef T
    8943
    90 #ifdef __cforall
     44#ifdef __CFORALL__
    9145#define __stack_t(T) __stack(T)
    9246#else
     
    9448#endif
    9549
    96 #ifdef __cforall
     50#ifdef __CFORALL__
    9751        forall(dtype T | is_node(T))
    98         static inline void ?{}( __stack(T) & this ) {
    99                 (this.top){ NULL };
     52        void ?{}( __stack(T) & this ) {
     53                this.top = NULL;
    10054        }
    10155
    10256        forall(dtype T | is_node(T) | sized(T))
    103         static inline void push( __stack(T) & this, T * val ) {
     57        void push( __stack(T) & this, T * val ) {
    10458                verify( !get_next( *val ) );
    10559                get_next( *val ) = this.top;
     
    10862
    10963        forall(dtype T | is_node(T) | sized(T))
    110         static inline T * pop( __stack(T) & this ) {
     64        T * pop( __stack(T) & this ) {
    11165                T * top = this.top;
    11266                if( top ) {
     
    12175// Queue
    12276//-----------------------------------------------------------------------------
    123 #ifdef __cforall
    124         forall(dtype TYPE | is_node(TYPE))
     77#ifdef __CFORALL__
     78        forall(dtype T | is_node(T))
    12579        #define T TYPE
    12680#else
     
    13185        T ** tail;
    13286};
    133 #undef T
    13487
    135 #ifdef __cforall
    136 #define __queue_t(T) __queue(T)
    137 #else
    138 #define __queue_t(T) struct __queue
    139 #endif
    140 
    141 #ifdef __cforall
     88#ifdef __CFORALL__
    14289        forall(dtype T | is_node(T))
    143         static inline void ?{}( __queue(T) & this ) {
    144                 (this.head){ NULL };
    145                 (this.tail){ &this.head };
     90        void ?{}( __queue(T) & this ) {
     91                this.head = NULL;
     92                this.tail = &this.head;
    14693        }
    14794
    14895        forall(dtype T | is_node(T) | sized(T))
    149         static inline void append( __queue(T) & this, T * val ) {
     96        void append( __queue(T) & this, T * val ) {
    15097                verify(this.tail != NULL);
    15198                *this.tail = val;
     
    154101
    155102        forall(dtype T | is_node(T) | sized(T))
    156         static inline T * pop_head( __queue(T) & this ) {
     103        T * pop_head( __queue(T) & this ) {
    157104                T * head = this.head;
    158105                if( head ) {
     
    167114
    168115        forall(dtype T | is_node(T) | sized(T))
    169         static inline T * remove( __queue(T) & this, T ** it ) {
     116        T * remove( __queue(T) & this, T ** it ) {
    170117                T * val = *it;
    171118                verify( val );
  • src/libcfa/bits/defs.h

    rf5478c8 r3de176d  
    1717
    1818#include <stdbool.h>
    19 #include <stddef.h>
    2019#include <stdint.h>
    2120
     
    2322#define likely  (x)    __builtin_expect(!!(x), 1)
    2423#define thread_local _Thread_local
    25 
    26 typedef void (*fptr_t)();
    27 typedef int_fast16_t __lock_size_t;
    28 
    29 #ifdef __cforall
    30 #define __cfa_anonymous_object
    31 #else
    32 #define __cfa_anonymous_object __cfa_anonymous_object
    33 #endif
  • src/libcfa/bits/locks.h

    rf5478c8 r3de176d  
    5656} __ALIGN__;
    5757
    58 #ifdef __cforall
     58#ifdef __CFORALL__
    5959        extern void yield( unsigned int );
    6060        extern thread_local struct thread_desc *    volatile this_thread;
  • src/libcfa/concurrency/invoke.h

    rf5478c8 r3de176d  
    1414//
    1515
    16 #include "bits/containers.h"
    1716#include "bits/defs.h"
    1817#include "bits/locks.h"
    1918
    20 #ifdef __cforall
     19#ifdef __CFORALL__
    2120extern "C" {
    2221#endif
     
    2625#define _INVOKE_H_
    2726
    28         #ifdef __cforall
     27        typedef void (*fptr_t)();
     28        typedef int_fast16_t __lock_size_t;
     29
     30        struct __thread_queue_t {
     31                struct thread_desc * head;
     32                struct thread_desc ** tail;
     33        };
     34
     35        struct __condition_stack_t {
     36                struct __condition_criterion_t * top;
     37        };
     38
     39        #ifdef __CFORALL__
    2940        extern "Cforall" {
    30                 static inline struct thread_desc             * & get_next( struct thread_desc             & this );
    31                 static inline struct __condition_criterion_t * & get_next( struct __condition_criterion_t & this );
     41                void ?{}( struct __thread_queue_t & );
     42                void append( struct __thread_queue_t &, struct thread_desc * );
     43                struct thread_desc * pop_head( struct __thread_queue_t & );
     44                struct thread_desc * remove( struct __thread_queue_t &, struct thread_desc ** );
     45
     46                void ?{}( struct __condition_stack_t & );
     47                void push( struct __condition_stack_t &, struct __condition_criterion_t * );
     48                struct __condition_criterion_t * pop( struct __condition_stack_t & );
    3249        }
    3350        #endif
     
    83100
    84101                // list of acceptable functions, null if any
    85                 __small_array_t(struct __acceptable_t) __cfa_anonymous_object;
     102                struct __acceptable_t * clauses;
     103
     104                // number of acceptable functions
     105                __lock_size_t size;
    86106        };
    87107
     
    94114
    95115                // queue of threads that are blocked waiting for the monitor
    96                 __queue_t(struct thread_desc) entry_queue;
     116                struct __thread_queue_t entry_queue;
    97117
    98118                // stack of conditions to run next once we exit the monitor
    99                 __stack_t(struct __condition_criterion_t) signal_stack;
     119                struct __condition_stack_t signal_stack;
    100120
    101121                // monitor routines can be called recursively, we need to keep track of that
     
    111131        struct __monitor_group_t {
    112132                // currently held monitors
    113                 __small_array_t(monitor_desc*) __cfa_anonymous_object;
     133                struct monitor_desc ** list;
     134
     135                // number of currently held monitors
     136                __lock_size_t size;
    114137
    115138                // last function that acquired monitors
     
    136159     };
    137160
    138      #ifdef __cforall
     161     #ifdef __CFORALL__
    139162     extern "Cforall" {
    140                 static inline thread_desc * & get_next( thread_desc & this ) {
    141                         return this.next;
     163                static inline monitor_desc * ?[?]( const __monitor_group_t & this, ptrdiff_t index ) {
     164                        return this.list[index];
    142165                }
    143166
    144                 static inline struct __condition_criterion_t * & get_next( struct __condition_criterion_t & this );
    145 
    146                 static inline void ?{}(__monitor_group_t & this) {
    147                         (this.data){NULL};
    148                         (this.size){0};
    149                         (this.func){NULL};
    150                 }
    151 
    152                 static inline void ?{}(__monitor_group_t & this, struct monitor_desc ** data, __lock_size_t size, fptr_t func) {
    153                         (this.data){data};
    154                         (this.size){size};
    155                         (this.func){func};
    156                 }
    157 
    158167                static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
    159                         if( (lhs.data != 0) != (rhs.data != 0) ) return false;
     168                        if( (lhs.list != 0) != (rhs.list != 0) ) return false;
    160169                        if( lhs.size != rhs.size ) return false;
    161170                        if( lhs.func != rhs.func ) return false;
     
    168177
    169178                        return true;
    170                 }
    171 
    172                 static inline void ?=?(__monitor_group_t & lhs, const __monitor_group_t & rhs) {
    173                         lhs.data = rhs.data;
    174                         lhs.size = rhs.size;
    175                         lhs.func = rhs.func;
    176179                }
    177180        }
     
    207210#endif //_INVOKE_PRIVATE_H_
    208211#endif //! defined(__CFA_INVOKE_PRIVATE__)
    209 #ifdef __cforall
     212#ifdef __CFORALL__
    210213}
    211214#endif
  • src/libcfa/concurrency/kernel

    rf5478c8 r3de176d  
    2626//-----------------------------------------------------------------------------
    2727// Locks
     28// // Lock the spinlock, spin if already acquired
     29// void lock      ( spinlock * DEBUG_CTX_PARAM2 );
     30
     31// // Lock the spinlock, yield repeatedly if already acquired
     32// void lock_yield( spinlock * DEBUG_CTX_PARAM2 );
     33
     34// // Lock the spinlock, return false if already acquired
     35// bool try_lock  ( spinlock * DEBUG_CTX_PARAM2 );
     36
     37// // Unlock the spinlock
     38// void unlock    ( spinlock * );
     39
    2840struct semaphore {
    2941        __spinlock_t lock;
    3042        int count;
    31         __queue_t(thread_desc) waiting;
     43        __thread_queue_t waiting;
    3244};
    3345
     
    4557
    4658        // Ready queue for threads
    47         __queue_t(thread_desc) ready_queue;
     59        __thread_queue_t ready_queue;
    4860
    4961        // Preemption rate on this cluster
  • src/libcfa/concurrency/kernel.c

    rf5478c8 r3de176d  
    164164
    165165void ?{}(cluster & this) {
    166         (this.ready_queue){};
     166        ( this.ready_queue ){};
    167167        ( this.ready_queue_lock ){};
    168168
     
    611611}
    612612
     613//-----------------------------------------------------------------------------
     614// Queues
     615void ?{}( __thread_queue_t & this ) {
     616        this.head = NULL;
     617        this.tail = &this.head;
     618}
     619
     620void append( __thread_queue_t & this, thread_desc * t ) {
     621        verify(this.tail != NULL);
     622        *this.tail = t;
     623        this.tail = &t->next;
     624}
     625
     626thread_desc * pop_head( __thread_queue_t & this ) {
     627        thread_desc * head = this.head;
     628        if( head ) {
     629                this.head = head->next;
     630                if( !head->next ) {
     631                        this.tail = &this.head;
     632                }
     633                head->next = NULL;
     634        }
     635        return head;
     636}
     637
     638thread_desc * remove( __thread_queue_t & this, thread_desc ** it ) {
     639        thread_desc * thrd = *it;
     640        verify( thrd );
     641
     642        (*it) = thrd->next;
     643
     644        if( this.tail == &thrd->next ) {
     645                this.tail = it;
     646        }
     647
     648        thrd->next = NULL;
     649
     650        verify( (this.head == NULL) == (&this.head == this.tail) );
     651        verify( *this.tail == NULL );
     652        return thrd;
     653}
     654
     655void ?{}( __condition_stack_t & this ) {
     656        this.top = NULL;
     657}
     658
     659void push( __condition_stack_t & this, __condition_criterion_t * t ) {
     660        verify( !t->next );
     661        t->next = this.top;
     662        this.top = t;
     663}
     664
     665__condition_criterion_t * pop( __condition_stack_t & this ) {
     666        __condition_criterion_t * top = this.top;
     667        if( top ) {
     668                this.top = top->next;
     669                top->next = NULL;
     670        }
     671        return top;
     672}
     673
    613674// Local Variables: //
    614675// mode: c //
  • src/libcfa/concurrency/monitor

    rf5478c8 r3de176d  
    3434        this.recursion     = 0;
    3535        this.mask.accepted = NULL;
    36         this.mask.data     = NULL;
     36        this.mask.clauses  = NULL;
    3737        this.mask.size     = 0;
    3838        this.dtor_node     = NULL;
     
    4040
    4141struct monitor_guard_t {
    42         monitor_desc **         m;
    43         __lock_size_t           count;
    44         __monitor_group_t prev;
     42        monitor_desc ** m;
     43        __lock_size_t   count;
     44        monitor_desc ** prev_mntrs;
     45        __lock_size_t   prev_count;
     46        fptr_t          prev_func;
    4547};
    4648
     
    4951
    5052struct monitor_dtor_guard_t {
    51         monitor_desc *    m;
    52         __monitor_group_t prev;
     53        monitor_desc * m;
     54        monitor_desc ** prev_mntrs;
     55        __lock_size_t   prev_count;
     56        fptr_t          prev_func;
    5357};
    5458
     
    7983};
    8084
    81 static inline __condition_criterion_t * & get_next( __condition_criterion_t & this ) {
    82         return this.next;
    83 }
    84 
    8585struct __condition_node_t {
    8686        // Thread that needs to be woken when all criteria are met
     
    100100};
    101101
    102 static inline __condition_node_t * & get_next( __condition_node_t & this ) {
    103         return this.next;
    104 }
     102struct __condition_blocked_queue_t {
     103        __condition_node_t * head;
     104        __condition_node_t ** tail;
     105};
    105106
    106107void ?{}(__condition_node_t & this, thread_desc * waiting_thread, __lock_size_t count, uintptr_t user_info );
     
    108109void ?{}(__condition_criterion_t & this, monitor_desc * target, __condition_node_t * owner );
    109110
     111void ?{}( __condition_blocked_queue_t & );
     112void append( __condition_blocked_queue_t &, __condition_node_t * );
     113__condition_node_t * pop_head( __condition_blocked_queue_t & );
     114
    110115struct condition {
    111116        // Link list which contains the blocked threads as-well as the information needed to unblock them
    112         __queue_t(__condition_node_t) blocked;
     117        __condition_blocked_queue_t blocked;
    113118
    114119        // Array of monitor pointers (Monitors are NOT contiguous in memory)
  • src/libcfa/concurrency/monitor.c

    rf5478c8 r3de176d  
    280280static inline void enter( __monitor_group_t monitors ) {
    281281        for( __lock_size_t i = 0; i < monitors.size; i++) {
    282                 __enter_monitor_desc( monitors[i], monitors );
     282                __enter_monitor_desc( monitors.list[i], monitors );
    283283        }
    284284}
     
    303303
    304304        // Save previous thread context
    305         this.prev = this_thread->monitors;
     305        this.[prev_mntrs, prev_count, prev_func] = this_thread->monitors.[list, size, func];
    306306
    307307        // Update thread context (needed for conditions)
    308         (this_thread->monitors){m, count, func};
     308        this_thread->monitors.[list, size, func] = [m, count, func];
    309309
    310310        // LIB_DEBUG_PRINT_SAFE("MGUARD : enter %d\n", count);
     
    328328
    329329        // Restore thread context
    330         this_thread->monitors = this.prev;
     330        this_thread->monitors.[list, size, func] = this.[prev_mntrs, prev_count, prev_func];
    331331}
    332332
     
    338338
    339339        // Save previous thread context
    340         this.prev = this_thread->monitors;
     340        this.[prev_mntrs, prev_count, prev_func] = this_thread->monitors.[list, size, func];
    341341
    342342        // Update thread context (needed for conditions)
    343         (this_thread->monitors){m, 1, func};
     343        this_thread->monitors.[list, size, func] = [m, 1, func];
    344344
    345345        __enter_monitor_dtor( this.m, func );
     
    352352
    353353        // Restore thread context
    354         this_thread->monitors = this.prev;
     354        this_thread->monitors.[list, size, func] = this.[prev_mntrs, prev_count, prev_func];
    355355}
    356356
     
    437437
    438438                for(int i = 0; i < this.monitor_count; i++) {
    439                         if ( this.monitors[i] != this_thrd->monitors[i] ) {
    440                                 abortf( "Signal on condition %p made with different monitor, expected %p got %i", &this, this.monitors[i], this_thrd->monitors[i] );
     439                        if ( this.monitors[i] != this_thrd->monitors.list[i] ) {
     440                                abortf( "Signal on condition %p made with different monitor, expected %p got %i", &this, this.monitors[i], this_thrd->monitors.list[i] );
    441441                        }
    442442                }
     
    510510                "Possible cause is not checking if the condition is empty before reading stored data."
    511511        );
    512         return ((typeof(this.blocked.head))this.blocked.head)->user_info;
     512        return this.blocked.head->user_info;
    513513}
    514514
     
    554554                if( next ) {
    555555                        *mask.accepted = index;
    556                         __acceptable_t& accepted = mask[index];
    557                         if( accepted.is_dtor ) {
     556                        if( mask.clauses[index].is_dtor ) {
    558557                                LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : dtor already there\n");
    559                                 verifyf( accepted.size == 1, "ERROR: Accepted dtor has more than 1 mutex parameter." );
    560 
    561                                 monitor_desc * mon2dtor = accepted[0];
     558                                verifyf( mask.clauses[index].size == 1        , "ERROR: Accepted dtor has more than 1 mutex parameter." );
     559
     560                                monitor_desc * mon2dtor = mask.clauses[index].list[0];
    562561                                verifyf( mon2dtor->dtor_node, "ERROR: Accepted monitor has no dtor_node." );
    563562
     
    597596
    598597                        LIB_DEBUG_PRINT_BUFFER_LOCAL( "Kernel : accepted %d\n", *mask.accepted);
     598
    599599                        return;
    600600                }
     
    671671static inline void reset_mask( monitor_desc * this ) {
    672672        this->mask.accepted = NULL;
    673         this->mask.data = NULL;
     673        this->mask.clauses = NULL;
    674674        this->mask.size = 0;
    675675}
     
    697697
    698698static inline bool is_accepted( monitor_desc * this, const __monitor_group_t & group ) {
    699         __acceptable_t * it = this->mask.data; // Optim
     699        __acceptable_t * it = this->mask.clauses; // Optim
    700700        __lock_size_t count = this->mask.size;
    701701
     
    820820        if( !this.monitors ) {
    821821                // LIB_DEBUG_PRINT_SAFE("Branding\n");
    822                 assertf( thrd->monitors.data != NULL, "No current monitor to brand condition %p", thrd->monitors.data );
     822                assertf( thrd->monitors.list != NULL, "No current monitor to brand condition %p", thrd->monitors.list );
    823823                this.monitor_count = thrd->monitors.size;
    824824
    825825                this.monitors = (monitor_desc **)malloc( this.monitor_count * sizeof( *this.monitors ) );
    826826                for( int i = 0; i < this.monitor_count; i++ ) {
    827                         this.monitors[i] = thrd->monitors[i];
     827                        this.monitors[i] = thrd->monitors.list[i];
    828828                }
    829829        }
     
    832832static inline [thread_desc *, int] search_entry_queue( const __waitfor_mask_t & mask, monitor_desc * monitors [], __lock_size_t count ) {
    833833
    834         __queue_t(thread_desc) & entry_queue = monitors[0]->entry_queue;
     834        __thread_queue_t & entry_queue = monitors[0]->entry_queue;
    835835
    836836        // For each thread in the entry-queue
     
    841841                // For each acceptable check if it matches
    842842                int i = 0;
    843                 __acceptable_t * end   = end  (mask);
    844                 __acceptable_t * begin = begin(mask);
    845                 for( __acceptable_t * it = begin; it != end; it++, i++ ) {
     843                __acceptable_t * end = mask.clauses + mask.size;
     844                for( __acceptable_t * it = mask.clauses; it != end; it++, i++ ) {
    846845                        // Check if we have a match
    847846                        if( *it == (*thrd_it)->monitors ) {
     
    873872        __lock_size_t max = 0;
    874873        for( __lock_size_t i = 0; i < mask.size; i++ ) {
    875                 __acceptable_t & accepted = mask[i];
    876                 max += accepted.size;
     874                max += mask.clauses[i].size;
    877875        }
    878876        return max;
     
    882880        __lock_size_t size = 0;
    883881        for( __lock_size_t i = 0; i < mask.size; i++ ) {
    884                 __acceptable_t & accepted = mask[i];
    885                 __libcfa_small_sort( accepted.data, accepted.size );
    886                 for( __lock_size_t j = 0; j < accepted.size; j++) {
    887                         insert_unique( storage, size, accepted[j] );
     882                __libcfa_small_sort( mask.clauses[i].list, mask.clauses[i].size );
     883                for( __lock_size_t j = 0; j < mask.clauses[i].size; j++) {
     884                        insert_unique( storage, size, mask.clauses[i].list[j] );
    888885                }
    889886        }
     
    891888        __libcfa_small_sort( storage, size );
    892889        return size;
     890}
     891
     892void ?{}( __condition_blocked_queue_t & this ) {
     893        this.head = NULL;
     894        this.tail = &this.head;
     895}
     896
     897void append( __condition_blocked_queue_t & this, __condition_node_t * c ) {
     898        verify(this.tail != NULL);
     899        *this.tail = c;
     900        this.tail = &c->next;
     901}
     902
     903__condition_node_t * pop_head( __condition_blocked_queue_t & this ) {
     904        __condition_node_t * head = this.head;
     905        if( head ) {
     906                this.head = head->next;
     907                if( !head->next ) {
     908                        this.tail = &this.head;
     909                }
     910                head->next = NULL;
     911        }
     912        return head;
    893913}
    894914
  • src/libcfa/exception.h

    rf5478c8 r3de176d  
    1717
    1818
    19 #ifdef __cforall
     19#ifdef __CFORALL__
    2020extern "C" {
    2121#endif
     
    6868struct __cfaehm__cleanup_hook {};
    6969
    70 #ifdef __cforall
     70#ifdef __CFORALL__
    7171}
    7272#endif
  • src/libcfa/stdhdr/assert.h

    rf5478c8 r3de176d  
    44// The contents of this file are covered under the licence agreement in the
    55// file "LICENCE" distributed with Cforall.
    6 //
    7 // assert.h --
    8 //
     6// 
     7// assert.h -- 
     8// 
    99// Author           : Peter A. Buhr
    1010// Created On       : Mon Jul  4 23:25:26 2016
     
    1212// Last Modified On : Mon Jul 31 23:09:32 2017
    1313// Update Count     : 13
    14 //
     14// 
    1515
    16 #ifdef __cforall
     16#ifdef __CFORALL__
    1717extern "C" {
    18 #endif //__cforall
     18#endif //__CFORALL__
    1919
    2020#include_next <assert.h>
     
    3030#endif
    3131
    32 #ifdef __cforall
     32#ifdef __CFORALL__
    3333} // extern "C"
    34 #endif //__cforall
     34#endif //__CFORALL__
    3535
    3636// Local Variables: //
  • src/libcfa/virtual.h

    rf5478c8 r3de176d  
    1616#pragma once
    1717
    18 #ifdef __cforall
     18#ifdef __CFORALL__
    1919extern "C" {
    2020#endif
     
    3535                struct __cfa__parent_vtable const * const * child );
    3636
    37 #ifdef __cforall
     37#ifdef __CFORALL__
    3838}
    3939#endif
  • src/tests/designations.c

    rf5478c8 r3de176d  
    1717// In particular, since the syntax for designations in Cforall differs from that of C, preprocessor substitution
    1818// is used for the designation syntax
    19 #ifdef __cforall
     19#ifdef __CFORALL__
    2020#define DES :
    2121#else
Note: See TracChangeset for help on using the changeset viewer.