Changes in / [212c421e:f22b7aef]


Ignore:
Location:
src
Files:
1 deleted
19 edited

Legend:

Unmodified
Added
Removed
  • src/Concurrency/Keywords.cc

    r212c421e rf22b7aef  
    201201                std::list<DeclarationWithType*> findMutexArgs( FunctionDecl* );
    202202                void validate( DeclarationWithType * );
    203                 void addStatments( FunctionDecl* func, CompoundStmt *, const std::list<DeclarationWithType * > &);
     203                void addStatments( CompoundStmt *, const std::list<DeclarationWithType * > &);
    204204
    205205                static void implement( std::list< Declaration * > & translationUnit ) {
     
    211211                StructDecl* monitor_decl = nullptr;
    212212                StructDecl* guard_decl = nullptr;
    213 
    214                 static std::unique_ptr< Type > generic_func;
    215213        };
    216 
    217         std::unique_ptr< Type > MutexKeyword::generic_func = std::unique_ptr< Type >(
    218                 new FunctionType(
    219                         noQualifiers,
    220                         true
    221                 )
    222         );
    223214
    224215        //-----------------------------------------------------------------------------
     
    404395        // Mutex keyword implementation
    405396        //=============================================================================================
    406 
    407397        void MutexKeyword::visit(FunctionDecl* decl) {
    408398                Visitor::visit(decl);
     
    421411                if( !guard_decl ) throw SemanticError( "mutex keyword requires monitors to be in scope, add #include <monitor>", decl );
    422412
    423                 addStatments( decl, body, mutexArgs );
     413                addStatments( body, mutexArgs );
    424414        }
    425415
     
    468458        }
    469459
    470         void MutexKeyword::addStatments( FunctionDecl* func, CompoundStmt * body, const std::list<DeclarationWithType * > & args ) {
     460        void MutexKeyword::addStatments( CompoundStmt * body, const std::list<DeclarationWithType * > & args ) {
    471461                ObjectDecl * monitors = new ObjectDecl(
    472462                        "__monitors",
     
    499489                );
    500490
    501                 assert(generic_func);
    502 
    503491                //in reverse order :
    504                 // monitor_guard_t __guard = { __monitors, #, func };
     492                // monitor_guard_t __guard = { __monitors, # };
    505493                body->push_front(
    506494                        new DeclStmt( noLabels, new ObjectDecl(
     
    516504                                        {
    517505                                                new SingleInit( new VariableExpr( monitors ) ),
    518                                                 new SingleInit( new ConstantExpr( Constant::from_ulong( args.size() ) ) ),
    519                                                 new SingleInit( new CastExpr( new VariableExpr( func ), generic_func->clone() ) )
     506                                                new SingleInit( new ConstantExpr( Constant::from_ulong( args.size() ) ) )
    520507                                        },
    521508                                        noDesignators,
  • src/Parser/ParseNode.h

    r212c421e rf22b7aef  
    414414Statement * build_compound( StatementNode * first );
    415415Statement * build_asmstmt( bool voltile, ConstantExpr * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
    416 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
    417 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
    418 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when );
    419 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when, StatementNode * else_stmt, ExpressionNode * else_when );
    420416
    421417//##############################################################################
  • src/Parser/StatementNode.cc

    r212c421e rf22b7aef  
    9393                elseb = branches.front();
    9494        } // if
    95 
     95       
    9696        std::list< Statement * > init;
    9797        if ( ctl->init != 0 ) {
     
    207207}
    208208
    209 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when ) {
    210         auto node = new WaitForStmt();
    211 
    212         WaitForStmt::Target target;
    213         target.function = maybeBuild<Expression>( targetExpr );
    214         buildMoveList< Expression >( targetExpr, target.arguments );
    215         delete targetExpr;
    216 
    217         node->clauses.push_back( WaitForStmt::Clause{
    218                 target,
    219                 maybeMoveBuild<Statement >( stmt ),
    220                 maybeMoveBuild<Expression>( when )
    221         });
    222 
    223         return node;
    224 }
    225 
    226 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when, WaitForStmt * node ) {
    227         WaitForStmt::Target target;
    228 
    229         target.function = maybeBuild<Expression>( targetExpr );
    230         buildMoveList< Expression >( targetExpr, target.arguments );
    231         delete targetExpr;
    232 
    233         node->clauses.push_back( WaitForStmt::Clause{
    234                 std::move( target ),
    235                 maybeMoveBuild<Statement >( stmt ),
    236                 maybeMoveBuild<Expression>( when )
    237         });
    238 
    239         return node;
    240 }
    241 
    242 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when ) {
    243         auto node = new WaitForStmt();
    244 
    245         if( timeout ) {
    246                 node->timeout.time      = maybeMoveBuild<Expression>( timeout );
    247                 node->timeout.statement = maybeMoveBuild<Statement >( stmt    );
    248                 node->timeout.condition = maybeMoveBuild<Expression>( when    );
    249         }
    250         else {
    251                 node->orelse.statement  = maybeMoveBuild<Statement >( stmt    );
    252                 node->orelse.condition  = maybeMoveBuild<Expression>( when    );
    253         }
    254 
    255         return node;
    256 }
    257 
    258 WaitForStmt * build_waitfor_timeout( ExpressionNode * timeout, StatementNode * stmt, ExpressionNode * when,  StatementNode * else_stmt, ExpressionNode * else_when ) {
    259         auto node = new WaitForStmt();
    260 
    261         node->timeout.time      = maybeMoveBuild<Expression>( timeout );
    262         node->timeout.statement = maybeMoveBuild<Statement >( stmt    );
    263         node->timeout.condition = maybeMoveBuild<Expression>( when    );
    264 
    265         node->orelse.statement = maybeMoveBuild<Statement >( else_stmt );
    266         node->orelse.condition = maybeMoveBuild<Expression>( else_when );
    267 
    268         return node;
    269 }
    270 
    271 // WaitForStmt::Target build_waitfor( const std::string * name, ExpressionNode * arguments ) {
    272 //       return WaitForStmt::Clause{
    273 
    274 //       };
    275 // }
    276 
    277209Statement *build_compound( StatementNode *first ) {
    278210        CompoundStmt *cs = new CompoundStmt( noLabels );
  • src/Parser/parser.yy

    r212c421e rf22b7aef  
    9797        DeclarationNode::TypeClass tclass;
    9898        StatementNode * sn;
    99         WaitForStmt * wfs;
    10099        ConstantExpr * constant;
    101100        IfCtl * ifctl;
     
    188187%type<flag> asm_volatile_opt
    189188%type<en> handler_predicate_opt
    190 %type<en> when_clause_opt timeout
    191189
    192190// statements
     
    194192%type<sn> iteration_statement                   jump_statement
    195193%type<sn> with_statement                                exception_statement                     asm_statement
    196 %type<sn> waitfor_statement
     194%type<sn> when_clause_opt                               waitfor_statement                       waitfor_clause                          waitfor                         timeout
    197195%type<sn> fall_through_opt                              fall_through
    198196%type<sn> statement                                             statement_list
     
    204202%type<sn> handler_clause                                finally_clause
    205203%type<catch_kind> handler_key
    206 %type<wfs> waitfor_clause
    207 %type<en> waitfor
    208204
    209205// declarations
     
    983979when_clause_opt:
    984980        // empty
    985                 { $$ = nullptr; }
     981                { $$ = nullptr; }                                                               // FIX ME
    986982        | WHEN '(' comma_expression ')'
    987                 { $$ = $3; }
     983                { $$ = nullptr; }                                                               // FIX ME
    988984        ;
    989985
    990986waitfor:
    991987        WAITFOR '(' identifier ')'
    992                 {
    993                         $$ = new ExpressionNode( new NameExpr( *$3 ) );
    994                         delete $3;
    995                 }
     988                { $$ = nullptr; }                                                               // FIX ME
    996989        | WAITFOR '(' identifier ',' argument_expression_list ')'
    997                 {
    998                         $$ = new ExpressionNode( new NameExpr( *$3 ) );
    999                         $$->set_last( $5 );
    1000                         delete $3;
    1001                 }
     990                { $$ = nullptr; }                                                               // FIX ME
    1002991        ;
    1003992
    1004993timeout:
    1005994        TIMEOUT '(' comma_expression ')'
    1006                 { $$ = $3; }
     995                { $$ = nullptr; }                                                               // FIX ME
    1007996        ;
    1008997
    1009998waitfor_clause:
    1010999        when_clause_opt waitfor statement %prec THEN
    1011                 { $$ = build_waitfor( $2, $3, $1 ); }
     1000                { $$ = nullptr; }                                                               // FIX ME
    10121001        | when_clause_opt waitfor statement WOR waitfor_clause
    1013                 { $$ = build_waitfor( $2, $3, $1, $5 ); }
     1002                { $$ = nullptr; }                                                               // FIX ME
    10141003        | when_clause_opt timeout statement %prec THEN
    1015                 { $$ = build_waitfor_timeout( $2, $3, $1 ); }
     1004                { $$ = nullptr; }                                                               // FIX ME
    10161005        | when_clause_opt ELSE statement
    1017                 { $$ = build_waitfor_timeout( nullptr, $3, $1 ); }
     1006                { $$ = nullptr; }                                                               // FIX ME
    10181007        | when_clause_opt timeout statement WOR when_clause_opt ELSE statement
    1019                 { $$ = build_waitfor_timeout( $2, $3, $1, $7, $5 ); }
     1008                { $$ = nullptr; }                                                               // FIX ME
    10201009        ;
    10211010
    10221011waitfor_statement:
    10231012        when_clause_opt waitfor statement %prec THEN
    1024                 { $$ = new StatementNode( build_waitfor( $2, $3, $1 ) ); }
     1013                { $$ = nullptr; }                                                               // FIX ME
    10251014        | when_clause_opt waitfor statement WOR waitfor_clause
    1026                 { $$ = new StatementNode( build_waitfor( $2, $3, $1, $5 ) ); }
     1015                { $$ = nullptr; }                                                               // FIX ME
    10271016        ;
    10281017
  • src/SynTree/Mutator.cc

    r212c421e rf22b7aef  
    3232Mutator::~Mutator() {}
    3333
    34 DeclarationWithType * Mutator::mutate( ObjectDecl *objectDecl ) {
     34DeclarationWithType *Mutator::mutate( ObjectDecl *objectDecl ) {
    3535        objectDecl->set_type( maybeMutate( objectDecl->get_type(), *this ) );
    3636        objectDecl->set_init( maybeMutate( objectDecl->get_init(), *this ) );
     
    3939}
    4040
    41 DeclarationWithType * Mutator::mutate( FunctionDecl *functionDecl ) {
     41DeclarationWithType *Mutator::mutate( FunctionDecl *functionDecl ) {
    4242        functionDecl->set_functionType( maybeMutate( functionDecl->get_functionType(), *this ) );
    4343        functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
     
    4545}
    4646
    47 Declaration * Mutator::handleAggregateDecl( AggregateDecl *aggregateDecl ) {
     47Declaration *Mutator::handleAggregateDecl( AggregateDecl *aggregateDecl ) {
    4848        mutateAll( aggregateDecl->get_parameters(), *this );
    4949        mutateAll( aggregateDecl->get_members(), *this );
     
    5151}
    5252
    53 Declaration * Mutator::mutate( StructDecl *aggregateDecl ) {
     53Declaration *Mutator::mutate( StructDecl *aggregateDecl ) {
    5454        handleAggregateDecl( aggregateDecl );
    5555        return aggregateDecl;
    5656}
    5757
    58 Declaration * Mutator::mutate( UnionDecl *aggregateDecl ) {
     58Declaration *Mutator::mutate( UnionDecl *aggregateDecl ) {
    5959        handleAggregateDecl( aggregateDecl );
    6060        return aggregateDecl;
    6161}
    6262
    63 Declaration * Mutator::mutate( EnumDecl *aggregateDecl ) {
     63Declaration *Mutator::mutate( EnumDecl *aggregateDecl ) {
    6464        handleAggregateDecl( aggregateDecl );
    6565        return aggregateDecl;
    6666}
    6767
    68 Declaration * Mutator::mutate( TraitDecl *aggregateDecl ) {
     68Declaration *Mutator::mutate( TraitDecl *aggregateDecl ) {
    6969        handleAggregateDecl( aggregateDecl );
    7070        return aggregateDecl;
    7171}
    7272
    73 Declaration * Mutator::handleNamedTypeDecl( NamedTypeDecl *typeDecl ) {
     73Declaration *Mutator::handleNamedTypeDecl( NamedTypeDecl *typeDecl ) {
    7474        mutateAll( typeDecl->get_parameters(), *this );
    7575        mutateAll( typeDecl->get_assertions(), *this );
     
    7878}
    7979
    80 TypeDecl * Mutator::mutate( TypeDecl *typeDecl ) {
     80TypeDecl *Mutator::mutate( TypeDecl *typeDecl ) {
    8181        handleNamedTypeDecl( typeDecl );
    8282        typeDecl->set_init( maybeMutate( typeDecl->get_init(), *this ) );
     
    8484}
    8585
    86 Declaration * Mutator::mutate( TypedefDecl *typeDecl ) {
     86Declaration *Mutator::mutate( TypedefDecl *typeDecl ) {
    8787        handleNamedTypeDecl( typeDecl );
    8888        return typeDecl;
    8989}
    9090
    91 AsmDecl * Mutator::mutate( AsmDecl *asmDecl ) {
     91AsmDecl *Mutator::mutate( AsmDecl *asmDecl ) {
    9292        asmDecl->set_stmt( maybeMutate( asmDecl->get_stmt(), *this ) );
    9393        return asmDecl;
     
    9595
    9696
    97 CompoundStmt * Mutator::mutate( CompoundStmt *compoundStmt ) {
     97CompoundStmt *Mutator::mutate( CompoundStmt *compoundStmt ) {
    9898        mutateAll( compoundStmt->get_kids(), *this );
    9999        return compoundStmt;
    100100}
    101101
    102 Statement * Mutator::mutate( ExprStmt *exprStmt ) {
     102Statement *Mutator::mutate( ExprStmt *exprStmt ) {
    103103        exprStmt->set_expr( maybeMutate( exprStmt->get_expr(), *this ) );
    104104        return exprStmt;
    105105}
    106106
    107 Statement * Mutator::mutate( AsmStmt *asmStmt ) {
     107Statement *Mutator::mutate( AsmStmt *asmStmt ) {
    108108        asmStmt->set_instruction( maybeMutate( asmStmt->get_instruction(), *this ) );
    109109        mutateAll( asmStmt->get_output(), *this );
     
    113113}
    114114
    115 Statement * Mutator::mutate( IfStmt *ifStmt ) {
     115Statement *Mutator::mutate( IfStmt *ifStmt ) {
    116116        mutateAll( ifStmt->get_initialization(), *this );
    117117        ifStmt->set_condition( maybeMutate( ifStmt->get_condition(), *this ) );
     
    121121}
    122122
    123 Statement * Mutator::mutate( WhileStmt *whileStmt ) {
     123Statement *Mutator::mutate( WhileStmt *whileStmt ) {
    124124        whileStmt->set_condition( maybeMutate( whileStmt->get_condition(), *this ) );
    125125        whileStmt->set_body( maybeMutate( whileStmt->get_body(), *this ) );
     
    127127}
    128128
    129 Statement * Mutator::mutate( ForStmt *forStmt ) {
     129Statement *Mutator::mutate( ForStmt *forStmt ) {
    130130        mutateAll( forStmt->get_initialization(), *this );
    131131        forStmt->set_condition( maybeMutate( forStmt->get_condition(), *this ) );
     
    135135}
    136136
    137 Statement * Mutator::mutate( SwitchStmt *switchStmt ) {
     137Statement *Mutator::mutate( SwitchStmt *switchStmt ) {
    138138        switchStmt->set_condition( maybeMutate( switchStmt->get_condition(), *this ) );
    139139        mutateAll( switchStmt->get_statements(), *this );
     
    141141}
    142142
    143 Statement * Mutator::mutate( CaseStmt *caseStmt ) {
     143Statement *Mutator::mutate( CaseStmt *caseStmt ) {
    144144        caseStmt->set_condition( maybeMutate( caseStmt->get_condition(), *this ) );
    145145        mutateAll (caseStmt->get_statements(), *this );
     
    148148}
    149149
    150 Statement * Mutator::mutate( BranchStmt *branchStmt ) {
     150Statement *Mutator::mutate( BranchStmt *branchStmt ) {
    151151        return branchStmt;
    152152}
    153153
    154 Statement * Mutator::mutate( ReturnStmt *returnStmt ) {
     154Statement *Mutator::mutate( ReturnStmt *returnStmt ) {
    155155        returnStmt->set_expr( maybeMutate( returnStmt->get_expr(), *this ) );
    156156        return returnStmt;
    157157}
    158158
    159 Statement * Mutator::mutate( ThrowStmt *throwStmt ) {
     159Statement *Mutator::mutate( ThrowStmt *throwStmt ) {
    160160        throwStmt->set_expr( maybeMutate( throwStmt->get_expr(), *this ) );
    161161        throwStmt->set_target( maybeMutate( throwStmt->get_target(), *this ) );
     
    163163}
    164164
    165 Statement * Mutator::mutate( TryStmt *tryStmt ) {
     165Statement *Mutator::mutate( TryStmt *tryStmt ) {
    166166        tryStmt->set_block( maybeMutate( tryStmt->get_block(), *this ) );
    167167        mutateAll( tryStmt->get_catchers(), *this );
     
    170170}
    171171
    172 Statement * Mutator::mutate( CatchStmt *catchStmt ) {
     172Statement *Mutator::mutate( CatchStmt *catchStmt ) {
    173173        catchStmt->set_decl( maybeMutate( catchStmt->get_decl(), *this ) );
    174174        catchStmt->set_cond( maybeMutate( catchStmt->get_cond(), *this ) );
     
    177177}
    178178
    179 Statement * Mutator::mutate( FinallyStmt *finalStmt ) {
     179Statement *Mutator::mutate( FinallyStmt *finalStmt ) {
    180180        finalStmt->set_block( maybeMutate( finalStmt->get_block(), *this ) );
    181181        return finalStmt;
    182182}
    183183
    184 Statement * Mutator::mutate( WaitForStmt *waitforStmt ) {
    185         for( auto & clause : waitforStmt->clauses ) {
    186                 clause.target.function = maybeMutate( clause.target.function, *this );
    187                 mutateAll( clause.target.arguments, *this );
    188 
    189                 clause.statement = maybeMutate( clause.statement, *this );
    190                 clause.condition = maybeMutate( clause.condition, *this );
    191         }
    192 
    193         waitforStmt->timeout.time      = maybeMutate( waitforStmt->timeout.time, *this );
    194         waitforStmt->timeout.statement = maybeMutate( waitforStmt->timeout.statement, *this );
    195         waitforStmt->timeout.condition = maybeMutate( waitforStmt->timeout.condition, *this );
    196         waitforStmt->orelse.statement  = maybeMutate( waitforStmt->orelse.statement, *this );
    197         waitforStmt->orelse.condition  = maybeMutate( waitforStmt->orelse.condition, *this );
    198 
    199         return waitforStmt;
    200 }
    201 
    202 NullStmt * Mutator::mutate( NullStmt *nullStmt ) {
     184NullStmt *Mutator::mutate( NullStmt *nullStmt ) {
    203185        return nullStmt;
    204186}
    205187
    206 Statement * Mutator::mutate( DeclStmt *declStmt ) {
     188Statement *Mutator::mutate( DeclStmt *declStmt ) {
    207189        declStmt->set_decl( maybeMutate( declStmt->get_decl(), *this ) );
    208190        return declStmt;
    209191}
    210192
    211 Statement * Mutator::mutate( ImplicitCtorDtorStmt *impCtorDtorStmt ) {
     193Statement *Mutator::mutate( ImplicitCtorDtorStmt *impCtorDtorStmt ) {
    212194        impCtorDtorStmt->set_callStmt( maybeMutate( impCtorDtorStmt->get_callStmt(), *this ) );
    213195        return impCtorDtorStmt;
     
    215197
    216198
    217 Expression * Mutator::mutate( ApplicationExpr *applicationExpr ) {
     199Expression *Mutator::mutate( ApplicationExpr *applicationExpr ) {
    218200        applicationExpr->set_env( maybeMutate( applicationExpr->get_env(), *this ) );
    219201        applicationExpr->set_result( maybeMutate( applicationExpr->get_result(), *this ) );
     
    223205}
    224206
    225 Expression * Mutator::mutate( UntypedExpr *untypedExpr ) {
     207Expression *Mutator::mutate( UntypedExpr *untypedExpr ) {
    226208        untypedExpr->set_env( maybeMutate( untypedExpr->get_env(), *this ) );
    227209        untypedExpr->set_result( maybeMutate( untypedExpr->get_result(), *this ) );
     
    230212}
    231213
    232 Expression * Mutator::mutate( NameExpr *nameExpr ) {
     214Expression *Mutator::mutate( NameExpr *nameExpr ) {
    233215        nameExpr->set_env( maybeMutate( nameExpr->get_env(), *this ) );
    234216        nameExpr->set_result( maybeMutate( nameExpr->get_result(), *this ) );
     
    236218}
    237219
    238 Expression * Mutator::mutate( AddressExpr *addressExpr ) {
     220Expression *Mutator::mutate( AddressExpr *addressExpr ) {
    239221        addressExpr->set_env( maybeMutate( addressExpr->get_env(), *this ) );
    240222        addressExpr->set_result( maybeMutate( addressExpr->get_result(), *this ) );
     
    243225}
    244226
    245 Expression * Mutator::mutate( LabelAddressExpr *labelAddressExpr ) {
     227Expression *Mutator::mutate( LabelAddressExpr *labelAddressExpr ) {
    246228        labelAddressExpr->set_env( maybeMutate( labelAddressExpr->get_env(), *this ) );
    247229        labelAddressExpr->set_result( maybeMutate( labelAddressExpr->get_result(), *this ) );
     
    250232}
    251233
    252 Expression * Mutator::mutate( CastExpr *castExpr ) {
     234Expression *Mutator::mutate( CastExpr *castExpr ) {
    253235        castExpr->set_env( maybeMutate( castExpr->get_env(), *this ) );
    254236        castExpr->set_result( maybeMutate( castExpr->get_result(), *this ) );
     
    257239}
    258240
    259 Expression * Mutator::mutate( VirtualCastExpr *castExpr ) {
     241Expression *Mutator::mutate( VirtualCastExpr *castExpr ) {
    260242        castExpr->set_env( maybeMutate( castExpr->get_env(), *this ) );
    261243        castExpr->set_result( maybeMutate( castExpr->get_result(), *this ) );
     
    264246}
    265247
    266 Expression * Mutator::mutate( UntypedMemberExpr *memberExpr ) {
     248Expression *Mutator::mutate( UntypedMemberExpr *memberExpr ) {
    267249        memberExpr->set_env( maybeMutate( memberExpr->get_env(), *this ) );
    268250        memberExpr->set_result( maybeMutate( memberExpr->get_result(), *this ) );
     
    272254}
    273255
    274 Expression * Mutator::mutate( MemberExpr *memberExpr ) {
     256Expression *Mutator::mutate( MemberExpr *memberExpr ) {
    275257        memberExpr->set_env( maybeMutate( memberExpr->get_env(), *this ) );
    276258        memberExpr->set_result( maybeMutate( memberExpr->get_result(), *this ) );
     
    279261}
    280262
    281 Expression * Mutator::mutate( VariableExpr *variableExpr ) {
     263Expression *Mutator::mutate( VariableExpr *variableExpr ) {
    282264        variableExpr->set_env( maybeMutate( variableExpr->get_env(), *this ) );
    283265        variableExpr->set_result( maybeMutate( variableExpr->get_result(), *this ) );
     
    285267}
    286268
    287 Expression * Mutator::mutate( ConstantExpr *constantExpr ) {
     269Expression *Mutator::mutate( ConstantExpr *constantExpr ) {
    288270        constantExpr->set_env( maybeMutate( constantExpr->get_env(), *this ) );
    289271        constantExpr->set_result( maybeMutate( constantExpr->get_result(), *this ) );
     
    292274}
    293275
    294 Expression * Mutator::mutate( SizeofExpr *sizeofExpr ) {
     276Expression *Mutator::mutate( SizeofExpr *sizeofExpr ) {
    295277        sizeofExpr->set_env( maybeMutate( sizeofExpr->get_env(), *this ) );
    296278        sizeofExpr->set_result( maybeMutate( sizeofExpr->get_result(), *this ) );
     
    303285}
    304286
    305 Expression * Mutator::mutate( AlignofExpr *alignofExpr ) {
     287Expression *Mutator::mutate( AlignofExpr *alignofExpr ) {
    306288        alignofExpr->set_env( maybeMutate( alignofExpr->get_env(), *this ) );
    307289        alignofExpr->set_result( maybeMutate( alignofExpr->get_result(), *this ) );
     
    314296}
    315297
    316 Expression * Mutator::mutate( UntypedOffsetofExpr *offsetofExpr ) {
     298Expression *Mutator::mutate( UntypedOffsetofExpr *offsetofExpr ) {
    317299        offsetofExpr->set_env( maybeMutate( offsetofExpr->get_env(), *this ) );
    318300        offsetofExpr->set_result( maybeMutate( offsetofExpr->get_result(), *this ) );
     
    321303}
    322304
    323 Expression * Mutator::mutate( OffsetofExpr *offsetofExpr ) {
     305Expression *Mutator::mutate( OffsetofExpr *offsetofExpr ) {
    324306        offsetofExpr->set_env( maybeMutate( offsetofExpr->get_env(), *this ) );
    325307        offsetofExpr->set_result( maybeMutate( offsetofExpr->get_result(), *this ) );
     
    329311}
    330312
    331 Expression * Mutator::mutate( OffsetPackExpr *offsetPackExpr ) {
     313Expression *Mutator::mutate( OffsetPackExpr *offsetPackExpr ) {
    332314        offsetPackExpr->set_env( maybeMutate( offsetPackExpr->get_env(), *this ) );
    333315        offsetPackExpr->set_result( maybeMutate( offsetPackExpr->get_result(), *this ) );
     
    336318}
    337319
    338 Expression * Mutator::mutate( AttrExpr *attrExpr ) {
     320Expression *Mutator::mutate( AttrExpr *attrExpr ) {
    339321        attrExpr->set_env( maybeMutate( attrExpr->get_env(), *this ) );
    340322        attrExpr->set_result( maybeMutate( attrExpr->get_result(), *this ) );
     
    347329}
    348330
    349 Expression * Mutator::mutate( LogicalExpr *logicalExpr ) {
     331Expression *Mutator::mutate( LogicalExpr *logicalExpr ) {
    350332        logicalExpr->set_env( maybeMutate( logicalExpr->get_env(), *this ) );
    351333        logicalExpr->set_result( maybeMutate( logicalExpr->get_result(), *this ) );
     
    355337}
    356338
    357 Expression * Mutator::mutate( ConditionalExpr *conditionalExpr ) {
     339Expression *Mutator::mutate( ConditionalExpr *conditionalExpr ) {
    358340        conditionalExpr->set_env( maybeMutate( conditionalExpr->get_env(), *this ) );
    359341        conditionalExpr->set_result( maybeMutate( conditionalExpr->get_result(), *this ) );
     
    364346}
    365347
    366 Expression * Mutator::mutate( CommaExpr *commaExpr ) {
     348Expression *Mutator::mutate( CommaExpr *commaExpr ) {
    367349        commaExpr->set_env( maybeMutate( commaExpr->get_env(), *this ) );
    368350        commaExpr->set_result( maybeMutate( commaExpr->get_result(), *this ) );
     
    372354}
    373355
    374 Expression * Mutator::mutate( TypeExpr *typeExpr ) {
     356Expression *Mutator::mutate( TypeExpr *typeExpr ) {
    375357        typeExpr->set_env( maybeMutate( typeExpr->get_env(), *this ) );
    376358        typeExpr->set_result( maybeMutate( typeExpr->get_result(), *this ) );
     
    379361}
    380362
    381 Expression * Mutator::mutate( AsmExpr *asmExpr ) {
     363Expression *Mutator::mutate( AsmExpr *asmExpr ) {
    382364        asmExpr->set_env( maybeMutate( asmExpr->get_env(), *this ) );
    383365        asmExpr->set_inout( maybeMutate( asmExpr->get_inout(), *this ) );
     
    404386}
    405387
    406 Expression * Mutator::mutate( CompoundLiteralExpr *compLitExpr ) {
     388Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) {
    407389        compLitExpr->set_env( maybeMutate( compLitExpr->get_env(), *this ) );
    408390        compLitExpr->set_result( maybeMutate( compLitExpr->get_result(), *this ) );
     
    411393}
    412394
    413 Expression * Mutator::mutate( RangeExpr *rangeExpr ) {
     395Expression *Mutator::mutate( RangeExpr *rangeExpr ) {
    414396        rangeExpr->set_env( maybeMutate( rangeExpr->get_env(), *this ) );
    415397        rangeExpr->set_low( maybeMutate( rangeExpr->get_low(), *this ) );
     
    418400}
    419401
    420 Expression * Mutator::mutate( UntypedTupleExpr *tupleExpr ) {
     402Expression *Mutator::mutate( UntypedTupleExpr *tupleExpr ) {
    421403        tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) );
    422404        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     
    425407}
    426408
    427 Expression * Mutator::mutate( TupleExpr *tupleExpr ) {
     409Expression *Mutator::mutate( TupleExpr *tupleExpr ) {
    428410        tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) );
    429411        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     
    432414}
    433415
    434 Expression * Mutator::mutate( TupleIndexExpr *tupleExpr ) {
     416Expression *Mutator::mutate( TupleIndexExpr *tupleExpr ) {
    435417        tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) );
    436418        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     
    439421}
    440422
    441 Expression * Mutator::mutate( TupleAssignExpr *assignExpr ) {
     423Expression *Mutator::mutate( TupleAssignExpr *assignExpr ) {
    442424        assignExpr->set_env( maybeMutate( assignExpr->get_env(), *this ) );
    443425        assignExpr->set_result( maybeMutate( assignExpr->get_result(), *this ) );
     
    446428}
    447429
    448 Expression * Mutator::mutate( StmtExpr *stmtExpr ) {
     430Expression *Mutator::mutate( StmtExpr *stmtExpr ) {
    449431        stmtExpr->set_env( maybeMutate( stmtExpr->get_env(), *this ) );
    450432        stmtExpr->set_result( maybeMutate( stmtExpr->get_result(), *this ) );
     
    455437}
    456438
    457 Expression * Mutator::mutate( UniqueExpr *uniqueExpr ) {
     439Expression *Mutator::mutate( UniqueExpr *uniqueExpr ) {
    458440        uniqueExpr->set_env( maybeMutate( uniqueExpr->get_env(), *this ) );
    459441        uniqueExpr->set_result( maybeMutate( uniqueExpr->get_result(), *this ) );
     
    462444}
    463445
    464 Expression * Mutator::mutate( UntypedInitExpr * initExpr ) {
     446Expression *Mutator::mutate( UntypedInitExpr * initExpr ) {
    465447        initExpr->set_env( maybeMutate( initExpr->get_env(), *this ) );
    466448        initExpr->set_result( maybeMutate( initExpr->get_result(), *this ) );
     
    470452}
    471453
    472 Expression * Mutator::mutate( InitExpr * initExpr ) {
     454Expression *Mutator::mutate( InitExpr * initExpr ) {
    473455        initExpr->set_env( maybeMutate( initExpr->get_env(), *this ) );
    474456        initExpr->set_result( maybeMutate( initExpr->get_result(), *this ) );
     
    479461
    480462
    481 Type * Mutator::mutate( VoidType *voidType ) {
     463Type *Mutator::mutate( VoidType *voidType ) {
    482464        mutateAll( voidType->get_forall(), *this );
    483465        return voidType;
    484466}
    485467
    486 Type * Mutator::mutate( BasicType *basicType ) {
     468Type *Mutator::mutate( BasicType *basicType ) {
    487469        mutateAll( basicType->get_forall(), *this );
    488470        return basicType;
    489471}
    490472
    491 Type * Mutator::mutate( PointerType *pointerType ) {
     473Type *Mutator::mutate( PointerType *pointerType ) {
    492474        mutateAll( pointerType->get_forall(), *this );
    493475        pointerType->set_base( maybeMutate( pointerType->get_base(), *this ) );
     
    495477}
    496478
    497 Type * Mutator::mutate( ArrayType *arrayType ) {
     479Type *Mutator::mutate( ArrayType *arrayType ) {
    498480        mutateAll( arrayType->get_forall(), *this );
    499481        arrayType->set_dimension( maybeMutate( arrayType->get_dimension(), *this ) );
     
    502484}
    503485
    504 Type * Mutator::mutate( ReferenceType * refType ) {
     486Type *Mutator::mutate( ReferenceType *refType ) {
    505487        mutateAll( refType->get_forall(), *this );
    506488        refType->set_base( maybeMutate( refType->get_base(), *this ) );
     
    508490}
    509491
    510 Type * Mutator::mutate( FunctionType * functionType ) {
     492Type *Mutator::mutate( FunctionType *functionType ) {
    511493        mutateAll( functionType->get_forall(), *this );
    512494        mutateAll( functionType->get_returnVals(), *this );
     
    515497}
    516498
    517 Type * Mutator::handleReferenceToType( ReferenceToType *aggregateUseType ) {
     499Type *Mutator::handleReferenceToType( ReferenceToType *aggregateUseType ) {
    518500        mutateAll( aggregateUseType->get_forall(), *this );
    519501        mutateAll( aggregateUseType->get_parameters(), *this );
     
    521503}
    522504
    523 Type * Mutator::mutate( StructInstType *aggregateUseType ) {
     505Type *Mutator::mutate( StructInstType *aggregateUseType ) {
    524506        handleReferenceToType( aggregateUseType );
    525507        return aggregateUseType;
    526508}
    527509
    528 Type * Mutator::mutate( UnionInstType *aggregateUseType ) {
     510Type *Mutator::mutate( UnionInstType *aggregateUseType ) {
    529511        handleReferenceToType( aggregateUseType );
    530512        return aggregateUseType;
    531513}
    532514
    533 Type * Mutator::mutate( EnumInstType *aggregateUseType ) {
     515Type *Mutator::mutate( EnumInstType *aggregateUseType ) {
    534516        handleReferenceToType( aggregateUseType );
    535517        return aggregateUseType;
    536518}
    537519
    538 Type * Mutator::mutate( TraitInstType *aggregateUseType ) {
     520Type *Mutator::mutate( TraitInstType *aggregateUseType ) {
    539521        handleReferenceToType( aggregateUseType );
    540522        mutateAll( aggregateUseType->get_members(), *this );
     
    542524}
    543525
    544 Type * Mutator::mutate( TypeInstType *aggregateUseType ) {
     526Type *Mutator::mutate( TypeInstType *aggregateUseType ) {
    545527        handleReferenceToType( aggregateUseType );
    546528        return aggregateUseType;
    547529}
    548530
    549 Type * Mutator::mutate( TupleType *tupleType ) {
     531Type *Mutator::mutate( TupleType *tupleType ) {
    550532        mutateAll( tupleType->get_forall(), *this );
    551533        mutateAll( tupleType->get_types(), *this );
     
    554536}
    555537
    556 Type * Mutator::mutate( TypeofType *typeofType ) {
     538Type *Mutator::mutate( TypeofType *typeofType ) {
    557539        assert( typeofType->get_expr() );
    558540        typeofType->set_expr( typeofType->get_expr()->acceptMutator( *this ) );
     
    560542}
    561543
    562 Type * Mutator::mutate( AttrType *attrType ) {
     544Type *Mutator::mutate( AttrType *attrType ) {
    563545        if ( attrType->get_isType() ) {
    564546                assert( attrType->get_type() );
     
    571553}
    572554
    573 Type * Mutator::mutate( VarArgsType *varArgsType ) {
     555Type *Mutator::mutate( VarArgsType *varArgsType ) {
    574556        mutateAll( varArgsType->get_forall(), *this );
    575557        return varArgsType;
    576558}
    577559
    578 Type * Mutator::mutate( ZeroType *zeroType ) {
     560Type *Mutator::mutate( ZeroType *zeroType ) {
    579561        mutateAll( zeroType->get_forall(), *this );
    580562        return zeroType;
    581563}
    582564
    583 Type * Mutator::mutate( OneType *oneType ) {
     565Type *Mutator::mutate( OneType *oneType ) {
    584566        mutateAll( oneType->get_forall(), *this );
    585567        return oneType;
     
    587569
    588570
    589 Designation * Mutator::mutate( Designation * designation ) {
     571Designation *Mutator::mutate( Designation * designation ) {
    590572        mutateAll( designation->get_designators(), *this );
    591573        return designation;
    592574}
    593575
    594 Initializer * Mutator::mutate( SingleInit *singleInit ) {
     576Initializer *Mutator::mutate( SingleInit *singleInit ) {
    595577        singleInit->set_value( singleInit->get_value()->acceptMutator( *this ) );
    596578        return singleInit;
    597579}
    598580
    599 Initializer * Mutator::mutate( ListInit *listInit ) {
     581Initializer *Mutator::mutate( ListInit *listInit ) {
    600582        mutateAll( listInit->get_designations(), *this );
    601583        mutateAll( listInit->get_initializers(), *this );
     
    603585}
    604586
    605 Initializer * Mutator::mutate( ConstructorInit *ctorInit ) {
     587Initializer *Mutator::mutate( ConstructorInit *ctorInit ) {
    606588        ctorInit->set_ctor( maybeMutate( ctorInit->get_ctor(), *this ) );
    607589        ctorInit->set_dtor( maybeMutate( ctorInit->get_dtor(), *this ) );
     
    611593
    612594
    613 Subrange * Mutator::mutate( Subrange *subrange ) {
     595Subrange *Mutator::mutate( Subrange *subrange ) {
    614596        return subrange;
    615597}
    616598
    617599
    618 Constant * Mutator::mutate( Constant *constant ) {
     600Constant *Mutator::mutate( Constant *constant ) {
    619601        return constant;
    620602}
  • src/SynTree/Mutator.h

    r212c421e rf22b7aef  
    4949        virtual Statement* mutate( CatchStmt *catchStmt );
    5050        virtual Statement* mutate( FinallyStmt *catchStmt );
    51         virtual Statement* mutate( WaitForStmt *waitforStmt );
    5251        virtual NullStmt* mutate( NullStmt *nullStmt );
    5352        virtual Statement* mutate( DeclStmt *declStmt );
  • src/SynTree/Statement.cc

    r212c421e rf22b7aef  
    419419}
    420420
    421 WaitForStmt::WaitForStmt( std::list<Label> labels ) : Statement( labels ) {
    422         timeout.time      = nullptr;
    423         timeout.statement = nullptr;
    424         timeout.condition = nullptr;
    425         orelse .statement = nullptr;
    426         orelse .condition = nullptr;
    427 }
    428 
    429 WaitForStmt::WaitForStmt( const WaitForStmt & other ) : Statement( other ) {
    430         clauses.reserve( other.clauses.size() );
    431         for( auto & ocl : other.clauses ) {
    432                 clauses.emplace_back();
    433                 clauses.back().target.function = ocl.target.function->clone();
    434                 cloneAll( ocl.target.arguments, clauses.back().target.arguments );
    435                 clauses.back().statement = ocl.statement->clone();
    436                 clauses.back().condition = ocl.condition->clone();
    437         }
    438 
    439         timeout.time      = other.timeout.time     ->clone();
    440         timeout.statement = other.timeout.statement->clone();
    441         timeout.condition = other.timeout.condition->clone();
    442         orelse .statement = other.orelse .statement->clone();
    443         orelse .condition = other.orelse .condition->clone();
    444 }
    445 
    446 WaitForStmt::~WaitForStmt() {
    447         for( auto & clause : clauses ) {
    448                 delete clause.target.function;
    449                 deleteAll( clause.target.arguments );
    450                 delete clause.statement;
    451                 delete clause.condition;
    452         }
    453 
    454         delete timeout.time;
    455         delete timeout.statement;
    456         delete timeout.condition;
    457 
    458         delete orelse.statement;
    459         delete orelse.condition;
    460 }
    461 
    462 void WaitForStmt::print( std::ostream &os, int indent ) const {
    463         os << "Waitfor Statement" << endl;
    464         os << string( indent + 2, ' ' ) << "with block:" << endl;
    465         os << string( indent + 4, ' ' );
    466         // block->print( os, indent + 4 );
    467 }
    468 
    469421NullStmt::NullStmt( std::list<Label> labels ) : CompoundStmt( labels ) {}
    470422NullStmt::NullStmt() : CompoundStmt( std::list<Label>() ) {}
  • src/SynTree/Statement.h

    r212c421e rf22b7aef  
    1919#include <list>                    // for list
    2020#include <memory>                  // for allocator
    21 #include <vector>                        // for vector
    2221
    2322#include "BaseSyntaxNode.h"        // for BaseSyntaxNode
     
    393392};
    394393
    395 class WaitForStmt : public Statement {
    396   public:
    397 
    398         struct Target {
    399                 Expression * function;
    400                 std::list<Expression * > arguments;
    401         };
    402 
    403         struct Clause {
    404                 Target       target;
    405                 Statement  * statement;
    406                 Expression * condition;
    407         };
    408 
    409         WaitForStmt( std::list<Label> labels = noLabels );
    410         WaitForStmt( const WaitForStmt & );
    411         virtual ~WaitForStmt();
    412 
    413         std::vector<Clause> clauses;
    414 
    415         struct {
    416                 Expression * time;
    417                 Statement  * statement;
    418                 Expression * condition;
    419         } timeout;
    420 
    421         struct {
    422                 Statement  * statement;
    423                 Expression * condition;
    424         } orelse;
    425 
    426         virtual WaitForStmt *clone() const { return new WaitForStmt( *this ); }
    427         virtual void accept( Visitor &v ) { v.visit( this ); }
    428         virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    429         virtual void print( std::ostream &os, int indent = 0 ) const;
    430 
    431 };
    432 
    433394
    434395// represents a declaration that occurs as part of a compound statement
  • src/SynTree/SynTree.h

    r212c421e rf22b7aef  
    5454class CatchStmt;
    5555class FinallyStmt;
    56 class WaitForStmt;
    5756class NullStmt;
    5857class DeclStmt;
  • src/SynTree/Visitor.cc

    r212c421e rf22b7aef  
    155155}
    156156
    157 void Visitor::visit( WaitForStmt *waitforStmt ) {
    158         for( auto & clause : waitforStmt->clauses ) {
    159                 maybeAccept( clause.target.function, *this );
    160                 acceptAll( clause.target.arguments, *this );
    161 
    162                 maybeAccept( clause.statement, *this );
    163                 maybeAccept( clause.condition, *this );
    164         }
    165 
    166         maybeAccept( waitforStmt->timeout.time, *this );
    167         maybeAccept( waitforStmt->timeout.statement, *this );
    168         maybeAccept( waitforStmt->timeout.condition, *this );
    169         maybeAccept( waitforStmt->orelse.statement, *this );
    170         maybeAccept( waitforStmt->orelse.condition, *this );
    171 }
    172 
    173157void Visitor::visit( __attribute__((unused)) NullStmt *nullStmt ) {
    174158}
  • src/SynTree/Visitor.h

    r212c421e rf22b7aef  
    5151        virtual void visit( CatchStmt *catchStmt );
    5252        virtual void visit( FinallyStmt *finallyStmt );
    53         virtual void visit( WaitForStmt *waitforStmt );
    5453        virtual void visit( NullStmt *nullStmt );
    5554        virtual void visit( DeclStmt *declStmt );
  • src/libcfa/concurrency/invoke.h

    r212c421e rf22b7aef  
    2828      #define thread_local _Thread_local
    2929
    30       typedef void (*fptr_t)();
    31 
    3230      struct spinlock {
    3331            volatile int lock;
     
    5250            void append( struct __thread_queue_t *, struct thread_desc * );
    5351            struct thread_desc * pop_head( struct __thread_queue_t * );
    54             struct thread_desc * remove( struct __thread_queue_t *, struct thread_desc ** );
    5552
    5653            void ?{}( struct __condition_stack_t & );
     
    9087            struct __condition_stack_t signal_stack;  // stack of conditions to run next once we exit the monitor
    9188            unsigned int recursion;                   // monitor routines can be called recursively, we need to keep track of that
    92 
    93             struct __acceptable_t * acceptables;      // list of acceptable functions, null if any
    94             unsigned short acceptable_count;          // number of acceptable functions
    95             short accepted_index;                     // the index of the accepted function, -1 if none
    96        };
     89      };
    9790
    9891      struct thread_desc {
    99             // Core threading fields
    10092            struct coroutine_desc cor;                // coroutine body used to store context
    10193            struct monitor_desc mon;                  // monitor body used for mutual exclusion
    102 
    103             // Link lists fields
    10494            struct thread_desc * next;                // instrusive link field for threads
    105 
    106             // Current status related to monitors
    10795            struct monitor_desc ** current_monitors;  // currently held monitors
    10896            unsigned short current_monitor_count;     // number of currently held monitors
    109             fptr_t current_monitor_func;              // last function that acquired monitors
    110      };
     97      };
    11198
    11299#endif //_INVOKE_H_
  • src/libcfa/concurrency/kernel.c

    r212c421e rf22b7aef  
    322322void ScheduleThread( thread_desc * thrd ) {
    323323        // if( !thrd ) return;
    324         verify( thrd );
    325         verify( thrd->cor.state != Halted );
     324        assert( thrd );
     325        assert( thrd->cor.state != Halted );
    326326
    327327        verify( disable_preempt_count > 0 );
     
    366366
    367367void BlockInternal( thread_desc * thrd ) {
    368         assert(thrd);
    369368        disable_interrupts();
    370369        assert( thrd->cor.state != Halted );
     
    380379
    381380void BlockInternal( spinlock * lock, thread_desc * thrd ) {
    382         assert(thrd);
    383381        disable_interrupts();
    384382        this_processor->finish.action_code = Release_Schedule;
     
    668666}
    669667
    670 thread_desc * remove( __thread_queue_t * this, thread_desc ** it ) {
    671         thread_desc * thrd = *it;
    672         verify( thrd );
    673 
    674         (*it) = thrd->next;
    675 
    676         if( this->tail == &thrd->next ) {
    677                 this->tail = it;
    678         }
    679 
    680         thrd->next = NULL;
    681 
    682         verify( (this->head == NULL) == (&this->head == this->tail) );
    683         verify( *this->tail == NULL );
    684         return thrd;
    685 }
    686 
    687668void ?{}( __condition_stack_t & this ) {
    688669        this.top = NULL;
  • src/libcfa/concurrency/monitor

    r212c421e rf22b7aef  
    2323
    2424static inline void ?{}(monitor_desc & this) {
    25         (this.lock){};
    2625        this.owner = NULL;
    27         (this.entry_queue){};
    28         (this.signal_stack){};
    2926        this.recursion = 0;
    30         this.acceptables = NULL;
    31         this.acceptable_count = 0;
    32         this.accepted_index = -1;
    3327}
    3428
     
    3832        monitor_desc ** prev_mntrs;
    3933        unsigned short  prev_count;
    40         fptr_t          prev_func;
    4134};
    4235
     
    4538}
    4639
    47 void ?{}( monitor_guard_t & this, monitor_desc ** m, int count, void (*func)() );
     40void ?{}( monitor_guard_t & this, monitor_desc ** m, int count );
    4841void ^?{}( monitor_guard_t & this );
    4942
     
    9689uintptr_t front( condition * this );
    9790
    98 //-----------------------------------------------------------------------------
    99 // External scheduling
    100 
    10191struct __acceptable_t {
    102         fptr_t func;
     92        void (*func)(void);
    10393        unsigned short count;
    104         monitor_desc ** monitors;
     94        monitor_desc * monitors[1];
    10595};
    10696
    107 int __accept_internal( unsigned short count, __acceptable_t * acceptables );
     97void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) );
    10898
    10999// Local Variables: //
  • src/libcfa/concurrency/monitor.c

    r212c421e rf22b7aef  
    2525static inline void set_owner( monitor_desc * this, thread_desc * owner );
    2626static inline thread_desc * next_thread( monitor_desc * this );
    27 static inline int is_accepted( thread_desc * owner, monitor_desc * this, monitor_desc ** group, int group_cnt, void (*func)() );
    2827
    2928static inline void lock_all( spinlock ** locks, unsigned short count );
     
    3534static inline void restore_recursion( monitor_desc ** ctx, unsigned int * /*in */ recursions, unsigned short count );
    3635
    37 static inline void init     ( int count, monitor_desc ** monitors, __condition_node_t * waiter, __condition_criterion_t * criteria );
    38 static inline void init_push( int count, monitor_desc ** monitors, __condition_node_t * waiter, __condition_criterion_t * criteria );
    39 
    4036static inline thread_desc * check_condition( __condition_criterion_t * );
    4137static inline void brand_condition( condition * );
    4238static inline unsigned short insert_unique( thread_desc ** thrds, unsigned short end, thread_desc * val );
    4339
    44 static inline thread_desc * search_entry_queue( __acceptable_t * acceptables, int acc_count, monitor_desc ** monitors, int count );
    45 
    46 //-----------------------------------------------------------------------------
    47 // Useful defines
    48 #define wait_ctx(thrd, user_info)                               /* Create the necessary information to use the signaller stack       */ \
    49         __condition_node_t waiter = { thrd, count, user_info };   /* Create the node specific to this wait operation                   */ \
    50         __condition_criterion_t criteria[count];                  /* Create the creteria this wait operation needs to wake up          */ \
    51         init( count, monitors, &waiter, criteria );               /* Link everything together                                          */ \
    52 
    53 #define wait_ctx_primed(thrd, user_info)                        /* Create the necessary information to use the signaller stack       */ \
    54         __condition_node_t waiter = { thrd, count, user_info };   /* Create the node specific to this wait operation                   */ \
    55         __condition_criterion_t criteria[count];                  /* Create the creteria this wait operation needs to wake up          */ \
    56         init_push( count, monitors, &waiter, criteria );          /* Link everything together and push it to the AS-Stack              */ \
    57 
    58 #define monitor_ctx( mons, cnt )              /* Define that create the necessary struct for internal/external scheduling operations */ \
    59         monitor_desc ** monitors = mons;        /* Save the targeted monitors                                                          */ \
    60         unsigned short count = cnt;             /* Save the count to a local variable                                                  */ \
    61         unsigned int recursions[ count ];       /* Save the current recursion levels to restore them later                             */ \
    62         spinlock *   locks     [ count ];       /* We need to pass-in an array of locks to BlockInternal                               */ \
    63 
    6440//-----------------------------------------------------------------------------
    6541// Enter/Leave routines
     
    6743
    6844extern "C" {
    69         // Enter single monitor
    70         static void __enter_monitor_desc( monitor_desc * this, monitor_desc ** group, int group_cnt, void (*func)() ) {
    71                 // Lock the monitor spinlock, lock_yield to reduce contention
     45        void __enter_monitor_desc( monitor_desc * this ) {
    7246                lock_yield( &this->lock DEBUG_CTX2 );
    7347                thread_desc * thrd = this_thread;
    7448
    75                 LIB_DEBUG_PRINT_SAFE("Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner);
    76 
    77                 this->accepted_index = -1;
     49                // LIB_DEBUG_PRINT_SAFE("%p Entering %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion);
     50
    7851                if( !this->owner ) {
    79                         // No one has the monitor, just take it
     52                        //No one has the monitor, just take it
    8053                        set_owner( this, thrd );
    81 
    82                         LIB_DEBUG_PRINT_SAFE("Kernel :  mon is free \n");
    8354                }
    8455                else if( this->owner == thrd) {
    85                         // We already have the monitor, just not how many times we took it
     56                        //We already have the monitor, just not how many times we took it
    8657                        verify( this->recursion > 0 );
    8758                        this->recursion += 1;
    88 
    89                         LIB_DEBUG_PRINT_SAFE("Kernel :  mon already owned \n");
    90                 }
    91                 else if( (this->accepted_index = is_accepted( thrd, this, group, group_cnt, func)) >= 0 ) {
    92                         // Some one was waiting for us, enter
    93                         set_owner( this, thrd );
    94 
    95                         LIB_DEBUG_PRINT_SAFE("Kernel :  mon accepts \n");
    9659                }
    9760                else {
    98                         LIB_DEBUG_PRINT_SAFE("Kernel :  blocking \n");
    99 
    100                         // Some one else has the monitor, wait in line for it
     61                        //Some one else has the monitor, wait in line for it
    10162                        append( &this->entry_queue, thrd );
     63                        // LIB_DEBUG_PRINT_SAFE("%p Blocking on entry\n", thrd);
    10264                        BlockInternal( &this->lock );
    10365
    104                         LIB_DEBUG_PRINT_SAFE("Kernel : %10p Entered  mon %p\n", thrd, this);
    105 
    106                         // BlockInternal will unlock spinlock, no need to unlock ourselves
     66                        //BlockInternal will unlock spinlock, no need to unlock ourselves
    10767                        return;
    10868                }
    10969
    110                 LIB_DEBUG_PRINT_SAFE("Kernel : %10p Entered  mon %p\n", thrd, this);
    111 
    112                 // Release the lock and leave
    11370                unlock( &this->lock );
    11471                return;
    11572        }
    11673
    117         // Leave single monitor
     74        // leave pseudo code :
     75        //      TODO
    11876        void __leave_monitor_desc( monitor_desc * this ) {
    119                 // Lock the monitor spinlock, lock_yield to reduce contention
    12077                lock_yield( &this->lock DEBUG_CTX2 );
    12178
     79                // LIB_DEBUG_PRINT_SAFE("%p Leaving %p (o: %p, r: %i). ", this_thread, this, this->owner, this->recursion);
    12280                verifyf( this_thread == this->owner, "Expected owner to be %p, got %p (r: %i)", this_thread, this->owner, this->recursion );
    12381
    124                 // Leaving a recursion level, decrement the counter
     82                //Leaving a recursion level, decrement the counter
    12583                this->recursion -= 1;
    12684
    127                 // If we haven't left the last level of recursion
    128                 // it means we don't need to do anything
     85                //If we haven't left the last level of recursion
     86                //it means we don't need to do anything
    12987                if( this->recursion != 0) {
    13088                        unlock( &this->lock );
     
    13290                }
    13391
    134                 // Get the next thread, will be null on low contention monitor
    13592                thread_desc * new_owner = next_thread( this );
    13693
    137                 // We can now let other threads in safely
     94                //We can now let other threads in safely
    13895                unlock( &this->lock );
     96
     97                // LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner);
    13998
    14099                //We need to wake-up the thread
     
    142101        }
    143102
    144         // Leave the thread monitor
    145         // last routine called by a thread.
    146         // Should never return
    147103        void __leave_thread_monitor( thread_desc * thrd ) {
    148104                monitor_desc * this = &thrd->mon;
    149 
    150                 // Lock the monitor now
    151105                lock_yield( &this->lock DEBUG_CTX2 );
    152106
     
    157111                verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i)", thrd, this->owner, this->recursion );
    158112
    159                 // Leaving a recursion level, decrement the counter
     113                //Leaving a recursion level, decrement the counter
    160114                this->recursion -= 1;
    161115
    162                 // If we haven't left the last level of recursion
    163                 // it must mean there is an error
    164                 if( this->recursion != 0) { abortf("Thread internal monitor has unbalanced recursion"); }
    165 
    166                 // Fetch the next thread, can be null
     116                //If we haven't left the last level of recursion
     117                //it means we don't need to do anything
     118                if( this->recursion != 0) {
     119                        unlock( &this->lock );
     120                        return;
     121                }
     122
    167123                thread_desc * new_owner = next_thread( this );
    168124
    169                 // Leave the thread, this will unlock the spinlock
    170                 // Use leave thread instead of BlockInternal which is
    171                 // specialized for this case and supports null new_owner
    172125                LeaveThread( &this->lock, new_owner );
    173 
    174                 // Control flow should never reach here!
    175         }
    176 }
    177 
    178 // Enter multiple monitor
    179 // relies on the monitor array being sorted
    180 static inline void enter(monitor_desc ** monitors, int count, void (*func)() ) {
     126        }
     127}
     128
     129static inline void enter(monitor_desc ** monitors, int count) {
    181130        for(int i = 0; i < count; i++) {
    182                 __enter_monitor_desc( monitors[i], monitors, count, func );
    183         }
    184 }
    185 
    186 // Leave multiple monitor
    187 // relies on the monitor array being sorted
     131                __enter_monitor_desc( monitors[i] );
     132        }
     133}
     134
    188135static inline void leave(monitor_desc ** monitors, int count) {
    189136        for(int i = count - 1; i >= 0; i--) {
     
    192139}
    193140
    194 // Ctor for monitor guard
    195 // Sorts monitors before entering
    196 void ?{}( monitor_guard_t & this, monitor_desc ** m, int count, void (*func)() ) {
    197         // Store current array
     141void ?{}( monitor_guard_t & this, monitor_desc ** m, int count ) {
    198142        this.m = m;
    199143        this.count = count;
    200 
    201         // Sort monitors based on address -> TODO use a sort specialized for small numbers
    202144        qsort(this.m, count);
    203 
    204         // Save previous thread context
     145        enter( this.m, this.count );
     146
    205147        this.prev_mntrs = this_thread->current_monitors;
    206148        this.prev_count = this_thread->current_monitor_count;
    207         this.prev_func  = this_thread->current_monitor_func;
    208 
    209         // Update thread context (needed for conditions)
     149
    210150        this_thread->current_monitors      = m;
    211151        this_thread->current_monitor_count = count;
    212         this_thread->current_monitor_func  = func;
    213 
    214         // Enter the monitors in order
    215         enter( this.m, this.count, func );
    216 }
    217 
    218 
    219 // Dtor for monitor guard
     152}
     153
    220154void ^?{}( monitor_guard_t & this ) {
    221         // Leave the monitors in order
    222155        leave( this.m, this.count );
    223156
    224         // Restore thread context
    225157        this_thread->current_monitors      = this.prev_mntrs;
    226158        this_thread->current_monitor_count = this.prev_count;
    227         this_thread->current_monitor_func  = this.prev_func;
    228 }
    229 
    230 //-----------------------------------------------------------------------------
    231 // Internal scheduling types
     159}
     160
    232161void ?{}(__condition_node_t & this, thread_desc * waiting_thread, unsigned short count, uintptr_t user_info ) {
    233162        this.waiting_thread = waiting_thread;
     
    254183// Internal scheduling
    255184void wait( condition * this, uintptr_t user_info = 0 ) {
     185        // LIB_DEBUG_PRINT_SAFE("Waiting\n");
     186
    256187        brand_condition( this );
    257188
    258         // Check that everything is as expected
     189        //Check that everything is as expected
    259190        assertf( this->monitors != NULL, "Waiting with no monitors (%p)", this->monitors );
    260191        verifyf( this->monitor_count != 0, "Waiting with 0 monitors (%i)", this->monitor_count );
    261192        verifyf( this->monitor_count < 32u, "Excessive monitor count (%i)", this->monitor_count );
    262193
    263         // Create storage for monitor context
    264         monitor_ctx( this->monitors, this->monitor_count );
    265 
    266         // Create the node specific to this wait operation
    267         wait_ctx( this_thread, user_info );
    268 
    269         // Append the current wait operation to the ones already queued on the condition
    270         // We don't need locks for that since conditions must always be waited on inside monitor mutual exclusion
     194        unsigned short count = this->monitor_count;
     195        unsigned int recursions[ count ];               //Save the current recursion levels to restore them later
     196        spinlock *   locks     [ count ];               //We need to pass-in an array of locks to BlockInternal
     197
     198        // LIB_DEBUG_PRINT_SAFE("count %i\n", count);
     199
     200        __condition_node_t waiter = { (thread_desc*)this_thread, count, user_info };
     201
     202        __condition_criterion_t criteria[count];
     203        for(int i = 0; i < count; i++) {
     204                (criteria[i]){ this->monitors[i], &waiter };
     205                // LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
     206        }
     207
     208        waiter.criteria = criteria;
    271209        append( &this->blocked, &waiter );
    272210
    273         // Lock all monitors (aggregates the lock them as well)
    274         lock_all( monitors, locks, count );
    275 
    276         // DON'T unlock, ask the kernel to do it
    277 
    278         // Save monitor state
    279         save_recursion( monitors, recursions, count );
    280 
    281         // Find the next thread(s) to run
     211        lock_all( this->monitors, locks, count );
     212        save_recursion( this->monitors, recursions, count );
     213        //DON'T unlock, ask the kernel to do it
     214
     215        //Find the next thread(s) to run
    282216        unsigned short thread_count = 0;
    283217        thread_desc * threads[ count ];
     
    286220        }
    287221
    288         // Remove any duplicate threads
    289222        for( int i = 0; i < count; i++) {
    290                 thread_desc * new_owner = next_thread( monitors[i] );
     223                thread_desc * new_owner = next_thread( this->monitors[i] );
    291224                thread_count = insert_unique( threads, thread_count, new_owner );
    292225        }
     226
     227        // LIB_DEBUG_PRINT_SAFE("Will unblock: ");
     228        for(int i = 0; i < thread_count; i++) {
     229                // LIB_DEBUG_PRINT_SAFE("%p ", threads[i]);
     230        }
     231        // LIB_DEBUG_PRINT_SAFE("\n");
    293232
    294233        // Everything is ready to go to sleep
     
    296235
    297236
    298         // WE WOKE UP
    299 
    300 
    301         // We are back, restore the owners and recursions
     237        //WE WOKE UP
     238
     239
     240        //We are back, restore the owners and recursions
    302241        lock_all( locks, count );
    303         restore_recursion( monitors, recursions, count );
     242        restore_recursion( this->monitors, recursions, count );
    304243        unlock_all( locks, count );
    305244}
    306245
    307246bool signal( condition * this ) {
    308         if( is_empty( this ) ) { return false; }
     247        if( is_empty( this ) ) {
     248                // LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
     249                return false;
     250        }
    309251
    310252        //Check that everything is as expected
    311253        verify( this->monitors );
    312254        verify( this->monitor_count != 0 );
     255
     256        unsigned short count = this->monitor_count;
    313257
    314258        //Some more checking in debug
     
    317261                if ( this->monitor_count != this_thrd->current_monitor_count ) {
    318262                        abortf( "Signal on condition %p made with different number of monitor(s), expected %i got %i", this, this->monitor_count, this_thrd->current_monitor_count );
    319                 }
     263                } // if
    320264
    321265                for(int i = 0; i < this->monitor_count; i++) {
    322266                        if ( this->monitors[i] != this_thrd->current_monitors[i] ) {
    323267                                abortf( "Signal on condition %p made with different monitor, expected %p got %i", this, this->monitors[i], this_thrd->current_monitors[i] );
    324                         }
     268                        } // if
    325269                }
    326270        );
    327271
    328         unsigned short count = this->monitor_count;
    329 
    330         // Lock all monitors
     272        //Lock all the monitors
    331273        lock_all( this->monitors, NULL, count );
     274        // LIB_DEBUG_PRINT_SAFE("Signalling");
    332275
    333276        //Pop the head of the waiting queue
     
    337280        for(int i = 0; i < count; i++) {
    338281                __condition_criterion_t * crit = &node->criteria[i];
     282                // LIB_DEBUG_PRINT_SAFE(" %p", crit->target);
    339283                assert( !crit->ready );
    340284                push( &crit->target->signal_stack, crit );
    341285        }
    342286
     287        // LIB_DEBUG_PRINT_SAFE("\n");
     288
    343289        //Release
    344290        unlock_all( this->monitors, count );
     
    348294
    349295bool signal_block( condition * this ) {
    350         if( !this->blocked.head ) { return false; }
     296        if( !this->blocked.head ) {
     297                LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
     298                return false;
     299        }
    351300
    352301        //Check that everything is as expected
     
    354303        verifyf( this->monitor_count != 0, "Waiting with 0 monitors (%i)", this->monitor_count );
    355304
    356         // Create storage for monitor context
    357         monitor_ctx( this->monitors, this->monitor_count );
    358 
    359         // Lock all monitors (aggregates the locks them as well)
    360         lock_all( monitors, locks, count );
    361 
    362         // Create the node specific to this wait operation
    363         wait_ctx_primed( this_thread, 0 )
     305        unsigned short count = this->monitor_count;
     306        unsigned int recursions[ count ];               //Save the current recursion levels to restore them later
     307        spinlock *   locks     [ count ];               //We need to pass-in an array of locks to BlockInternal
     308
     309        lock_all( this->monitors, locks, count );
     310
     311        //create creteria
     312        __condition_node_t waiter = { (thread_desc*)this_thread, count, 0 };
     313
     314        __condition_criterion_t criteria[count];
     315        for(int i = 0; i < count; i++) {
     316                (criteria[i]){ this->monitors[i], &waiter };
     317                // LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
     318                push( &criteria[i].target->signal_stack, &criteria[i] );
     319        }
     320
     321        waiter.criteria = criteria;
    364322
    365323        //save contexts
    366         save_recursion( monitors, recursions, count );
     324        save_recursion( this->monitors, recursions, count );
    367325
    368326        //Find the thread to run
    369327        thread_desc * signallee = pop_head( &this->blocked )->waiting_thread;
    370328        for(int i = 0; i < count; i++) {
    371                 set_owner( monitors[i], signallee );
    372         }
     329                set_owner( this->monitors[i], signallee );
     330        }
     331
     332        LIB_DEBUG_PRINT_SAFE( "Waiting on signal block\n" );
    373333
    374334        //Everything is ready to go to sleep
     
    376336
    377337
    378         // WE WOKE UP
    379 
     338
     339
     340        LIB_DEBUG_PRINT_SAFE( "Back from signal block\n" );
    380341
    381342        //We are back, restore the owners and recursions
    382343        lock_all( locks, count );
    383         restore_recursion( monitors, recursions, count );
     344        restore_recursion( this->monitors, recursions, count );
    384345        unlock_all( locks, count );
    385346
     
    387348}
    388349
    389 // Access the user_info of the thread waiting at the front of the queue
    390350uintptr_t front( condition * this ) {
    391351        verifyf( !is_empty(this),
     
    398358//-----------------------------------------------------------------------------
    399359// Internal scheduling
    400 int __accept_internal( unsigned short acc_count, __acceptable_t * acceptables ) {
    401         thread_desc * thrd = this_thread;
    402 
    403         // Create storage for monitor context
    404         monitor_ctx( acceptables->monitors, acceptables->count );
    405 
    406         // Lock all monitors (aggregates the lock them as well)
    407         lock_all( monitors, locks, count );
    408 
    409         // Create the node specific to this wait operation
    410         wait_ctx_primed( thrd, 0 );
    411 
    412         // Check if the entry queue
    413         thread_desc * next = search_entry_queue( acceptables, acc_count, monitors, count );
    414 
    415         LIB_DEBUG_PRINT_SAFE("Owner(s) :");
    416         for(int i = 0; i < count; i++) {
    417                 LIB_DEBUG_PRINT_SAFE(" %p", monitors[i]->owner );
    418         }
    419         LIB_DEBUG_PRINT_SAFE("\n");
    420 
    421         LIB_DEBUG_PRINT_SAFE("Passing mon to %p\n", next);
    422 
    423         if( !next ) {
    424                 // Update acceptables on the current monitors
    425                 for(int i = 0; i < count; i++) {
    426                         monitors[i]->acceptables = acceptables;
    427                         monitors[i]->acceptable_count = acc_count;
    428                 }
    429         }
    430         else {
    431                 for(int i = 0; i < count; i++) {
    432                         set_owner( monitors[i], next );
    433                 }
    434         }
    435 
    436 
    437         save_recursion( monitors, recursions, count );
    438 
    439 
    440         // Everything is ready to go to sleep
    441         BlockInternal( locks, count, &next, next ? 1 : 0 );
    442 
    443 
    444         //WE WOKE UP
    445 
    446 
    447         //We are back, restore the owners and recursions
    448         lock_all( locks, count );
    449         restore_recursion( monitors, recursions, count );
    450         int acc_idx = monitors[0]->accepted_index;
    451         unlock_all( locks, count );
    452 
    453         return acc_idx;
     360void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) ) {
     361        // thread_desc * this = this_thread;
     362
     363        // unsigned short count = this->current_monitor_count;
     364        // unsigned int recursions[ count ];            //Save the current recursion levels to restore them later
     365        // spinlock *   locks     [ count ];            //We need to pass-in an array of locks to BlockInternal
     366
     367        // lock_all( this->current_monitors, locks, count );
     368
     369
     370
     371
     372
     373        // // // Everything is ready to go to sleep
     374        // // BlockInternal( locks, count, threads, thread_count );
     375
     376
     377        // //WE WOKE UP
     378
     379
     380        // //We are back, restore the owners and recursions
     381        // lock_all( locks, count );
     382        // restore_recursion( this->monitors, recursions, count );
     383        // unlock_all( locks, count );
    454384}
    455385
     
    485415}
    486416
    487 static inline int is_accepted( thread_desc * owner, monitor_desc * this, monitor_desc ** group, int group_cnt, void (*func)() ) {
    488         __acceptable_t* accs = this->acceptables; // Optim
    489         int acc_cnt = this->acceptable_count;
    490 
    491         // Check if there are any acceptable functions
    492         if( !accs ) return -1;
    493 
    494         // If this isn't the first monitor to test this, there is no reason to repeat the test.
    495         if( this != group[0] ) return group[0]->accepted_index;
    496 
    497         // For all acceptable functions check if this is the current function.
    498         OUT_LOOP:
    499         for( int i = 0; i < acc_cnt; i++ ) {
    500                 __acceptable_t * acc = &accs[i];
    501 
    502                 // if function matches, check the monitors
    503                 if( acc->func == func ) {
    504 
    505                         // If the group count is different then it can't be a match
    506                         if( acc->count != group_cnt ) return -1;
    507 
    508                         // Check that all the monitors match
    509                         for( int j = 0; j < group_cnt; j++ ) {
    510                                 // If not a match, check next function
    511                                 if( acc->monitors[j] != group[j] ) continue OUT_LOOP;
    512                         }
    513 
    514                         // It's a complete match, accept the call
    515                         return i;
    516                 }
    517         }
    518 
    519         // No function matched
    520         return -1;
    521 }
    522 
    523 static inline void init( int count, monitor_desc ** monitors, __condition_node_t * waiter, __condition_criterion_t * criteria ) {
    524         for(int i = 0; i < count; i++) {
    525                 (criteria[i]){ monitors[i], waiter };
    526         }
    527 
    528         waiter->criteria = criteria;
    529 }
    530 
    531 static inline void init_push( int count, monitor_desc ** monitors, __condition_node_t * waiter, __condition_criterion_t * criteria ) {
    532         for(int i = 0; i < count; i++) {
    533                 (criteria[i]){ monitors[i], waiter };
    534                 push( &criteria[i].target->signal_stack, &criteria[i] );
    535         }
    536 
    537         waiter->criteria = criteria;
    538 }
    539 
    540417static inline void lock_all( spinlock ** locks, unsigned short count ) {
    541418        for( int i = 0; i < count; i++ ) {
     
    628505}
    629506
    630 
    631 static inline bool match( __acceptable_t * acc, thread_desc * thrd ) {
    632         verify( thrd );
    633         verify( acc );
    634         if( acc->func != thrd->current_monitor_func ) return false;
    635 
    636         return true;
    637 }
    638 
    639 static inline thread_desc * search_entry_queue( __acceptable_t * acceptables, int acc_count, monitor_desc ** monitors, int count ) {
    640 
    641         __thread_queue_t * entry_queue = &monitors[0]->entry_queue;
    642 
    643         // For each thread in the entry-queue
    644         for(    thread_desc ** thrd_it = &entry_queue->head;
    645                 *thrd_it;
    646                 thrd_it = &(*thrd_it)->next)
    647         {
    648                 // For each acceptable check if it matches
    649                 __acceptable_t * acc_end = acceptables + acc_count;
    650                 for( __acceptable_t * acc_it = acceptables; acc_it != acc_end; acc_it++ ) {
    651                         // Check if we have a match
    652                         if( match( acc_it, *thrd_it ) ) {
    653 
    654                                 // If we have a match return it
    655                                 // after removeing it from the entry queue
    656                                 return remove( entry_queue, thrd_it );
    657                         }
    658                 }
    659         }
    660 
    661         return NULL;
    662 }
    663507void ?{}( __condition_blocked_queue_t & this ) {
    664508        this.head = NULL;
  • src/libcfa/concurrency/preemption.c

    r212c421e rf22b7aef  
    332332                assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
    333333
    334                 // LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
     334                LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
    335335                // Switch on the code (a.k.a. the sender) to
    336336                switch( info.si_code )
     
    340340                case SI_TIMER:
    341341                case SI_KERNEL:
    342                         // LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
     342                        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
    343343                        lock( &event_kernel->lock DEBUG_CTX2 );
    344344                        tick_preemption();
  • src/tests/preempt_longrun/stack.c

    r212c421e rf22b7aef  
    1515
    1616void main(worker_t * this) {
    17         volatile long long p = 5_021_609ul;
    18         volatile long long a = 326_417ul;
    19         volatile long long n = 1l;
    20         for (volatile long long i = 0; i < p; i++) {
     17        volatile long p = 5_021_609ul;
     18        volatile long a = 326_417ul;
     19        volatile long n = 1l;
     20        for (volatile long i = 0; i < p; i++) {
    2121                n *= a;
    2222                n %= p;
  • src/tests/sched-int-disjoint.c

    r212c421e rf22b7aef  
    33#include <monitor>
    44#include <thread>
    5 
    6 #include <time.h>
    75
    86static const unsigned long N = 10_000ul;
     
    109107// Main loop
    110108int main(int argc, char* argv[]) {
    111         rand48seed( time( NULL ) );
    112109        all_done = false;
    113110        processor p;
  • src/tests/sched-int-wait.c

    r212c421e rf22b7aef  
    55#include <thread>
    66
    7 #include <time.h>
    8 
    9 static const unsigned long N = 2_500ul;
     7static const unsigned long N = 10_000ul;
    108
    119#ifndef PREEMPTION_RATE
     
    121119// Main
    122120int main(int argc, char* argv[]) {
    123         rand48seed( time( NULL ) );
    124121        waiter_left = 4;
    125122        processor p[2];
Note: See TracChangeset for help on using the changeset viewer.