Changes in / [c19ca4b:dbae916]
- Files:
-
- 5 added
- 9 edited
-
doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py (modified) (1 diff)
-
libcfa/src/Makefile.am (modified) (2 diffs)
-
libcfa/src/concurrency/actor.hfa (modified) (7 diffs)
-
libcfa/src/virtual_dtor.hfa (added)
-
src/Concurrency/Actors.cpp (modified) (10 diffs)
-
src/Concurrency/Actors.hpp (modified) (1 diff)
-
src/Virtual/VirtualDtor.cpp (added)
-
src/Virtual/VirtualDtor.hpp (added)
-
src/Virtual/module.mk (modified) (1 diff)
-
src/main.cc (modified) (2 diffs)
-
tests/concurrent/actors/.expect/inherit.txt (added)
-
tests/concurrent/actors/executor.cfa (modified) (1 diff)
-
tests/concurrent/actors/inherit.cfa (added)
-
tests/concurrent/actors/poison.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py
rc19ca4b rdbae916 169 169 else: 170 170 plt.ylim(0, None) 171 plt.xticks(procs) 171 172 ax.legend(names) 172 173 # fig.savefig("plots/" + machineName + name + ".png") -
libcfa/src/Makefile.am
rc19ca4b rdbae916 48 48 math.hfa \ 49 49 time_t.hfa \ 50 virtual_dtor.hfa \ 50 51 bits/algorithm.hfa \ 51 52 bits/align.hfa \ … … 68 69 vec/vec2.hfa \ 69 70 vec/vec3.hfa \ 70 vec/vec4.hfa 71 vec/vec4.hfa 71 72 72 73 inst_headers_src = \ -
libcfa/src/concurrency/actor.hfa
rc19ca4b rdbae916 5 5 #include <kernel.hfa> 6 6 #include <iofwd.hfa> 7 #include <virtual_dtor.hfa> 7 8 8 9 #ifdef __CFA_DEBUG__ … … 357 358 if ( seperate_clus ) delete( cluster ); 358 359 359 #ifdef STATS 360 #ifdef STATS // print formatted stats 360 361 printf(" Actor System Stats:\n"); 361 362 printf("\tActors Created:\t\t\t\t%lu\n\tMessages Sent:\t\t\t\t%lu\n", __num_actors_stats, __all_processed); … … 388 389 static executor * __actor_executor_ = 0p; 389 390 static bool __actor_executor_passed = false; // was an executor passed to start_actor_system 390 static size_t __num_actors_ = 0; // number of actor objects in system391 static size_t __num_actors_ = 0; // number of actor objects in system 391 392 static struct thread$ * __actor_executor_thd = 0p; // used to wake executor after actors finish 392 393 struct actor { 393 size_t ticket; // executor-queue handle394 size_t ticket; // executor-queue handle 394 395 Allocation allocation_; // allocation action 396 inline virtual_dtor; 395 397 }; 396 398 … … 406 408 #endif 407 409 } 408 static inline void ^?{}( actor & this ) {}409 410 410 411 static inline void check_actor( actor & this ) { … … 430 431 struct message { 431 432 Allocation allocation_; // allocation action 433 inline virtual_dtor; 432 434 }; 433 435 434 static inline void ?{}( message & this ) { this.allocation_ = Nodelete; } 436 static inline void ?{}( message & this ) { 437 this.allocation_ = Nodelete; 438 } 435 439 static inline void ?{}( message & this, Allocation allocation ) { 436 440 memcpy( &this.allocation_, &allocation, sizeof(allocation) ); // optimization to elide ctor 437 441 verifyf( this.allocation_ != Finished, "The Finished Allocation status is not supported for message types.\n"); 438 442 } 439 static inline void ^?{}( message & this ) {440 CFA_DEBUG( if ( this.allocation_ == Nodelete ) printf("A message at location %p was allocated but never sent.\n", &this); )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); ) 441 445 } 442 446 443 447 static inline void check_message( message & this ) { 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; 448 switch ( this.allocation_ ) { // analyze message status 449 case Nodelete: CFA_DEBUG(this.allocation_ = Finished); break; 453 450 case Delete: delete( &this ); break; 454 451 case Destroy: ^?{}(this); break; … … 456 453 } // switch 457 454 } 458 static inline void set_allocation( message & this, Allocation state ) { this.allocation_ = state; } 455 static inline void set_allocation( message & this, Allocation state ) { 456 this.allocation_ = state; 457 } 459 458 460 459 static inline void deliver_request( request & this ) { … … 688 687 Allocation receive( actor & this, __DestroyMsg & msg ) { return Destroy; } 689 688 Allocation receive( actor & this, __FinishedMsg & msg ) { return Finished; } 689 -
src/Concurrency/Actors.cpp
rc19ca4b rdbae916 45 45 // finds and sets a ptr to the actor, message, and request structs, which are needed in the next pass 46 46 void previsit( const StructDecl * 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 47 if ( !decl->body ) return; 48 if ( decl->name == "actor" ) { 49 actorStructDecls.insert( decl ); // skip inserting fwd decl 52 50 *actorDecl = decl; 53 } 54 if( decl->name == "message" ) { 55 if ( msgDecl ) messageStructDecls.insert( decl ); // skip inserting fwd decl 51 } else if( decl->name == "message" ) { 52 messageStructDecls.insert( decl ); // skip inserting fwd decl 56 53 *msgDecl = decl; 57 } 58 if( decl->name == "request" ) *requestDecl = decl; 54 } else if( decl->name == "request" ) *requestDecl = decl; 55 else { 56 GuardValue(insideStruct); 57 insideStruct = true; 58 parentDecl = mutate( decl ); 59 } 59 60 } 60 61 … … 70 71 } 71 72 72 // this collects the valid actor and message struct decl pts73 // this collects the derived actor and message struct decl ptrs 73 74 void postvisit( const StructInstType * node ) { 74 75 if ( ! *actorDecl || ! *msgDecl ) return; 75 76 if ( insideStruct && !namedDecl ) { 76 if ( node->aggr() == *actorDecl ) { 77 auto actorIter = actorStructDecls.find( node->aggr() ); 78 if ( actorIter != actorStructDecls.end() ) { 77 79 actorStructDecls.insert( parentDecl ); 78 } else if ( node->aggr() == *msgDecl ) { 80 return; 81 } 82 auto messageIter = messageStructDecls.find( node->aggr() ); 83 if ( messageIter != messageStructDecls.end() ) { 79 84 messageStructDecls.insert( parentDecl ); 80 85 } … … 186 191 }; 187 192 188 struct GenReceiveDecls : public ast::WithDeclsToAdd<> { 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<> { 189 197 unordered_set<const StructDecl *> & actorStructDecls; 190 198 unordered_set<const StructDecl *> & messageStructDecls; … … 195 203 FwdDeclTable & forwardDecls; 196 204 205 // generates the operator for actor message sends 197 206 void postvisit( const FunctionDecl * decl ) { 198 207 // return if not of the form receive( param1, param2 ) or if it is a forward decl … … 213 222 auto messageIter = messageStructDecls.find( arg2InstType->aggr() ); 214 223 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 220 224 ////////////////////////////////////////////////////////////////////// 221 225 // The following generates this send message operator routine for all receive(derived_actor &, derived_msg &) functions … … 347 351 // forward decls to resolve use before decl problem for '|' routines 348 352 forwardDecls.insertDecl( *actorIter, *messageIter , ast::deepCopy( sendOperatorFunction ) ); 349 // forwardDecls.push_back( ast::deepCopy( sendOperatorFunction ) );350 353 351 354 sendOperatorFunction->stmts = sendBody; … … 355 358 356 359 public: 357 Gen ReceiveDecls( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls,360 GenFuncsCreateTables( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls, 358 361 const StructDecl ** requestDecl, const EnumDecl ** allocationDecl, const StructDecl ** actorDecl, const StructDecl ** msgDecl, 359 362 FwdDeclTable & forwardDecls ) : actorStructDecls(actorStructDecls), messageStructDecls(messageStructDecls), … … 361 364 }; 362 365 363 struct GenFwdDecls : public ast::WithDeclsToAdd<> { 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<> { 364 370 unordered_set<const StructDecl *> & actorStructDecls; 365 371 unordered_set<const StructDecl *> & messageStructDecls; 366 372 FwdDeclTable & forwardDecls; 367 373 374 // handles forward declaring the message operator 368 375 void postvisit( const StructDecl * decl ) { 369 376 list<FunctionDecl *> toAddAfter; … … 392 399 393 400 public: 394 GenFwdDecls( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls, 395 FwdDeclTable & forwardDecls ) : actorStructDecls(actorStructDecls), messageStructDecls(messageStructDecls), 396 forwardDecls(forwardDecls) {} 401 FwdDeclOperator( unordered_set<const StructDecl *> & actorStructDecls, unordered_set<const StructDecl *> & messageStructDecls, 402 FwdDeclTable & forwardDecls ) : actorStructDecls(actorStructDecls), messageStructDecls(messageStructDecls), forwardDecls(forwardDecls) {} 397 403 }; 398 404 … … 420 426 Pass<CollectactorStructDecls>::run( translationUnit, actorStructDecls, messageStructDecls, requestDecl, 421 427 allocationDecl, actorDecl, msgDecl ); 422 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 423 433 // second pass locates all receive() routines that overload the generic receive fn 424 434 // it then generates the appropriate operator '|' send routines for the receive routines 425 Pass<Gen ReceiveDecls>::run( translationUnit, actorStructDecls, messageStructDecls, requestDecl,435 Pass<GenFuncsCreateTables>::run( translationUnit, actorStructDecls, messageStructDecls, requestDecl, 426 436 allocationDecl, actorDecl, msgDecl, forwardDecls ); 427 437 428 438 // The third pass forward declares operator '|' send routines 429 Pass< GenFwdDecls>::run( translationUnit, actorStructDecls, messageStructDecls, forwardDecls );439 Pass<FwdDeclOperator>::run( translationUnit, actorStructDecls, messageStructDecls, forwardDecls ); 430 440 } 431 441 -
src/Concurrency/Actors.hpp
rc19ca4b rdbae916 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Keywords.h-- Implement concurrency constructs from their keywords.7 // Actors.hpp -- Implement concurrency constructs from their keywords. 8 8 // 9 9 // Author : Colby Parsons -
src/Virtual/module.mk
rc19ca4b rdbae916 19 19 Virtual/ExpandCasts.h \ 20 20 Virtual/Tables.cc \ 21 Virtual/Tables.h 21 Virtual/Tables.h \ 22 Virtual/VirtualDtor.cpp \ 23 Virtual/VirtualDtor.hpp -
src/main.cc
rc19ca4b rdbae916 82 82 #include "Validate/VerifyCtorDtorAssign.hpp" // for verifyCtorDtorAssign 83 83 #include "Virtual/ExpandCasts.h" // for expandCasts 84 #include "Virtual/VirtualDtor.hpp" // for implementVirtDtors 84 85 85 86 static void NewPass( const char * const name ) { … … 341 342 342 343 PASS( "Implement Actors", Concurrency::implementActors( transUnit ) ); 344 PASS( "Implement Virtual Destructors", Virtual::implementVirtDtors(transUnit) ); 345 343 346 PASS( "Implement Mutex", Concurrency::implementMutex( transUnit ) ); 344 347 PASS( "Implement Thread Start", Concurrency::implementThreadStarter( transUnit ) ); -
tests/concurrent/actors/executor.cfa
rc19ca4b rdbae916 15 15 }; 16 16 void ?{}( d_actor & this ) with(this) { 17 ((actor &)this){};18 17 id = ids++; 19 18 gstart = (&this + (id / Set * Set - id)); // remember group-start array-element -
tests/concurrent/actors/poison.cfa
rc19ca4b rdbae916 5 5 #include <stdio.h> 6 6 7 struct Server { inline actor; }; 7 struct Server { int val; inline actor; }; 8 9 void ?{}( Server & this ) { this.val = 999; } 10 void ^?{}( Server & this ) { this.val = 777; } 8 11 9 12 int main() { … … 12 15 sout | "Finished"; 13 16 { 14 start_actor_system();15 Server s[10];16 for ( i; 10 ) {17 s[i] << FinishedMsg;18 }19 stop_actor_system();17 start_actor_system(); 18 Server s[10]; 19 for ( i; 10 ) { 20 s[i] << FinishedMsg; 21 } 22 stop_actor_system(); 20 23 } 21 24 22 25 sout | "Delete"; 23 26 { 24 start_actor_system();25 for ( i; 10 ) {26 Server * s = alloc();27 (*s){};28 (*s) << DeleteMsg;29 }30 stop_actor_system();27 start_actor_system(); 28 for ( i; 10 ) { 29 Server * s = alloc(); 30 (*s){}; 31 (*s) << DeleteMsg; 32 } 33 stop_actor_system(); 31 34 } 32 35 33 36 sout | "Destroy"; 34 37 { 35 start_actor_system(); 36 Server s[10]; 37 for ( i; 10 ) { 38 s[i] << DestroyMsg; 39 } 40 stop_actor_system(); 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."; 41 46 } 42 47
Note:
See TracChangeset
for help on using the changeset viewer.