Changes in / [d10e391:2fd4cea]
- Files:
-
- 3 edited
-
libcfa/src/concurrency/actor.hfa (modified) (3 diffs)
-
libcfa/src/concurrency/locks.hfa (modified) (1 diff)
-
src/Concurrency/Actors.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/actor.hfa
rd10e391 r2fd4cea 46 46 enum allocation { Nodelete, Delete, Destroy, Finished }; // allocation status 47 47 48 typedef allocation (*__receive_fn)(actor &, message & , actor **, message **);48 typedef allocation (*__receive_fn)(actor &, message &); 49 49 struct request { 50 actor * base_receiver; 50 51 actor * receiver; 52 message * base_msg; 51 53 message * msg; 52 54 __receive_fn fn; … … 57 59 }; 58 60 static inline void ?{}( request & this ) {} 59 static inline void ?{}( request & this, actor * receiver, message * msg, __receive_fn fn ) { 61 static inline void ?{}( request & this, actor * base_receiver, actor * receiver, message * base_msg, message * msg, __receive_fn fn ) { 62 this.base_receiver = base_receiver; 60 63 this.receiver = receiver; 64 this.base_msg = base_msg; 61 65 this.msg = msg; 62 66 this.fn = fn; … … 456 460 static inline void deliver_request( request & this ) { 457 461 DEBUG_ABORT( this.receiver->ticket == (unsigned long int)MAX, "Attempted to send message to deleted/dead actor\n" ); 458 actor * base_actor; 459 message * base_msg; 460 allocation temp = this.fn( *this.receiver, *this.msg, &base_actor, &base_msg ); 461 base_actor->allocation_ = temp; 462 check_message( *base_msg ); 463 check_actor( *base_actor ); 462 this.base_receiver->allocation_ = this.fn( *this.receiver, *this.msg ); 463 check_message( *this.base_msg ); 464 check_actor( *this.base_receiver ); 464 465 } 465 466 -
libcfa/src/concurrency/locks.hfa
rd10e391 r2fd4cea 35 35 #include <linux/futex.h> /* Definition of FUTEX_* constants */ 36 36 #include <sys/syscall.h> /* Definition of SYS_* constants */ 37 #include <unistd.h> /* Definition of syscall routine */37 #include <unistd.h> 38 38 39 39 typedef void (*__cfa_pre_park)( void * ); -
src/Concurrency/Actors.cpp
rd10e391 r2fd4cea 223 223 if ( actorIter != actorStructDecls.end() && messageIter != messageStructDecls.end() ) { 224 224 ////////////////////////////////////////////////////////////////////// 225 // The following generates this wrapper for all receive(derived_actor &, derived_msg &) functions226 /* base_actor and base_msg are output params227 static inline allocation __CFA_receive_wrap( derived_actor & receiver, derived_msg & msg, actor ** base_actor, message ** base_msg ) {228 base_actor = &receiver;229 base_msg = &msg;230 return receive( receiver, msg );231 }232 */233 CompoundStmt * wrapBody = new CompoundStmt( decl->location );234 235 // generates: base_actor = &receiver;236 wrapBody->push_back( new ExprStmt( decl->location,237 UntypedExpr::createAssign( decl->location,238 UntypedExpr::createDeref( decl->location, new NameExpr( decl->location, "base_actor" ) ),239 new AddressExpr( decl->location, new NameExpr( decl->location, "receiver" ) )240 )241 ));242 243 // generates: base_msg = &msg;244 wrapBody->push_back( new ExprStmt( decl->location,245 UntypedExpr::createAssign( decl->location,246 UntypedExpr::createDeref( decl->location, new NameExpr( decl->location, "base_msg" ) ),247 new AddressExpr( decl->location, new NameExpr( decl->location, "msg" ) )248 )249 ));250 251 // generates: return receive( receiver, msg );252 wrapBody->push_back( new ReturnStmt( decl->location,253 new UntypedExpr ( decl->location,254 new NameExpr( decl->location, "receive" ),255 {256 new NameExpr( decl->location, "receiver" ),257 new NameExpr( decl->location, "msg" )258 }259 )260 ));261 262 // create receive wrapper to extract base message and actor pointer263 // put it all together into the complete function decl from above264 FunctionDecl * receiveWrapper = new FunctionDecl(265 decl->location,266 "__CFA_receive_wrap",267 {}, // forall268 {269 new ObjectDecl(270 decl->location,271 "receiver",272 ast::deepCopy( derivedActorRef )273 ),274 new ObjectDecl(275 decl->location,276 "msg",277 ast::deepCopy( derivedMsgRef )278 ),279 new ObjectDecl(280 decl->location,281 "base_actor",282 new PointerType( new PointerType( new StructInstType( *actorDecl ) ) )283 ),284 new ObjectDecl(285 decl->location,286 "base_msg",287 new PointerType( new PointerType( new StructInstType( *msgDecl ) ) )288 )289 }, // params290 {291 new ObjectDecl(292 decl->location,293 "__CFA_receive_wrap_ret",294 new EnumInstType( *allocationDecl )295 )296 },297 wrapBody, // body298 { Storage::Static }, // storage299 Linkage::Cforall, // linkage300 {}, // attributes301 { Function::Inline }302 );303 304 declsToAddAfter.push_back( receiveWrapper );305 306 //////////////////////////////////////////////////////////////////////307 225 // The following generates this send message operator routine for all receive(derived_actor &, derived_msg &) functions 308 226 /* … … 328 246 )); 329 247 330 // Function type is: allocation (*)( derived_actor &, derived_msg & , actor **, message **)248 // Function type is: allocation (*)( derived_actor &, derived_msg & ) 331 249 FunctionType * derivedReceive = new FunctionType(); 332 250 derivedReceive->params.push_back( ast::deepCopy( derivedActorRef ) ); 333 251 derivedReceive->params.push_back( ast::deepCopy( derivedMsgRef ) ); 334 derivedReceive->params.push_back( new PointerType( new PointerType( new StructInstType( *actorDecl ) ) ) );335 derivedReceive->params.push_back( new PointerType( new PointerType( new StructInstType( *msgDecl ) ) ) );336 252 derivedReceive->returns.push_back( new EnumInstType( *allocationDecl ) ); 337 253 338 // Generates: allocation (*my_work_fn)( derived_actor &, derived_msg & , actor **, message **) = receive;254 // Generates: allocation (*my_work_fn)( derived_actor &, derived_msg & ) = receive; 339 255 sendBody->push_back( new DeclStmt( 340 256 decl->location, … … 343 259 "my_work_fn", 344 260 new PointerType( derivedReceive ), 345 new SingleInit( decl->location, new NameExpr( decl->location, " __CFA_receive_wrap" ) )261 new SingleInit( decl->location, new NameExpr( decl->location, "receive" ) ) 346 262 ) 347 263 )); … … 351 267 genericReceive->params.push_back( new ReferenceType( new StructInstType( *actorDecl ) ) ); 352 268 genericReceive->params.push_back( new ReferenceType( new StructInstType( *msgDecl ) ) ); 353 genericReceive->params.push_back( new PointerType( new PointerType( new StructInstType( *actorDecl ) ) ) );354 genericReceive->params.push_back( new PointerType( new PointerType( new StructInstType( *msgDecl ) ) ) );355 269 genericReceive->returns.push_back( new EnumInstType( *allocationDecl ) ); 356 270 … … 371 285 )); 372 286 373 // Generates: new_req{ (actor *)&receiver, (message *)&msg, fn };287 // Generates: new_req{ &receiver, (actor *)&receiver, &msg, (message *)&msg, fn }; 374 288 sendBody->push_back( new ExprStmt( 375 289 decl->location, … … 379 293 { 380 294 new NameExpr( decl->location, "new_req" ), 295 new AddressExpr( new NameExpr( decl->location, "receiver" ) ), 381 296 new CastExpr( decl->location, new AddressExpr( new NameExpr( decl->location, "receiver" ) ), new PointerType( new StructInstType( *actorDecl ) ), ExplicitCast ), 297 new AddressExpr( new NameExpr( decl->location, "msg" ) ), 382 298 new CastExpr( decl->location, new AddressExpr( new NameExpr( decl->location, "msg" ) ), new PointerType( new StructInstType( *msgDecl ) ), ExplicitCast ), 383 299 new NameExpr( decl->location, "fn" )
Note:
See TracChangeset
for help on using the changeset viewer.