Changes in / [dbae916:c19ca4b]


Ignore:
Files:
5 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py

    rdbae916 rc19ca4b  
    169169                    else:
    170170                        plt.ylim(0, None)
    171                     plt.xticks(procs)
    172171                    ax.legend(names)
    173172                    # fig.savefig("plots/" + machineName + name + ".png")
  • libcfa/src/Makefile.am

    rdbae916 rc19ca4b  
    4848        math.hfa \
    4949        time_t.hfa \
    50     virtual_dtor.hfa \
    5150        bits/algorithm.hfa \
    5251        bits/align.hfa \
     
    6968        vec/vec2.hfa \
    7069        vec/vec3.hfa \
    71         vec/vec4.hfa 
     70        vec/vec4.hfa
    7271
    7372inst_headers_src = \
  • libcfa/src/concurrency/actor.hfa

    rdbae916 rc19ca4b  
    55#include <kernel.hfa>
    66#include <iofwd.hfa>
    7 #include <virtual_dtor.hfa>
    87
    98#ifdef __CFA_DEBUG__
     
    358357    if ( seperate_clus ) delete( cluster );
    359358
    360     #ifdef STATS // print formatted stats
     359    #ifdef STATS
    361360    printf("    Actor System Stats:\n");
    362361    printf("\tActors Created:\t\t\t\t%lu\n\tMessages Sent:\t\t\t\t%lu\n", __num_actors_stats, __all_processed);
     
    389388static executor * __actor_executor_ = 0p;
    390389static bool __actor_executor_passed = false;            // was an executor passed to start_actor_system
    391 static size_t __num_actors_ = 0;                                        // number of actor objects in system
     390static size_t __num_actors_ = 0;                                // number of actor objects in system
    392391static struct thread$ * __actor_executor_thd = 0p;              // used to wake executor after actors finish
    393392struct actor {
    394     size_t ticket;                                          // executor-queue handle
     393    size_t ticket;                              // executor-queue handle
    395394    Allocation allocation_;                                         // allocation action
    396     inline virtual_dtor;
    397395};
    398396
     
    408406    #endif
    409407}
     408static inline void ^?{}( actor & this ) {}
    410409
    411410static inline void check_actor( actor & this ) {
     
    431430struct message {
    432431    Allocation allocation_;                     // allocation action
    433     inline virtual_dtor;
    434432};
    435433
    436 static inline void ?{}( message & this ) {
    437     this.allocation_ = Nodelete;
    438 }
     434static inline void ?{}( message & this ) { this.allocation_ = Nodelete; }
    439435static inline void ?{}( message & this, Allocation allocation ) {
    440436    memcpy( &this.allocation_, &allocation, sizeof(allocation) ); // optimization to elide ctor
    441437    verifyf( this.allocation_ != Finished, "The Finished Allocation status is not supported for message types.\n");
    442438}
    443 static inline void ^?{}( message & this ) with(this) {
    444     CFA_DEBUG( if ( allocation_ == Nodelete ) printf("A message at location %p was allocated but never sent.\n", &this); )
     439static inline void ^?{}( message & this ) {
     440    CFA_DEBUG( if ( this.allocation_ == Nodelete ) printf("A message at location %p was allocated but never sent.\n", &this); )
    445441}
    446442
    447443static inline void check_message( message & this ) {
    448     switch ( this.allocation_ ) {                                               // analyze message status
    449         case Nodelete: CFA_DEBUG(this.allocation_ = Finished); break;
     444    #ifdef __CFA_DEBUG__
     445    Allocation temp = this.allocation_;
     446    this.allocation_ = Finished;
     447    switch ( temp )
     448    #else
     449    switch ( this.allocation_ )
     450    #endif
     451    {                                           // analyze message status
     452        case Nodelete: break;
    450453        case Delete: delete( &this ); break;
    451454        case Destroy: ^?{}(this); break;
     
    453456    } // switch
    454457}
    455 static inline void set_allocation( message & this, Allocation state ) {
    456     this.allocation_ = state;
    457 }
     458static inline void set_allocation( message & this, Allocation state ) { this.allocation_ = state; }
    458459
    459460static inline void deliver_request( request & this ) {
     
    687688Allocation receive( actor & this, __DestroyMsg & msg ) { return Destroy; }
    688689Allocation receive( actor & this, __FinishedMsg & msg ) { return Finished; }
    689 
  • src/Concurrency/Actors.cpp

    rdbae916 rc19ca4b  
    4545    // finds and sets a ptr to the actor, message, and request structs, which are needed in the next pass
    4646    void previsit( const StructDecl * decl ) {
    47         if ( !decl->body ) return;
    48         if ( decl->name == "actor" ) {
    49             actorStructDecls.insert( decl ); // skip inserting fwd decl
     47        GuardValue(insideStruct);
     48        insideStruct = true;
     49        parentDecl = mutate( decl );
     50        if( decl->name == "actor" ) {
     51            if ( actorDecl ) actorStructDecls.insert( decl ); // skip inserting fwd decl
    5052            *actorDecl = decl;
    51         } else if( decl->name == "message" ) {
    52             messageStructDecls.insert( decl ); // skip inserting fwd decl
     53        }
     54        if( decl->name == "message" ) {
     55            if ( msgDecl ) messageStructDecls.insert( decl ); // skip inserting fwd decl
    5356            *msgDecl = decl;
    54         } else if( decl->name == "request" ) *requestDecl = decl;
    55         else {
    56             GuardValue(insideStruct);
    57             insideStruct = true;
    58             parentDecl = mutate( decl );
    59         }
     57        }
     58        if( decl->name == "request" ) *requestDecl = decl;
    6059        }
    6160
     
    7170    }
    7271
    73     // this collects the derived actor and message struct decl ptrs
     72    // this collects the valid actor and message struct decl pts
    7473    void postvisit( const StructInstType * node ) {
    7574        if ( ! *actorDecl || ! *msgDecl ) return;
    7675        if ( insideStruct && !namedDecl ) {
    77             auto actorIter = actorStructDecls.find( node->aggr() );   
    78             if ( actorIter != actorStructDecls.end() ) {
     76            if ( node->aggr() == *actorDecl ) {
    7977                actorStructDecls.insert( parentDecl );
    80                 return;
    81             }
    82             auto messageIter = messageStructDecls.find( node->aggr() );
    83             if ( messageIter != messageStructDecls.end() ) {
     78            } else if ( node->aggr() == *msgDecl ) {
    8479                messageStructDecls.insert( parentDecl );
    8580            }
     
    191186};
    192187
    193 // generates the definitions of send operators for actors
    194 // collects data needed for next pass that does the circular defn resolution
    195 //     for message send operators (via table above)
    196 struct GenFuncsCreateTables : public ast::WithDeclsToAdd<> {
     188struct GenReceiveDecls : public ast::WithDeclsToAdd<> {
    197189    unordered_set<const StructDecl *> & actorStructDecls;
    198190    unordered_set<const StructDecl *>  & messageStructDecls;
     
    203195    FwdDeclTable & forwardDecls;
    204196
    205     // generates the operator for actor message sends
    206197        void postvisit( const FunctionDecl * decl ) {
    207198        // return if not of the form receive( param1, param2 ) or if it is a forward decl
     
    222213        auto messageIter = messageStructDecls.find( arg2InstType->aggr() );
    223214        if ( actorIter != actorStructDecls.end() && messageIter != messageStructDecls.end() ) {
     215
     216            // check that we have found all the decls we need from <actor.hfa>
     217            if ( !*allocationDecl || !*requestDecl )
     218                SemanticError( decl->location, "using actors requires a header, add #include <actor.hfa>\n" );
     219
    224220            //////////////////////////////////////////////////////////////////////
    225221            // The following generates this send message operator routine for all receive(derived_actor &, derived_msg &) functions
     
    351347            // forward decls to resolve use before decl problem for '|' routines
    352348            forwardDecls.insertDecl( *actorIter, *messageIter , ast::deepCopy( sendOperatorFunction ) );
     349            // forwardDecls.push_back( ast::deepCopy( sendOperatorFunction ) );
    353350
    354351            sendOperatorFunction->stmts = sendBody;
     
    358355
    359356  public:
    360     GenFuncsCreateTables( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls,
     357    GenReceiveDecls( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls,
    361358        const StructDecl ** requestDecl, const EnumDecl ** allocationDecl, const StructDecl ** actorDecl, const StructDecl ** msgDecl,
    362359        FwdDeclTable & forwardDecls ) : actorStructDecls(actorStructDecls), messageStructDecls(messageStructDecls),
     
    364361};
    365362
    366 
    367 // separate pass is needed since this pass resolves circular defn issues
    368 // generates the forward declarations of the send operator for actor routines
    369 struct FwdDeclOperator : public ast::WithDeclsToAdd<> {
     363struct GenFwdDecls : public ast::WithDeclsToAdd<> {
    370364    unordered_set<const StructDecl *> & actorStructDecls;
    371365    unordered_set<const StructDecl *>  & messageStructDecls;
    372366    FwdDeclTable & forwardDecls;
    373367
    374     // handles forward declaring the message operator
    375368    void postvisit( const StructDecl * decl ) {
    376369        list<FunctionDecl *> toAddAfter;
     
    399392
    400393  public:
    401     FwdDeclOperator( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls,
    402         FwdDeclTable & forwardDecls ) : actorStructDecls(actorStructDecls), messageStructDecls(messageStructDecls), forwardDecls(forwardDecls) {}
     394    GenFwdDecls( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls,
     395        FwdDeclTable & forwardDecls ) : actorStructDecls(actorStructDecls), messageStructDecls(messageStructDecls),
     396        forwardDecls(forwardDecls) {}
    403397};
    404398
     
    426420    Pass<CollectactorStructDecls>::run( translationUnit, actorStructDecls, messageStructDecls, requestDecl,
    427421        allocationDecl, actorDecl, msgDecl );
    428 
    429     // check that we have found all the decls we need from <actor.hfa>, if not no need to run the rest of this pass
    430     if ( !allocationDeclPtr || !requestDeclPtr || !actorDeclPtr || !msgDeclPtr )
    431         return;
    432 
     422       
    433423    // second pass locates all receive() routines that overload the generic receive fn
    434424    // it then generates the appropriate operator '|' send routines for the receive routines
    435     Pass<GenFuncsCreateTables>::run( translationUnit, actorStructDecls, messageStructDecls, requestDecl,
     425    Pass<GenReceiveDecls>::run( translationUnit, actorStructDecls, messageStructDecls, requestDecl,
    436426        allocationDecl, actorDecl, msgDecl, forwardDecls );
    437427
    438428    // The third pass forward declares operator '|' send routines
    439     Pass<FwdDeclOperator>::run( translationUnit, actorStructDecls, messageStructDecls, forwardDecls );
     429    Pass<GenFwdDecls>::run( translationUnit, actorStructDecls, messageStructDecls, forwardDecls );
    440430}
    441431
  • src/Concurrency/Actors.hpp

    rdbae916 rc19ca4b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Actors.hpp -- Implement concurrency constructs from their keywords.
     7// Keywords.h -- Implement concurrency constructs from their keywords.
    88//
    99// Author           : Colby Parsons
  • src/Virtual/module.mk

    rdbae916 rc19ca4b  
    1919        Virtual/ExpandCasts.h \
    2020        Virtual/Tables.cc \
    21         Virtual/Tables.h \
    22         Virtual/VirtualDtor.cpp \
    23         Virtual/VirtualDtor.hpp
     21        Virtual/Tables.h
  • src/main.cc

    rdbae916 rc19ca4b  
    8282#include "Validate/VerifyCtorDtorAssign.hpp" // for verifyCtorDtorAssign
    8383#include "Virtual/ExpandCasts.h"            // for expandCasts
    84 #include "Virtual/VirtualDtor.hpp"           // for implementVirtDtors
    8584
    8685static void NewPass( const char * const name ) {
     
    342341
    343342                PASS( "Implement Actors", Concurrency::implementActors( transUnit ) );
    344         PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors(transUnit) );
    345        
    346343                PASS( "Implement Mutex", Concurrency::implementMutex( transUnit ) );
    347344                PASS( "Implement Thread Start", Concurrency::implementThreadStarter( transUnit ) );
  • tests/concurrent/actors/executor.cfa

    rdbae916 rc19ca4b  
    1515};
    1616void ?{}( d_actor & this ) with(this) {
     17    ((actor &)this){};
    1718    id = ids++;
    1819    gstart = (&this + (id / Set * Set - id)); // remember group-start array-element
  • tests/concurrent/actors/poison.cfa

    rdbae916 rc19ca4b  
    55#include <stdio.h>
    66
    7 struct Server { int val; inline actor; };
    8 
    9 void ?{}( Server & this ) { this.val = 999; }
    10 void ^?{}( Server & this ) { this.val = 777; }
     7struct Server { inline actor; };
    118
    129int main() {
     
    1512    sout | "Finished";
    1613    {
    17         start_actor_system();
    18         Server s[10];
    19         for ( i; 10 ) {
    20             s[i] << FinishedMsg;
    21         }
    22         stop_actor_system();
     14    start_actor_system();
     15    Server s[10];
     16    for ( i; 10 ) {
     17        s[i] << FinishedMsg;
     18    }
     19    stop_actor_system();
    2320    }
    2421
    2522    sout | "Delete";
    2623    {
    27         start_actor_system();
    28         for ( i; 10 ) {
    29             Server * s = alloc();
    30             (*s){};
    31             (*s) << DeleteMsg;
    32         }
    33         stop_actor_system();
     24    start_actor_system();
     25    for ( i; 10 ) {
     26        Server * s = alloc();
     27        (*s){};
     28        (*s) << DeleteMsg;
     29    }
     30    stop_actor_system();
    3431    }
    3532
    3633    sout | "Destroy";
    3734    {
    38         start_actor_system();
    39         Server s[10];
    40         for ( i; 10 )
    41             s[i] << DestroyMsg;
    42         stop_actor_system();
    43         for ( i; 10 )
    44             if (s[i].val != 777)
    45                 sout | "Error: dtor not called correctly.";
     35    start_actor_system();
     36    Server s[10];
     37    for ( i; 10 ) {
     38        s[i] << DestroyMsg;
     39    }
     40    stop_actor_system();
    4641    }
    4742
Note: See TracChangeset for help on using the changeset viewer.