Changeset 3830c84 for src/Concurrency
- Timestamp:
- Mar 14, 2023, 3:48:53 PM (22 months ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 8512a2f
- Parents:
- 2ceb2bf
- Location:
- src/Concurrency
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Concurrency/Actors.cpp
r2ceb2bf r3830c84 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
r2ceb2bf r3830c84 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
Note: See TracChangeset
for help on using the changeset viewer.