- Timestamp:
- Mar 15, 2017, 9:43:15 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 27fed7f1, 738e304
- Parents:
- bf4ac09 (diff), 9b443c7f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - git-author:
- Peter A. Buhr <pabuhr@…> (03/15/17 21:25:49)
- git-committer:
- Peter A. Buhr <pabuhr@…> (03/15/17 21:43:15)
- Location:
- src
- Files:
-
- 28 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
src/Concurrency/Keywords.cc
rbf4ac09 rf2e40a9f 88 88 //Handles mutex routines definitions : 89 89 // void foo( A * mutex a, B * mutex b, int i ) { void foo( A * a, B * b, int i ) { 90 // monitor_desc * __monitors[] = { a, b};90 // monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) }; 91 91 // monitor_guard_t __guard = { __monitors, 2 }; 92 92 // /*Some code*/ => /*Some code*/ … … 98 98 using Visitor::visit; 99 99 virtual void visit( FunctionDecl *functionDecl ) override final; 100 virtual void visit( StructDecl *functionDecl ) override final; 100 101 101 102 std::list<DeclarationWithType*> findMutexArgs( FunctionDecl* ); … … 107 108 acceptAll( translationUnit, impl ); 108 109 } 110 111 private: 112 StructDecl* monitor_decl = nullptr; 109 113 }; 110 114 … … 133 137 if( ! body ) return; 134 138 139 assert(monitor_decl); 135 140 addStatments( body, mutexArgs ); 141 } 142 143 void MutexKeyword::visit(StructDecl* decl) { 144 if( decl->get_name() == "monitor_desc" ) { 145 assert( !monitor_decl ); 146 monitor_decl = decl; 147 } 136 148 } 137 149 … … 167 179 168 180 void MutexKeyword::addStatments( CompoundStmt * body, const std::list<DeclarationWithType * > & args ) { 181 182 ObjectDecl * monitors = new ObjectDecl( 183 "__monitors", 184 noStorage, 185 LinkageSpec::Cforall, 186 nullptr, 187 new ArrayType( 188 noQualifiers, 189 new PointerType( 190 noQualifiers, 191 new StructInstType( 192 noQualifiers, 193 monitor_decl 194 ) 195 ), 196 new ConstantExpr( Constant::from_ulong( args.size() ) ), 197 false, 198 false 199 ), 200 new ListInit( 201 map_range < std::list<Initializer*> > ( args, [](DeclarationWithType * var ){ 202 return new SingleInit( new UntypedExpr( 203 new NameExpr( "get_monitor" ), 204 { new VariableExpr( var ) } 205 ) ); 206 }) 207 ) 208 ); 209 169 210 //in reverse order : 170 211 // monitor_guard_t __guard = { __monitors, # }; … … 181 222 new ListInit( 182 223 { 183 new SingleInit( new NameExpr( "__monitors") ),224 new SingleInit( new VariableExpr( monitors ) ), 184 225 new SingleInit( new ConstantExpr( Constant::from_ulong( args.size() ) ) ) 185 226 } … … 189 230 190 231 //monitor_desc * __monitors[] = { a, b }; 191 body->push_front( 192 new DeclStmt( noLabels, new ObjectDecl( 193 "__monitors", 194 noStorage, 195 LinkageSpec::Cforall, 196 nullptr, 197 new ArrayType( 198 noQualifiers, 199 new PointerType( 200 noQualifiers, 201 new StructInstType( 202 noQualifiers, 203 "monitor_desc" 204 ) 205 ), 206 new ConstantExpr( Constant::from_ulong( args.size() ) ), 207 false, 208 false 209 ), 210 new ListInit( 211 map_range < std::list<Initializer*> > ( args, [](DeclarationWithType * var ){ 212 return new SingleInit( new VariableExpr( var ) ); 213 }) 214 ) 215 )) 216 ); 232 body->push_front( new DeclStmt( noLabels, monitors) ); 217 233 } 218 234 }; -
src/GenPoly/Box.cc
rbf4ac09 rf2e40a9f 381 381 // calculate struct layout in function body 382 382 383 // initialize size and alignment to 0 and 1 (will have at least one member to re-edit size 383 // initialize size and alignment to 0 and 1 (will have at least one member to re-edit size) 384 384 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "0" ) ) ) ); 385 385 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) ); … … 1852 1852 1853 1853 DeclClass *ret = static_cast< DeclClass *>( Mutator::mutate( decl ) ); 1854 ScrubTyVars::scrub( decl, scopeTyVars ); 1854 // ScrubTyVars::scrub( decl, scopeTyVars ); 1855 ScrubTyVars::scrubAll( decl ); 1855 1856 1856 1857 scopeTyVars.endScope(); -
src/GenPoly/GenPoly.cc
rbf4ac09 rf2e40a9f 15 15 16 16 #include "GenPoly.h" 17 #include "assert.h" 17 18 18 19 #include "SynTree/Expression.h" 19 20 #include "SynTree/Type.h" 21 #include "ResolvExpr/typeops.h" 20 22 21 23 #include <iostream> 24 #include <iterator> 25 #include <list> 26 #include <typeindex> 27 #include <typeinfo> 28 #include <vector> 22 29 using namespace std; 23 30 … … 38 45 for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) { 39 46 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 40 assert (paramType &&"Aggregate parameters should be type expressions");47 assertf(paramType, "Aggregate parameters should be type expressions"); 41 48 if ( isPolyType( paramType->get_type(), tyVars, env ) ) return true; 42 49 } … … 48 55 for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) { 49 56 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 50 assert (paramType &&"Aggregate parameters should be type expressions");57 assertf(paramType, "Aggregate parameters should be type expressions"); 51 58 if ( isDynType( paramType->get_type(), tyVars, env ) ) return true; 59 } 60 return false; 61 } 62 63 /// Checks a parameter list for inclusion of polymorphic parameters; will substitute according to env if present 64 bool includesPolyParams( std::list< Expression* >& params, const TypeSubstitution *env ) { 65 for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) { 66 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 67 assertf(paramType, "Aggregate parameters should be type expressions"); 68 if ( includesPolyType( paramType->get_type(), env ) ) return true; 69 } 70 return false; 71 } 72 73 /// Checks a parameter list for inclusion of polymorphic parameters from tyVars; will substitute according to env if present 74 bool includesPolyParams( std::list< Expression* >& params, const TyVarMap &tyVars, const TypeSubstitution *env ) { 75 for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) { 76 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 77 assertf(paramType, "Aggregate parameters should be type expressions"); 78 if ( includesPolyType( paramType->get_type(), tyVars, env ) ) return true; 52 79 } 53 80 return false; … … 187 214 188 215 return isPolyType( type, tyVars, env ); 216 } 217 218 bool includesPolyType( Type *type, const TypeSubstitution *env ) { 219 type = replaceTypeInst( type, env ); 220 221 if ( dynamic_cast< TypeInstType * >( type ) ) { 222 return true; 223 } else if ( PointerType *pointerType = dynamic_cast< PointerType* >( type ) ) { 224 if ( includesPolyType( pointerType->get_base(), env ) ) return true; 225 } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) { 226 if ( includesPolyParams( structType->get_parameters(), env ) ) return true; 227 } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( type ) ) { 228 if ( includesPolyParams( unionType->get_parameters(), env ) ) return true; 229 } 230 return false; 231 } 232 233 bool includesPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) { 234 type = replaceTypeInst( type, env ); 235 236 if ( TypeInstType *typeInstType = dynamic_cast< TypeInstType * >( type ) ) { 237 if ( tyVars.find( typeInstType->get_name() ) != tyVars.end() ) { 238 return true; 239 } 240 } else if ( PointerType *pointerType = dynamic_cast< PointerType* >( type ) ) { 241 if ( includesPolyType( pointerType->get_base(), tyVars, env ) ) return true; 242 } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) { 243 if ( includesPolyParams( structType->get_parameters(), tyVars, env ) ) return true; 244 } else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( type ) ) { 245 if ( includesPolyParams( unionType->get_parameters(), tyVars, env ) ) return true; 246 } 247 return false; 189 248 } 190 249 … … 237 296 } 238 297 298 namespace { 299 /// Checks if is a pointer to D 300 template<typename D, typename B> 301 bool is( const B* p ) { return type_index{typeid(D)} == type_index{typeid(*p)}; } 302 303 /// Converts to a pointer to D without checking for safety 304 template<typename D, typename B> 305 inline D* as( B* p ) { return reinterpret_cast<D*>(p); } 306 307 /// Flattens a declaration list 308 template<typename Output> 309 void flattenList( list< DeclarationWithType* > src, Output out ) { 310 for ( DeclarationWithType* decl : src ) { 311 ResolvExpr::flatten( decl->get_type(), out ); 312 } 313 } 314 315 /// Flattens a list of types 316 template<typename Output> 317 void flattenList( list< Type* > src, Output out ) { 318 for ( Type* ty : src ) { 319 ResolvExpr::flatten( ty, out ); 320 } 321 } 322 323 /// Checks if two lists of parameters are equal up to polymorphic substitution. 324 bool paramListsPolyCompatible( const list< Expression* >& aparams, const list< Expression* >& bparams ) { 325 if ( aparams.size() != bparams.size() ) return false; 326 327 for ( list< Expression* >::const_iterator at = aparams.begin(), bt = bparams.begin(); 328 at != aparams.end(); ++at, ++bt ) { 329 TypeExpr *aparam = dynamic_cast< TypeExpr* >(*at); 330 assertf(aparam, "Aggregate parameters should be type expressions"); 331 TypeExpr *bparam = dynamic_cast< TypeExpr* >(*bt); 332 assertf(bparam, "Aggregate parameters should be type expressions"); 333 334 // xxx - might need to let VoidType be a wildcard here too; could have some voids 335 // stuffed in for dtype-statics. 336 // if ( is<VoidType>( aparam->get_type() ) || is<VoidType>( bparam->get_type() ) ) continue; 337 if ( ! typesPolyCompatible( aparam->get_type(), bparam->get_type() ) ) return false; 338 } 339 340 return true; 341 } 342 } 343 344 bool typesPolyCompatible( Type *a, Type *b ) { 345 type_index aid{ typeid(*a) }; 346 // polymorphic types always match 347 if ( aid == type_index{typeid(TypeInstType)} ) return true; 348 349 type_index bid{ typeid(*b) }; 350 // polymorphic types always match 351 if ( bid == type_index{typeid(TypeInstType)} ) return true; 352 353 // can't match otherwise if different types 354 if ( aid != bid ) return false; 355 356 // recurse through type structure (conditions borrowed from Unify.cc) 357 if ( aid == type_index{typeid(BasicType)} ) { 358 return as<BasicType>(a)->get_kind() == as<BasicType>(b)->get_kind(); 359 } else if ( aid == type_index{typeid(PointerType)} ) { 360 PointerType *ap = as<PointerType>(a), *bp = as<PointerType>(b); 361 362 // void pointers should match any other pointer type 363 return is<VoidType>( ap->get_base() ) || is<VoidType>( bp->get_base() ) 364 || typesPolyCompatible( ap->get_base(), bp->get_base() ); 365 } else if ( aid == type_index{typeid(ArrayType)} ) { 366 ArrayType *aa = as<ArrayType>(a), *ba = as<ArrayType>(b); 367 368 if ( aa->get_isVarLen() ) { 369 if ( ! ba->get_isVarLen() ) return false; 370 } else { 371 if ( ba->get_isVarLen() ) return false; 372 373 ConstantExpr *ad = dynamic_cast<ConstantExpr*>( aa->get_dimension() ); 374 ConstantExpr *bd = dynamic_cast<ConstantExpr*>( ba->get_dimension() ); 375 if ( ad && bd 376 && ad->get_constant()->get_value() != bd->get_constant()->get_value() ) 377 return false; 378 } 379 380 return typesPolyCompatible( aa->get_base(), ba->get_base() ); 381 } else if ( aid == type_index{typeid(FunctionType)} ) { 382 FunctionType *af = as<FunctionType>(a), *bf = as<FunctionType>(b); 383 384 vector<Type*> aparams, bparams; 385 flattenList( af->get_parameters(), back_inserter( aparams ) ); 386 flattenList( bf->get_parameters(), back_inserter( bparams ) ); 387 if ( aparams.size() != bparams.size() ) return false; 388 389 vector<Type*> areturns, breturns; 390 flattenList( af->get_returnVals(), back_inserter( areturns ) ); 391 flattenList( bf->get_returnVals(), back_inserter( breturns ) ); 392 if ( areturns.size() != breturns.size() ) return false; 393 394 for ( unsigned i = 0; i < aparams.size(); ++i ) { 395 if ( ! typesPolyCompatible( aparams[i], bparams[i] ) ) return false; 396 } 397 for ( unsigned i = 0; i < areturns.size(); ++i ) { 398 if ( ! typesPolyCompatible( areturns[i], breturns[i] ) ) return false; 399 } 400 return true; 401 } else if ( aid == type_index{typeid(StructInstType)} ) { 402 StructInstType *aa = as<StructInstType>(a), *ba = as<StructInstType>(b); 403 404 if ( aa->get_name() != ba->get_name() ) return false; 405 return paramListsPolyCompatible( aa->get_parameters(), ba->get_parameters() ); 406 } else if ( aid == type_index{typeid(UnionInstType)} ) { 407 UnionInstType *aa = as<UnionInstType>(a), *ba = as<UnionInstType>(b); 408 409 if ( aa->get_name() != ba->get_name() ) return false; 410 return paramListsPolyCompatible( aa->get_parameters(), ba->get_parameters() ); 411 } else if ( aid == type_index{typeid(EnumInstType)} ) { 412 return as<EnumInstType>(a)->get_name() == as<EnumInstType>(b)->get_name(); 413 } else if ( aid == type_index{typeid(TraitInstType)} ) { 414 return as<TraitInstType>(a)->get_name() == as<TraitInstType>(b)->get_name(); 415 } else if ( aid == type_index{typeid(TupleType)} ) { 416 TupleType *at = as<TupleType>(a), *bt = as<TupleType>(b); 417 418 vector<Type*> atypes, btypes; 419 flattenList( at->get_types(), back_inserter( atypes ) ); 420 flattenList( bt->get_types(), back_inserter( btypes ) ); 421 if ( atypes.size() != btypes.size() ) return false; 422 423 for ( unsigned i = 0; i < atypes.size(); ++i ) { 424 if ( ! typesPolyCompatible( atypes[i], btypes[i] ) ) return false; 425 } 426 return true; 427 } else return true; // VoidType, VarArgsType, ZeroType & OneType just need the same type 428 } 429 239 430 void addToTyVarMap( TypeDecl * tyVar, TyVarMap &tyVarMap ) { 240 431 tyVarMap[ tyVar->get_name() ] = TypeDecl::Data{ tyVar }; -
src/GenPoly/GenPoly.h
rbf4ac09 rf2e40a9f 67 67 Type *hasPolyBase( Type *type, const TyVarMap &tyVars, int *levels = 0, const TypeSubstitution *env = 0 ); 68 68 69 /// true iff this type or some base of this type after dereferencing pointers is either polymorphic or a generic type with at least one 70 /// polymorphic parameter; will look up substitution in env if provided. 71 bool includesPolyType( Type *type, const TypeSubstitution *env = 0 ); 72 73 /// true iff this type or some base of this type after dereferencing pointers is either polymorphic in tyVars, or a generic type with 74 /// at least one polymorphic parameter in tyVars; will look up substitution in env if provided. 75 bool includesPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 ); 76 69 77 /// Returns a pointer to the base FunctionType if ty is the type of a function (or pointer to one), NULL otherwise 70 78 FunctionType *getFunctionType( Type *ty ); … … 73 81 /// N will be stored in levels, if provided 74 82 VariableExpr *getBaseVar( Expression *expr, int *levels = 0 ); 83 84 /// true iff types are structurally identical, where TypeInstType's match any type. 85 bool typesPolyCompatible( Type *aty, Type *bty ); 75 86 76 87 /// Adds the type variable `tyVar` to `tyVarMap` -
src/GenPoly/InstantiateGeneric.cc
rbf4ac09 rf2e40a9f 16 16 #include <cassert> 17 17 #include <list> 18 #include <unordered_map> 18 19 #include <utility> 19 20 #include <vector> 20 #include <unordered_map>21 21 22 22 #include "InstantiateGeneric.h" … … 25 25 #include "GenPoly.h" 26 26 #include "ScopedSet.h" 27 #include "ScrubTyVars.h" 27 28 #include "PolyMutator.h" 28 29 … … 77 78 if ( params.size() != that.params.size() ) return false; 78 79 79 SymTab::Indexer dummy;80 80 for ( std::list< Type* >::const_iterator it = params.begin(), jt = that.params.begin(); it != params.end(); ++it, ++jt ) { 81 if ( ! ResolvExpr::typesCompatible( *it, *jt, dummy) ) return false;81 if ( ! typesPolyCompatible( *it, *jt ) ) return false; 82 82 } 83 83 return true; … … 227 227 if ( (*baseParam)->isComplete() ) { 228 228 // substitute parameter for complete (otype or sized dtype) type 229 int pointerLevels = 0; 230 if ( hasPolyBase( paramType->get_type(), &pointerLevels ) && pointerLevels > 0 ) { 231 // Make a void* with equivalent nesting 232 Type* voidPtr = new VoidType( Type::Qualifiers() ); 233 while ( pointerLevels > 0 ) { 234 // Just about data layout, so qualifiers *shouldn't* matter 235 voidPtr = new PointerType( Type::Qualifiers(), voidPtr ); 236 --pointerLevels; 237 } 238 out.push_back( new TypeExpr( voidPtr ) ); 229 if ( isPolyType( paramType->get_type() ) ) { 230 // substitute polymorphic parameter type in to generic type 231 out.push_back( paramType->clone() ); 232 gt = genericType::dynamic; 239 233 } else { 240 // Just clone parameter type 241 out.push_back( paramType->clone() ); 234 // normalize possibly dtype-static parameter type 235 out.push_back( new TypeExpr{ 236 ScrubTyVars::scrubAll( paramType->get_type()->clone() ) } ); 237 gt |= genericType::concrete; 242 238 } 243 // make the struct concrete or dynamic depending on the parameter244 gt |= isPolyType( paramType->get_type() ) ? genericType::dynamic : genericType::concrete;245 239 } else switch ( (*baseParam)->get_kind() ) { 246 240 case TypeDecl::Dtype: … … 372 366 concDecl = new StructDecl( typeNamer.newName( inst->get_name() ) ); 373 367 concDecl->set_body( inst->get_baseStruct()->has_body() ); 374 substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, 368 substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() ); 375 369 DeclMutator::addDeclaration( concDecl ); 376 370 insert( inst, typeSubs, concDecl ); -
src/GenPoly/ScrubTyVars.cc
rbf4ac09 rf2e40a9f 26 26 namespace GenPoly { 27 27 Type * ScrubTyVars::mutate( TypeInstType *typeInst ) { 28 TyVarMap::const_iterator tyVar = tyVars.find( typeInst->get_name() ); 29 if ( tyVar != tyVars.end() ) { 28 if ( ! tyVars ) { 29 if ( typeInst->get_isFtype() ) { 30 delete typeInst; 31 return new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ); 32 } else { 33 PointerType *ret = new PointerType( Type::Qualifiers(), new VoidType( typeInst->get_qualifiers() ) ); 34 delete typeInst; 35 return ret; 36 } 37 } 38 39 TyVarMap::const_iterator tyVar = tyVars->find( typeInst->get_name() ); 40 if ( tyVar != tyVars->end() ) { 30 41 switch ( tyVar->second.kind ) { 31 42 case TypeDecl::Any: -
src/GenPoly/ScrubTyVars.h
rbf4ac09 rf2e40a9f 26 26 namespace GenPoly { 27 27 class ScrubTyVars : public Mutator { 28 public:29 ScrubTyVars( const TyVarMap &tyVars, bool dynamicOnly = false ): tyVars( tyVars ), dynamicOnly( dynamicOnly ) {}28 /// Whether to scrub all type variables from the provided map, dynamic type variables from the provided map, or all type variables 29 enum ScrubMode { FromMap, DynamicFromMap, All }; 30 30 31 ScrubTyVars() : tyVars(nullptr), mode( All ) {} 32 33 ScrubTyVars( const TyVarMap &tyVars, ScrubMode mode = FromMap ): tyVars( &tyVars ), mode( mode ) {} 34 35 public: 31 36 /// For all polymorphic types with type variables in `tyVars`, replaces generic types, dtypes, and ftypes with the appropriate void type, 32 37 /// and sizeof/alignof expressions with the proper variable … … 38 43 template< typename SynTreeClass > 39 44 static SynTreeClass *scrubDynamic( SynTreeClass *target, const TyVarMap &tyVars ); 45 46 /// For all polymorphic types, replaces generic types, dtypes, and ftypes with the appropriate void type, 47 /// and sizeof/alignof expressions with the proper variable 48 template< typename SynTreeClass > 49 static SynTreeClass *scrubAll( SynTreeClass *target ); 40 50 41 51 virtual Type* mutate( TypeInstType *typeInst ); … … 49 59 /// Returns the type if it should be scrubbed, NULL otherwise. 50 60 Type* shouldScrub( Type *ty ) { 51 return dynamicOnly ? isDynType( ty, tyVars ) : isPolyType( ty, tyVars ); 52 // if ( ! dynamicOnly ) return isPolyType( ty, tyVars ); 53 // 54 // if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) { 55 // return tyVars.find( typeInst->get_name() ) != tyVars.end() ? ty : 0; 56 // } 57 // 58 // return isDynType( ty, tyVars ); 61 switch ( mode ) { 62 case FromMap: return isPolyType( ty, *tyVars ); 63 case DynamicFromMap: return isDynType( ty, *tyVars ); 64 case All: return isPolyType( ty ); 65 } 66 assert(false); return nullptr; // unreachable 67 // return dynamicOnly ? isDynType( ty, tyVars ) : isPolyType( ty, tyVars ); 59 68 } 60 69 … … 62 71 Type* mutateAggregateType( Type *ty ); 63 72 64 const TyVarMap &tyVars; ///< Type variables to scrub65 bool dynamicOnly; ///< only scrub the types with dynamic layout? [false]73 const TyVarMap *tyVars; ///< Type variables to scrub 74 ScrubMode mode; ///< which type variables to scrub? [FromMap] 66 75 }; 67 76 … … 74 83 template< typename SynTreeClass > 75 84 SynTreeClass * ScrubTyVars::scrubDynamic( SynTreeClass *target, const TyVarMap &tyVars ) { 76 ScrubTyVars scrubber( tyVars, true ); 85 ScrubTyVars scrubber( tyVars, ScrubTyVars::DynamicFromMap ); 86 return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) ); 87 } 88 89 template< typename SynTreeClass > 90 SynTreeClass * ScrubTyVars::scrubAll( SynTreeClass *target ) { 91 ScrubTyVars scrubber; 77 92 return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) ); 78 93 } -
src/SymTab/Validate.cc
rbf4ac09 rf2e40a9f 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Mar 7 07:51:36201713 // Update Count : 3 4912 // Last Modified On : Tue Mar 14 23:30:27 2017 13 // Update Count : 350 14 14 // 15 15 … … 323 323 ObjectDecl * obj = dynamic_cast< ObjectDecl * >( *i ); 324 324 assert( obj ); 325 obj->set_type( new EnumInstType( Type::Qualifiers( true, false, false, false, false, false), enumDecl->get_name() ) );325 obj->set_type( new EnumInstType( Type::Qualifiers( Type::Const ), enumDecl->get_name() ) ); 326 326 } // for 327 327 Parent::visit( enumDecl ); -
src/SynTree/Type.h
rbf4ac09 rf2e40a9f 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 15 21:2 3:08201713 // Update Count : 8 412 // Last Modified On : Wed Mar 15 21:28:09 2017 13 // Update Count : 85 14 14 // 15 15 … … 24 24 class Type : public BaseSyntaxNode { 25 25 public: 26 // struct Qualifiers {27 // Qualifiers(): isConst( false ), isVolatile( false ), isRestrict( false ), isLvalue( false ), isAtomic( false ), isMutex( false ) {}28 // Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic, bool isMutex ): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ), isMutex( isMutex ) {}29 30 // Qualifiers &operator&=( const Qualifiers &other );31 // Qualifiers &operator+=( const Qualifiers &other );32 // Qualifiers &operator-=( const Qualifiers &other );33 // Qualifiers operator+( const Type::Qualifiers &other );34 // bool operator==( const Qualifiers &other );35 // bool operator!=( const Qualifiers &other );36 // bool operator<=( const Qualifiers &other );37 // bool operator>=( const Qualifiers &other );38 // bool operator<( const Qualifiers &other );39 // bool operator>( const Qualifiers &other );40 // void print( std::ostream &os, int indent = 0 ) const;41 42 // bool isConst;43 // bool isVolatile;44 // bool isRestrict;45 // bool isLvalue;46 // bool isAtomic;47 // bool isMutex;48 // };49 50 26 static const char * QualifierNames[]; 51 27 … … 100 76 return q; 101 77 } 102 void print( std::ostream & os, int indent = 0 ) const {78 void print( std::ostream & os, int indent = 0 ) const { 103 79 if ( (*this).any() ) { // any type qualifiers ? 104 80 for ( unsigned int i = 0; i < NumTypeQualifier; i += 1 ) { … … 111 87 }; // Qualifiers 112 88 113 Type( const Qualifiers & tq, const std::list< Attribute * > & attributes );114 Type( const Type & other );89 Type( const Qualifiers & tq, const std::list< Attribute * > & attributes ); 90 Type( const Type & other ); 115 91 virtual ~Type(); 116 92 117 Qualifiers & get_qualifiers() { return tq; }93 Qualifiers & get_qualifiers() { return tq; } 118 94 bool get_isConst() { return tq.isConst; } 119 95 bool get_isVolatile() { return tq.isVolatile; } … … 141 117 142 118 virtual Type *clone() const = 0; 143 virtual void accept( Visitor & v ) = 0;144 virtual Type *acceptMutator( Mutator & m ) = 0;145 virtual void print( std::ostream & os, int indent = 0 ) const;119 virtual void accept( Visitor & v ) = 0; 120 virtual Type *acceptMutator( Mutator & m ) = 0; 121 virtual void print( std::ostream & os, int indent = 0 ) const; 146 122 private: 147 123 Qualifiers tq; … … 154 130 class VoidType : public Type { 155 131 public: 156 VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() );132 VoidType( const Type::Qualifiers & tq, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 157 133 158 134 virtual unsigned size() const { return 0; }; … … 160 136 161 137 virtual VoidType *clone() const { return new VoidType( *this ); } 162 virtual void accept( Visitor & v ) { v.visit( this ); }163 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }164 virtual void print( std::ostream & os, int indent = 0 ) const;138 virtual void accept( Visitor & v ) { v.visit( this ); } 139 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 140 virtual void print( std::ostream & os, int indent = 0 ) const; 165 141 }; 166 142 … … 194 170 static const char *typeNames[]; // string names for basic types, MUST MATCH with Kind 195 171 196 BasicType( const Type::Qualifiers & tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() );172 BasicType( const Type::Qualifiers & tq, Kind bt, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 197 173 198 174 Kind get_kind() { return kind; } … … 200 176 201 177 virtual BasicType *clone() const { return new BasicType( *this ); } 202 virtual void accept( Visitor & v ) { v.visit( this ); }203 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }204 virtual void print( std::ostream & os, int indent = 0 ) const;178 virtual void accept( Visitor & v ) { v.visit( this ); } 179 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 180 virtual void print( std::ostream & os, int indent = 0 ) const; 205 181 206 182 bool isInteger() const; … … 211 187 class PointerType : public Type { 212 188 public: 213 PointerType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );214 PointerType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );189 PointerType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 190 PointerType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 215 191 PointerType( const PointerType& ); 216 192 virtual ~PointerType(); … … 226 202 227 203 virtual PointerType *clone() const { return new PointerType( *this ); } 228 virtual void accept( Visitor & v ) { v.visit( this ); }229 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }230 virtual void print( std::ostream & os, int indent = 0 ) const;204 virtual void accept( Visitor & v ) { v.visit( this ); } 205 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 206 virtual void print( std::ostream & os, int indent = 0 ) const; 231 207 private: 232 208 Type *base; … … 240 216 class ArrayType : public Type { 241 217 public: 242 ArrayType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );218 ArrayType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 243 219 ArrayType( const ArrayType& ); 244 220 virtual ~ArrayType(); … … 256 232 257 233 virtual ArrayType *clone() const { return new ArrayType( *this ); } 258 virtual void accept( Visitor & v ) { v.visit( this ); }259 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }260 virtual void print( std::ostream & os, int indent = 0 ) const;234 virtual void accept( Visitor & v ) { v.visit( this ); } 235 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 236 virtual void print( std::ostream & os, int indent = 0 ) const; 261 237 private: 262 238 Type *base; … … 268 244 class FunctionType : public Type { 269 245 public: 270 FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );246 FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 271 247 FunctionType( const FunctionType& ); 272 248 virtual ~FunctionType(); … … 279 255 280 256 virtual FunctionType *clone() const { return new FunctionType( *this ); } 281 virtual void accept( Visitor & v ) { v.visit( this ); }282 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }283 virtual void print( std::ostream & os, int indent = 0 ) const;257 virtual void accept( Visitor & v ) { v.visit( this ); } 258 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 259 virtual void print( std::ostream & os, int indent = 0 ) const; 284 260 private: 285 261 std::list<DeclarationWithType*> returnVals; … … 295 271 class ReferenceToType : public Type { 296 272 public: 297 ReferenceToType( const Type::Qualifiers & tq, const std::string &name, const std::list< Attribute * > & attributes );298 ReferenceToType( const ReferenceToType & other );273 ReferenceToType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes ); 274 ReferenceToType( const ReferenceToType & other ); 299 275 virtual ~ReferenceToType(); 300 276 301 const std::string & get_name() const { return name; }277 const std::string & get_name() const { return name; } 302 278 void set_name( std::string newValue ) { name = newValue; } 303 279 std::list< Expression* >& get_parameters() { return parameters; } … … 306 282 307 283 virtual ReferenceToType *clone() const = 0; 308 virtual void accept( Visitor & v ) = 0;309 virtual Type *acceptMutator( Mutator & m ) = 0;310 virtual void print( std::ostream & os, int indent = 0 ) const;284 virtual void accept( Visitor & v ) = 0; 285 virtual Type *acceptMutator( Mutator & m ) = 0; 286 virtual void print( std::ostream & os, int indent = 0 ) const; 311 287 protected: 312 288 virtual std::string typeString() const = 0; … … 320 296 typedef ReferenceToType Parent; 321 297 public: 322 StructInstType( const Type::Qualifiers & tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseStruct( 0 ) {}323 StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >() );324 StructInstType( const StructInstType & other ) : Parent( other ), baseStruct( other.baseStruct ) {}298 StructInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseStruct( 0 ) {} 299 StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 300 StructInstType( const StructInstType & other ) : Parent( other ), baseStruct( other.baseStruct ) {} 325 301 326 302 StructDecl *get_baseStruct() const { return baseStruct; } … … 334 310 /// Looks up the members of this struct named "name" and places them into "foundDecls". 335 311 /// Clones declarations into "foundDecls", caller responsible for freeing 336 void lookup( const std::string & name, std::list< Declaration* > &foundDecls ) const;312 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const; 337 313 338 314 virtual StructInstType *clone() const { return new StructInstType( *this ); } 339 virtual void accept( Visitor & v ) { v.visit( this ); }340 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }341 342 virtual void print( std::ostream & os, int indent = 0 ) const;315 virtual void accept( Visitor & v ) { v.visit( this ); } 316 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 317 318 virtual void print( std::ostream & os, int indent = 0 ) const; 343 319 private: 344 320 virtual std::string typeString() const; … … 352 328 typedef ReferenceToType Parent; 353 329 public: 354 UnionInstType( const Type::Qualifiers & tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseUnion( 0 ) {}355 UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >() );356 UnionInstType( const UnionInstType & other ) : Parent( other ), baseUnion( other.baseUnion ) {}330 UnionInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseUnion( 0 ) {} 331 UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 332 UnionInstType( const UnionInstType & other ) : Parent( other ), baseUnion( other.baseUnion ) {} 357 333 358 334 UnionDecl *get_baseUnion() const { return baseUnion; } … … 366 342 /// looks up the members of this union named "name" and places them into "foundDecls" 367 343 /// Clones declarations into "foundDecls", caller responsible for freeing 368 void lookup( const std::string & name, std::list< Declaration* > &foundDecls ) const;344 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const; 369 345 370 346 virtual UnionInstType *clone() const { return new UnionInstType( *this ); } 371 virtual void accept( Visitor & v ) { v.visit( this ); }372 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }373 374 virtual void print( std::ostream & os, int indent = 0 ) const;347 virtual void accept( Visitor & v ) { v.visit( this ); } 348 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 349 350 virtual void print( std::ostream & os, int indent = 0 ) const; 375 351 private: 376 352 virtual std::string typeString() const; … … 384 360 typedef ReferenceToType Parent; 385 361 public: 386 EnumInstType( const Type::Qualifiers & tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}387 EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >() );388 EnumInstType( const EnumInstType & other ) : Parent( other ), baseEnum( other.baseEnum ) {}362 EnumInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {} 363 EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 364 EnumInstType( const EnumInstType & other ) : Parent( other ), baseEnum( other.baseEnum ) {} 389 365 390 366 EnumDecl *get_baseEnum() const { return baseEnum; } … … 394 370 395 371 virtual EnumInstType *clone() const { return new EnumInstType( *this ); } 396 virtual void accept( Visitor & v ) { v.visit( this ); }397 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }372 virtual void accept( Visitor & v ) { v.visit( this ); } 373 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 398 374 private: 399 375 virtual std::string typeString() const; … … 407 383 typedef ReferenceToType Parent; 408 384 public: 409 TraitInstType( const Type::Qualifiers & tq, const std::string &name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}410 TraitInstType( const TraitInstType & other );385 TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {} 386 TraitInstType( const TraitInstType & other ); 411 387 ~TraitInstType(); 412 388 … … 416 392 417 393 virtual TraitInstType *clone() const { return new TraitInstType( *this ); } 418 virtual void accept( Visitor & v ) { v.visit( this ); }419 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }394 virtual void accept( Visitor & v ) { v.visit( this ); } 395 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 420 396 private: 421 397 virtual std::string typeString() const; … … 429 405 typedef ReferenceToType Parent; 430 406 public: 431 TypeInstType( const Type::Qualifiers & tq, const std::string &name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >() );432 TypeInstType( const Type::Qualifiers & tq, const std::string &name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >() );433 TypeInstType( const TypeInstType & other );407 TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 408 TypeInstType( const Type::Qualifiers & tq, const std::string & name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 409 TypeInstType( const TypeInstType & other ); 434 410 ~TypeInstType(); 435 411 … … 442 418 443 419 virtual TypeInstType *clone() const { return new TypeInstType( *this ); } 444 virtual void accept( Visitor & v ) { v.visit( this ); }445 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }446 virtual void print( std::ostream & os, int indent = 0 ) const;420 virtual void accept( Visitor & v ) { v.visit( this ); } 421 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 422 virtual void print( std::ostream & os, int indent = 0 ) const; 447 423 private: 448 424 virtual std::string typeString() const; … … 455 431 class TupleType : public Type { 456 432 public: 457 TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types = std::list< Type * >(), const std::list< Attribute * > & attributes = std::list< Attribute * >() );433 TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types = std::list< Type * >(), const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 458 434 TupleType( const TupleType& ); 459 435 virtual ~TupleType(); … … 476 452 477 453 virtual TupleType *clone() const { return new TupleType( *this ); } 478 virtual void accept( Visitor & v ) { v.visit( this ); }479 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }480 virtual void print( std::ostream & os, int indent = 0 ) const;454 virtual void accept( Visitor & v ) { v.visit( this ); } 455 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 456 virtual void print( std::ostream & os, int indent = 0 ) const; 481 457 private: 482 458 std::list<Type*> types; … … 485 461 class TypeofType : public Type { 486 462 public: 487 TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );463 TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 488 464 TypeofType( const TypeofType& ); 489 465 virtual ~TypeofType(); … … 495 471 496 472 virtual TypeofType *clone() const { return new TypeofType( *this ); } 497 virtual void accept( Visitor & v ) { v.visit( this ); }498 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }499 virtual void print( std::ostream & os, int indent = 0 ) const;473 virtual void accept( Visitor & v ) { v.visit( this ); } 474 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 475 virtual void print( std::ostream & os, int indent = 0 ) const; 500 476 private: 501 477 Expression *expr; … … 504 480 class AttrType : public Type { 505 481 public: 506 AttrType( const Type::Qualifiers & tq, const std::string &name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );507 AttrType( const Type::Qualifiers & tq, const std::string &name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >() );482 AttrType( const Type::Qualifiers & tq, const std::string & name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 483 AttrType( const Type::Qualifiers & tq, const std::string & name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 508 484 AttrType( const AttrType& ); 509 485 virtual ~AttrType(); 510 486 511 const std::string & get_name() const { return name; }512 void set_name( const std::string & newValue ) { name = newValue; }487 const std::string & get_name() const { return name; } 488 void set_name( const std::string & newValue ) { name = newValue; } 513 489 Expression *get_expr() const { return expr; } 514 490 void set_expr( Expression *newValue ) { expr = newValue; } … … 521 497 522 498 virtual AttrType *clone() const { return new AttrType( *this ); } 523 virtual void accept( Visitor & v ) { v.visit( this ); }524 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }525 virtual void print( std::ostream & os, int indent = 0 ) const;499 virtual void accept( Visitor & v ) { v.visit( this ); } 500 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 501 virtual void print( std::ostream & os, int indent = 0 ) const; 526 502 private: 527 503 std::string name; … … 540 516 541 517 virtual VarArgsType *clone() const { return new VarArgsType( *this ); } 542 virtual void accept( Visitor & v ) { v.visit( this ); }543 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }544 virtual void print( std::ostream & os, int indent = 0 ) const;518 virtual void accept( Visitor & v ) { v.visit( this ); } 519 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 520 virtual void print( std::ostream & os, int indent = 0 ) const; 545 521 }; 546 522 … … 552 528 553 529 virtual ZeroType *clone() const { return new ZeroType( *this ); } 554 virtual void accept( Visitor & v ) { v.visit( this ); }555 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }556 virtual void print( std::ostream & os, int indent = 0 ) const;530 virtual void accept( Visitor & v ) { v.visit( this ); } 531 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 532 virtual void print( std::ostream & os, int indent = 0 ) const; 557 533 }; 558 534 … … 564 540 565 541 virtual OneType *clone() const { return new OneType( *this ); } 566 virtual void accept( Visitor & v ) { v.visit( this ); }567 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }568 virtual void print( std::ostream & os, int indent = 0 ) const;542 virtual void accept( Visitor & v ) { v.visit( this ); } 543 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 544 virtual void print( std::ostream & os, int indent = 0 ) const; 569 545 }; 570 546 -
src/benchmark/CorCtxSwitch.c
rbf4ac09 rf2e40a9f 1 1 #include <fstream> 2 2 #include <stdlib> 3 #include <thread s>3 #include <thread> 4 4 5 5 #include <unistd.h> // sysconf … … 24 24 25 25 struct GreatSuspender { 26 coroutine c;26 coroutine_desc c; 27 27 }; 28 28 -
src/benchmark/ThrdCtxSwitch.c
rbf4ac09 rf2e40a9f 1 1 #include <fstream> 2 2 #include <stdlib> 3 #include <thread s>3 #include <thread> 4 4 5 5 #include <unistd.h> // sysconf -
src/benchmark/bench.c
rbf4ac09 rf2e40a9f 2 2 #include <fstream> 3 3 #include <stdlib> 4 #include <thread s>4 #include <thread> 5 5 6 6 #include <unistd.h> // sysconf … … 86 86 //======================================= 87 87 88 struct CoroutineDummy { coroutine c; };88 struct CoroutineDummy { coroutine_desc c; }; 89 89 DECL_COROUTINE(CoroutineDummy); 90 90 void main(CoroutineDummy * this) {} … … 119 119 struct CoroutineResume { 120 120 int N; 121 coroutine c;121 coroutine_desc c; 122 122 }; 123 123 … … 150 150 //======================================= 151 151 152 struct ThreadDummy { thread t; };152 struct ThreadDummy { thread_desc t; }; 153 153 DECL_THREAD(ThreadDummy); 154 154 void main(ThreadDummy * this) {} … … 180 180 int N; 181 181 long long result; 182 thread t;182 thread_desc t; 183 183 }; 184 184 -
src/benchmark/csv-data.c
rbf4ac09 rf2e40a9f 1 1 #include <fstream> 2 2 #include <stdlib> 3 #include <thread s>3 #include <thread> 4 4 5 5 extern "C" { … … 26 26 27 27 struct GreatSuspender { 28 coroutine c;28 coroutine_desc c; 29 29 }; 30 30 -
src/examples/multicore.c
rbf4ac09 rf2e40a9f 1 1 #include <kernel> 2 #include <thread s>2 #include <thread> 3 3 4 struct MyThread { thread t; };4 struct MyThread { thread_desc t; }; 5 5 6 6 DECL_THREAD(MyThread); -
src/libcfa/Makefile.am
rbf4ac09 rf2e40a9f 45 45 # not all platforms support concurrency, add option do disable it 46 46 if BUILD_CONCURRENCY 47 headers += containers/vector concurrency/coroutine s concurrency/threadsconcurrency/kernel concurrency/monitor47 headers += containers/vector concurrency/coroutine concurrency/thread concurrency/kernel concurrency/monitor 48 48 endif 49 49 -
src/libcfa/Makefile.in
rbf4ac09 rf2e40a9f 43 43 44 44 # not all platforms support concurrency, add option do disable it 45 @BUILD_CONCURRENCY_TRUE@am__append_3 = containers/vector concurrency/coroutine s concurrency/threadsconcurrency/kernel concurrency/monitor45 @BUILD_CONCURRENCY_TRUE@am__append_3 = containers/vector concurrency/coroutine concurrency/thread concurrency/kernel concurrency/monitor 46 46 47 47 # not all platforms support concurrency, add option do disable it … … 99 99 am__libcfa_d_a_SOURCES_DIST = libcfa-prelude.c limits.c stdlib.c \ 100 100 math.c iostream.c fstream.c iterator.c rational.c assert.c \ 101 containers/vector.c concurrency/coroutine s.c \102 concurrency/thread s.c concurrency/kernel.c \101 containers/vector.c concurrency/coroutine.c \ 102 concurrency/thread.c concurrency/kernel.c \ 103 103 concurrency/monitor.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \ 104 104 concurrency/invoke.c 105 105 am__dirstamp = $(am__leading_dot)dirstamp 106 106 @BUILD_CONCURRENCY_TRUE@am__objects_1 = containers/libcfa_d_a-vector.$(OBJEXT) \ 107 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-coroutine s.$(OBJEXT) \108 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-thread s.$(OBJEXT) \107 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-coroutine.$(OBJEXT) \ 108 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-thread.$(OBJEXT) \ 109 109 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-kernel.$(OBJEXT) \ 110 110 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-monitor.$(OBJEXT) … … 124 124 am__libcfa_a_SOURCES_DIST = libcfa-prelude.c limits.c stdlib.c math.c \ 125 125 iostream.c fstream.c iterator.c rational.c assert.c \ 126 containers/vector.c concurrency/coroutine s.c \127 concurrency/thread s.c concurrency/kernel.c \126 containers/vector.c concurrency/coroutine.c \ 127 concurrency/thread.c concurrency/kernel.c \ 128 128 concurrency/monitor.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \ 129 129 concurrency/invoke.c 130 130 @BUILD_CONCURRENCY_TRUE@am__objects_5 = \ 131 131 @BUILD_CONCURRENCY_TRUE@ containers/libcfa_a-vector.$(OBJEXT) \ 132 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-coroutine s.$(OBJEXT) \133 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-thread s.$(OBJEXT) \132 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-coroutine.$(OBJEXT) \ 133 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-thread.$(OBJEXT) \ 134 134 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-kernel.$(OBJEXT) \ 135 135 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-monitor.$(OBJEXT) … … 175 175 am__nobase_cfa_include_HEADERS_DIST = limits stdlib math iostream \ 176 176 fstream iterator rational assert containers/vector \ 177 concurrency/coroutine s concurrency/threadsconcurrency/kernel \177 concurrency/coroutine concurrency/thread concurrency/kernel \ 178 178 concurrency/monitor ${shell echo stdhdr/*} \ 179 179 concurrency/invoke.h … … 397 397 @$(MKDIR_P) concurrency/$(DEPDIR) 398 398 @: > concurrency/$(DEPDIR)/$(am__dirstamp) 399 concurrency/libcfa_d_a-coroutine s.$(OBJEXT): \399 concurrency/libcfa_d_a-coroutine.$(OBJEXT): \ 400 400 concurrency/$(am__dirstamp) \ 401 401 concurrency/$(DEPDIR)/$(am__dirstamp) 402 concurrency/libcfa_d_a-thread s.$(OBJEXT): concurrency/$(am__dirstamp) \402 concurrency/libcfa_d_a-thread.$(OBJEXT): concurrency/$(am__dirstamp) \ 403 403 concurrency/$(DEPDIR)/$(am__dirstamp) 404 404 concurrency/libcfa_d_a-kernel.$(OBJEXT): concurrency/$(am__dirstamp) \ … … 417 417 containers/libcfa_a-vector.$(OBJEXT): containers/$(am__dirstamp) \ 418 418 containers/$(DEPDIR)/$(am__dirstamp) 419 concurrency/libcfa_a-coroutines.$(OBJEXT): \ 420 concurrency/$(am__dirstamp) \ 419 concurrency/libcfa_a-coroutine.$(OBJEXT): concurrency/$(am__dirstamp) \ 421 420 concurrency/$(DEPDIR)/$(am__dirstamp) 422 concurrency/libcfa_a-thread s.$(OBJEXT): concurrency/$(am__dirstamp) \421 concurrency/libcfa_a-thread.$(OBJEXT): concurrency/$(am__dirstamp) \ 423 422 concurrency/$(DEPDIR)/$(am__dirstamp) 424 423 concurrency/libcfa_a-kernel.$(OBJEXT): concurrency/$(am__dirstamp) \ … … 436 435 -rm -f *.$(OBJEXT) 437 436 -rm -f concurrency/CtxSwitch-@MACHINE_TYPE@.$(OBJEXT) 438 -rm -f concurrency/libcfa_a-coroutine s.$(OBJEXT)437 -rm -f concurrency/libcfa_a-coroutine.$(OBJEXT) 439 438 -rm -f concurrency/libcfa_a-invoke.$(OBJEXT) 440 439 -rm -f concurrency/libcfa_a-kernel.$(OBJEXT) 441 440 -rm -f concurrency/libcfa_a-monitor.$(OBJEXT) 442 -rm -f concurrency/libcfa_a-thread s.$(OBJEXT)443 -rm -f concurrency/libcfa_d_a-coroutine s.$(OBJEXT)441 -rm -f concurrency/libcfa_a-thread.$(OBJEXT) 442 -rm -f concurrency/libcfa_d_a-coroutine.$(OBJEXT) 444 443 -rm -f concurrency/libcfa_d_a-invoke.$(OBJEXT) 445 444 -rm -f concurrency/libcfa_d_a-kernel.$(OBJEXT) 446 445 -rm -f concurrency/libcfa_d_a-monitor.$(OBJEXT) 447 -rm -f concurrency/libcfa_d_a-thread s.$(OBJEXT)446 -rm -f concurrency/libcfa_d_a-thread.$(OBJEXT) 448 447 -rm -f containers/libcfa_a-vector.$(OBJEXT) 449 448 -rm -f containers/libcfa_d_a-vector.$(OBJEXT) … … 471 470 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-stdlib.Po@am__quote@ 472 471 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@MACHINE_TYPE@.Po@am__quote@ 473 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-coroutine s.Po@am__quote@472 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-coroutine.Po@am__quote@ 474 473 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-invoke.Po@am__quote@ 475 474 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-kernel.Po@am__quote@ 476 475 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-monitor.Po@am__quote@ 477 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-thread s.Po@am__quote@478 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-coroutine s.Po@am__quote@476 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-thread.Po@am__quote@ 477 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po@am__quote@ 479 478 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-invoke.Po@am__quote@ 480 479 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po@am__quote@ 481 480 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po@am__quote@ 482 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-thread s.Po@am__quote@481 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-thread.Po@am__quote@ 483 482 @AMDEP_TRUE@@am__include@ @am__quote@containers/$(DEPDIR)/libcfa_a-vector.Po@am__quote@ 484 483 @AMDEP_TRUE@@am__include@ @am__quote@containers/$(DEPDIR)/libcfa_d_a-vector.Po@am__quote@ … … 649 648 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi` 650 649 651 concurrency/libcfa_d_a-coroutine s.o: concurrency/coroutines.c652 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine s.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutines.Tpo -c -o concurrency/libcfa_d_a-coroutines.o `test -f 'concurrency/coroutines.c' || echo '$(srcdir)/'`concurrency/coroutines.c653 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine s.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutines.Po654 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine s.c' object='concurrency/libcfa_d_a-coroutines.o' libtool=no @AMDEPBACKSLASH@655 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 656 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine s.o `test -f 'concurrency/coroutines.c' || echo '$(srcdir)/'`concurrency/coroutines.c657 658 concurrency/libcfa_d_a-coroutine s.obj: concurrency/coroutines.c659 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine s.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutines.Tpo -c -o concurrency/libcfa_d_a-coroutines.obj `if test -f 'concurrency/coroutines.c'; then $(CYGPATH_W) 'concurrency/coroutines.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutines.c'; fi`660 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine s.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutines.Po661 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine s.c' object='concurrency/libcfa_d_a-coroutines.obj' libtool=no @AMDEPBACKSLASH@662 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 663 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine s.obj `if test -f 'concurrency/coroutines.c'; then $(CYGPATH_W) 'concurrency/coroutines.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutines.c'; fi`664 665 concurrency/libcfa_d_a-thread s.o: concurrency/threads.c666 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread s.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-threads.Tpo -c -o concurrency/libcfa_d_a-threads.o `test -f 'concurrency/threads.c' || echo '$(srcdir)/'`concurrency/threads.c667 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread s.Tpo concurrency/$(DEPDIR)/libcfa_d_a-threads.Po668 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread s.c' object='concurrency/libcfa_d_a-threads.o' libtool=no @AMDEPBACKSLASH@669 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 670 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread s.o `test -f 'concurrency/threads.c' || echo '$(srcdir)/'`concurrency/threads.c671 672 concurrency/libcfa_d_a-thread s.obj: concurrency/threads.c673 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread s.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-threads.Tpo -c -o concurrency/libcfa_d_a-threads.obj `if test -f 'concurrency/threads.c'; then $(CYGPATH_W) 'concurrency/threads.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/threads.c'; fi`674 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread s.Tpo concurrency/$(DEPDIR)/libcfa_d_a-threads.Po675 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread s.c' object='concurrency/libcfa_d_a-threads.obj' libtool=no @AMDEPBACKSLASH@676 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 677 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread s.obj `if test -f 'concurrency/threads.c'; then $(CYGPATH_W) 'concurrency/threads.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/threads.c'; fi`650 concurrency/libcfa_d_a-coroutine.o: concurrency/coroutine.c 651 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo -c -o concurrency/libcfa_d_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c 652 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po 653 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_d_a-coroutine.o' libtool=no @AMDEPBACKSLASH@ 654 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 655 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c 656 657 concurrency/libcfa_d_a-coroutine.obj: concurrency/coroutine.c 658 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo -c -o concurrency/libcfa_d_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi` 659 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po 660 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_d_a-coroutine.obj' libtool=no @AMDEPBACKSLASH@ 661 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 662 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi` 663 664 concurrency/libcfa_d_a-thread.o: concurrency/thread.c 665 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo -c -o concurrency/libcfa_d_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c 666 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_d_a-thread.Po 667 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_d_a-thread.o' libtool=no @AMDEPBACKSLASH@ 668 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 669 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c 670 671 concurrency/libcfa_d_a-thread.obj: concurrency/thread.c 672 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo -c -o concurrency/libcfa_d_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi` 673 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_d_a-thread.Po 674 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_d_a-thread.obj' libtool=no @AMDEPBACKSLASH@ 675 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 676 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi` 678 677 679 678 concurrency/libcfa_d_a-kernel.o: concurrency/kernel.c … … 845 844 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi` 846 845 847 concurrency/libcfa_a-coroutine s.o: concurrency/coroutines.c848 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine s.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutines.Tpo -c -o concurrency/libcfa_a-coroutines.o `test -f 'concurrency/coroutines.c' || echo '$(srcdir)/'`concurrency/coroutines.c849 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine s.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutines.Po850 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine s.c' object='concurrency/libcfa_a-coroutines.o' libtool=no @AMDEPBACKSLASH@851 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 852 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine s.o `test -f 'concurrency/coroutines.c' || echo '$(srcdir)/'`concurrency/coroutines.c853 854 concurrency/libcfa_a-coroutine s.obj: concurrency/coroutines.c855 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine s.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutines.Tpo -c -o concurrency/libcfa_a-coroutines.obj `if test -f 'concurrency/coroutines.c'; then $(CYGPATH_W) 'concurrency/coroutines.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutines.c'; fi`856 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine s.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutines.Po857 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine s.c' object='concurrency/libcfa_a-coroutines.obj' libtool=no @AMDEPBACKSLASH@858 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 859 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine s.obj `if test -f 'concurrency/coroutines.c'; then $(CYGPATH_W) 'concurrency/coroutines.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutines.c'; fi`860 861 concurrency/libcfa_a-thread s.o: concurrency/threads.c862 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread s.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-threads.Tpo -c -o concurrency/libcfa_a-threads.o `test -f 'concurrency/threads.c' || echo '$(srcdir)/'`concurrency/threads.c863 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread s.Tpo concurrency/$(DEPDIR)/libcfa_a-threads.Po864 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread s.c' object='concurrency/libcfa_a-threads.o' libtool=no @AMDEPBACKSLASH@865 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 866 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread s.o `test -f 'concurrency/threads.c' || echo '$(srcdir)/'`concurrency/threads.c867 868 concurrency/libcfa_a-thread s.obj: concurrency/threads.c869 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread s.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-threads.Tpo -c -o concurrency/libcfa_a-threads.obj `if test -f 'concurrency/threads.c'; then $(CYGPATH_W) 'concurrency/threads.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/threads.c'; fi`870 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread s.Tpo concurrency/$(DEPDIR)/libcfa_a-threads.Po871 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread s.c' object='concurrency/libcfa_a-threads.obj' libtool=no @AMDEPBACKSLASH@872 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 873 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread s.obj `if test -f 'concurrency/threads.c'; then $(CYGPATH_W) 'concurrency/threads.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/threads.c'; fi`846 concurrency/libcfa_a-coroutine.o: concurrency/coroutine.c 847 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo -c -o concurrency/libcfa_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c 848 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutine.Po 849 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_a-coroutine.o' libtool=no @AMDEPBACKSLASH@ 850 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 851 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c 852 853 concurrency/libcfa_a-coroutine.obj: concurrency/coroutine.c 854 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo -c -o concurrency/libcfa_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi` 855 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutine.Po 856 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_a-coroutine.obj' libtool=no @AMDEPBACKSLASH@ 857 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 858 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi` 859 860 concurrency/libcfa_a-thread.o: concurrency/thread.c 861 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-thread.Tpo -c -o concurrency/libcfa_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c 862 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_a-thread.Po 863 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_a-thread.o' libtool=no @AMDEPBACKSLASH@ 864 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 865 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c 866 867 concurrency/libcfa_a-thread.obj: concurrency/thread.c 868 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-thread.Tpo -c -o concurrency/libcfa_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi` 869 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_a-thread.Po 870 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_a-thread.obj' libtool=no @AMDEPBACKSLASH@ 871 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 872 @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi` 874 873 875 874 concurrency/libcfa_a-kernel.o: concurrency/kernel.c -
src/libcfa/concurrency/coroutine
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // coroutine s--8 // coroutine -- 9 9 // 10 10 // Author : Thierry Delisle … … 27 27 trait is_coroutine(dtype T) { 28 28 void main(T * this); 29 coroutine * get_coroutine(T * this);29 coroutine_desc * get_coroutine(T * this); 30 30 }; 31 31 32 #define DECL_COROUTINE(X) static inline coroutine * get_coroutine(X* this) { return &this->c; } void main(X* this)32 #define DECL_COROUTINE(X) static inline coroutine_desc* get_coroutine(X* this) { return &this->c; } void main(X* this) 33 33 34 34 //----------------------------------------------------------------------------- 35 35 // Ctors and dtors 36 36 void ?{}(coStack_t * this); 37 void ?{}(coroutine * this);38 void ?{}(coroutine * this, const char * name);37 void ?{}(coroutine_desc * this); 38 void ?{}(coroutine_desc * this, const char * name); 39 39 void ^?{}(coStack_t * this); 40 void ^?{}(coroutine * this);40 void ^?{}(coroutine_desc * this); 41 41 42 42 //----------------------------------------------------------------------------- … … 63 63 64 64 // Get current coroutine 65 coroutine * this_coroutine(void);65 coroutine_desc * this_coroutine(void); 66 66 67 67 // Private wrappers for context switch and stack creation 68 extern void CoroutineCtxSwitch(coroutine * src, coroutine* dst);68 extern void CoroutineCtxSwitch(coroutine_desc * src, coroutine_desc * dst); 69 69 extern void create_stack( coStack_t * this, unsigned int storageSize ); 70 70 71 71 // Suspend implementation inlined for performance 72 72 static inline void suspend() { 73 coroutine * src = this_coroutine(); // optimization73 coroutine_desc * src = this_coroutine(); // optimization 74 74 75 75 assertf( src->last != 0, … … 88 88 forall(dtype T | is_coroutine(T)) 89 89 static inline void resume(T * cor) { 90 coroutine * src = this_coroutine(); // optimization91 coroutine * dst = get_coroutine(cor);90 coroutine_desc * src = this_coroutine(); // optimization 91 coroutine_desc * dst = get_coroutine(cor); 92 92 93 93 if( unlikely(!dst->stack.base) ) { … … 111 111 } 112 112 113 static inline void resume(coroutine * dst) {114 coroutine * src = this_coroutine(); // optimization113 static inline void resume(coroutine_desc * dst) { 114 coroutine_desc * src = this_coroutine(); // optimization 115 115 116 116 // not resuming self ? -
src/libcfa/concurrency/coroutine.c
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // coroutine s.c --8 // coroutine.c -- 9 9 // 10 10 // Author : Thierry Delisle … … 15 15 // 16 16 17 #include "coroutine s"17 #include "coroutine" 18 18 19 19 extern "C" { … … 32 32 #include "invoke.h" 33 33 34 extern processor * get_this_processor();34 extern thread_local processor * this_processor; 35 35 36 36 //----------------------------------------------------------------------------- … … 60 60 } 61 61 62 void ?{}(coroutine * this) {62 void ?{}(coroutine_desc* this) { 63 63 this{ "Anonymous Coroutine" }; 64 64 } 65 65 66 void ?{}(coroutine * this, const char * name) {66 void ?{}(coroutine_desc* this, const char * name) { 67 67 this->name = name; 68 68 this->errno_ = 0; … … 72 72 } 73 73 74 void ?{}(coroutine * this, size_t size) {74 void ?{}(coroutine_desc* this, size_t size) { 75 75 this{}; 76 76 (&this->stack){size}; … … 88 88 } 89 89 90 void ^?{}(coroutine * this) {}90 void ^?{}(coroutine_desc* this) {} 91 91 92 92 // Part of the Public API … … 94 94 forall(dtype T | is_coroutine(T)) 95 95 void prime(T* cor) { 96 coroutine * this = get_coroutine(cor);96 coroutine_desc* this = get_coroutine(cor); 97 97 assert(this->state == Start); 98 98 … … 102 102 103 103 // Wrapper for co 104 void CoroutineCtxSwitch(coroutine * src, coroutine* dst) {104 void CoroutineCtxSwitch(coroutine_desc* src, coroutine_desc* dst) { 105 105 // THREAD_GETMEM( This )->disableInterrupts(); 106 106 … … 109 109 110 110 // set new coroutine that task is executing 111 get_this_processor()->current_coroutine = dst;111 this_processor->current_coroutine = dst; 112 112 113 113 // context switch to specified coroutine -
src/libcfa/concurrency/invoke.c
rbf4ac09 rf2e40a9f 29 29 30 30 extern void __suspend_internal(void); 31 extern void __thread_signal_termination(struct thread *);31 extern void __thread_signal_termination(struct thread_desc*); 32 32 33 33 void CtxInvokeCoroutine( 34 34 void (*main)(void *), 35 struct coroutine *(*get_coroutine)(void *),35 struct coroutine_desc *(*get_coroutine)(void *), 36 36 void *this 37 37 ) { 38 38 // LIB_DEBUG_PRINTF("Invoke Coroutine : Received %p (main %p, get_c %p)\n", this, main, get_coroutine); 39 39 40 struct coroutine * cor = get_coroutine( this );40 struct coroutine_desc* cor = get_coroutine( this ); 41 41 42 42 if(cor->state == Primed) { … … 57 57 void CtxInvokeThread( 58 58 void (*main)(void *), 59 struct thread *(*get_thread)(void *),59 struct thread_desc *(*get_thread)(void *), 60 60 void *this 61 61 ) { 62 62 __suspend_internal(); 63 63 64 struct thread * thrd = get_thread( this );65 struct coroutine * cor = &thrd->c;64 struct thread_desc* thrd = get_thread( this ); 65 struct coroutine_desc* cor = &thrd->c; 66 66 cor->state = Active; 67 67 … … 79 79 void CtxStart( 80 80 void (*main)(void *), 81 struct coroutine *(*get_coroutine)(void *),81 struct coroutine_desc *(*get_coroutine)(void *), 82 82 void *this, 83 83 void (*invoke)(void *) -
src/libcfa/concurrency/invoke.h
rbf4ac09 rf2e40a9f 35 35 36 36 struct simple_thread_list { 37 struct thread * head;38 struct thread ** tail;37 struct thread_desc * head; 38 struct thread_desc ** tail; 39 39 }; 40 40 … … 48 48 extern "Cforall" { 49 49 void ?{}( struct simple_thread_list * ); 50 void append( struct simple_thread_list *, struct thread * );51 struct thread * pop_head( struct simple_thread_list * );50 void append( struct simple_thread_list *, struct thread_desc * ); 51 struct thread_desc * pop_head( struct simple_thread_list * ); 52 52 53 53 void ?{}(spinlock * this); … … 71 71 enum coroutine_state { Halted, Start, Inactive, Active, Primed }; 72 72 73 struct coroutine {73 struct coroutine_desc { 74 74 struct coStack_t stack; 75 75 const char *name; // textual name for coroutine/task, initialized by uC++ generated code 76 76 int errno_; // copy of global UNIX variable errno 77 77 enum coroutine_state state; // current execution status for coroutine 78 struct coroutine *starter; // first coroutine to resume this one79 struct coroutine *last; // last coroutine to resume this one78 struct coroutine_desc *starter; // first coroutine to resume this one 79 struct coroutine_desc *last; // last coroutine to resume this one 80 80 }; 81 81 82 struct thread {83 struct coroutine c; // coroutine body used to store context82 struct thread_desc { 83 struct coroutine_desc c; // coroutine body used to store context 84 84 struct signal_once terminated; // indicate if execuation state is not halted 85 struct thread * next; // instrusive link field for threads85 struct thread_desc * next; // instrusive link field for threads 86 86 }; 87 87 -
src/libcfa/concurrency/kernel
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // threads--8 // kernel -- 9 9 // 10 10 // Author : Thierry Delisle … … 49 49 struct FinishAction { 50 50 FinishOpCode action_code; 51 thread * thrd;51 thread_desc * thrd; 52 52 spinlock * lock; 53 53 }; … … 62 62 struct processorCtx_t * runner; 63 63 cluster * cltr; 64 coroutine * current_coroutine;65 thread * current_thread;64 coroutine_desc * current_coroutine; 65 thread_desc * current_thread; 66 66 pthread_t kernel_thread; 67 67 -
src/libcfa/concurrency/kernel.c
rbf4ac09 rf2e40a9f 43 43 KERNEL_STORAGE(cluster, systemCluster); 44 44 KERNEL_STORAGE(processor, systemProcessor); 45 KERNEL_STORAGE(thread , mainThread);45 KERNEL_STORAGE(thread_desc, mainThread); 46 46 KERNEL_STORAGE(machine_context_t, mainThread_context); 47 47 48 48 cluster * systemCluster; 49 49 processor * systemProcessor; 50 thread * mainThread;50 thread_desc * mainThread; 51 51 52 52 //----------------------------------------------------------------------------- … … 55 55 thread_local processor * this_processor; 56 56 57 processor * get_this_processor() { 58 return this_processor; 59 } 60 61 coroutine * this_coroutine(void) { 57 coroutine_desc * this_coroutine(void) { 62 58 return this_processor->current_coroutine; 63 59 } 64 60 65 thread * this_thread(void) {61 thread_desc * this_thread(void) { 66 62 return this_processor->current_thread; 67 63 } … … 103 99 } 104 100 105 void ?{}( coroutine * this, current_stack_info_t * info) {101 void ?{}( coroutine_desc * this, current_stack_info_t * info) { 106 102 (&this->stack){ info }; 107 103 this->name = "Main Thread"; … … 110 106 } 111 107 112 void ?{}( thread * this, current_stack_info_t * info) {108 void ?{}( thread_desc * this, current_stack_info_t * info) { 113 109 (&this->c){ info }; 114 110 } … … 179 175 LIB_DEBUG_PRINTF("Kernel : core %p starting\n", this); 180 176 181 thread * readyThread = NULL;177 thread_desc * readyThread = NULL; 182 178 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ ) 183 179 { … … 206 202 // runThread runs a thread by context switching 207 203 // from the processor coroutine to the target thread 208 void runThread(processor * this, thread * dst) {209 coroutine * proc_cor = get_coroutine(this->runner);210 coroutine * thrd_cor = get_coroutine(dst);204 void runThread(processor * this, thread_desc * dst) { 205 coroutine_desc * proc_cor = get_coroutine(this->runner); 206 coroutine_desc * thrd_cor = get_coroutine(dst); 211 207 212 208 //Reset the terminating actions here … … 297 293 //----------------------------------------------------------------------------- 298 294 // Scheduler routines 299 void ScheduleThread( thread * thrd ) {295 void ScheduleThread( thread_desc * thrd ) { 300 296 assertf( thrd->next == NULL, "Expected null got %p", thrd->next ); 301 297 … … 305 301 } 306 302 307 thread * nextThread(cluster * this) {303 thread_desc * nextThread(cluster * this) { 308 304 lock( &this->lock ); 309 thread * head = pop_head( &this->ready_queue );305 thread_desc * head = pop_head( &this->ready_queue ); 310 306 unlock( &this->lock ); 311 307 return head; … … 317 313 318 314 void ScheduleInternal( spinlock * lock ) { 319 get_this_processor()->finish.action_code = Release;320 get_this_processor()->finish.lock = lock;315 this_processor->finish.action_code = Release; 316 this_processor->finish.lock = lock; 321 317 suspend(); 322 318 } 323 319 324 void ScheduleInternal( thread * thrd ) {325 get_this_processor()->finish.action_code = Schedule;326 get_this_processor()->finish.thrd = thrd;320 void ScheduleInternal( thread_desc * thrd ) { 321 this_processor->finish.action_code = Schedule; 322 this_processor->finish.thrd = thrd; 327 323 suspend(); 328 324 } 329 325 330 void ScheduleInternal( spinlock * lock, thread * thrd ) {331 get_this_processor()->finish.action_code = Release_Schedule;332 get_this_processor()->finish.lock = lock;333 get_this_processor()->finish.thrd = thrd;326 void ScheduleInternal( spinlock * lock, thread_desc * thrd ) { 327 this_processor->finish.action_code = Release_Schedule; 328 this_processor->finish.lock = lock; 329 this_processor->finish.thrd = thrd; 334 330 suspend(); 335 331 } … … 343 339 // SKULLDUGGERY: the mainThread steals the process main thread 344 340 // which will then be scheduled by the systemProcessor normally 345 mainThread = (thread *)&mainThread_storage;341 mainThread = (thread_desc *)&mainThread_storage; 346 342 current_stack_info_t info; 347 343 mainThread{ &info }; … … 440 436 this->condition = true; 441 437 442 thread * it;438 thread_desc * it; 443 439 while( it = pop_head( &this->blocked) ) { 444 440 ScheduleThread( it ); … … 455 451 } 456 452 457 void append( simple_thread_list * this, thread * t ) {453 void append( simple_thread_list * this, thread_desc * t ) { 458 454 assert(this->tail != NULL); 459 455 *this->tail = t; … … 461 457 } 462 458 463 thread * pop_head( simple_thread_list * this ) {464 thread * head = this->head;459 thread_desc * pop_head( simple_thread_list * this ) { 460 thread_desc * head = this->head; 465 461 if( head ) { 466 462 this->head = head->next; -
src/libcfa/concurrency/kernel_private.h
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // threads--8 // kernel_private.h -- 9 9 // 10 10 // Author : Thierry Delisle … … 19 19 20 20 #include "kernel" 21 #include "thread s"21 #include "thread" 22 22 23 23 //----------------------------------------------------------------------------- 24 24 // Scheduler 25 void ScheduleThread( thread * );26 thread * nextThread(cluster * this);25 void ScheduleThread( thread_desc * ); 26 thread_desc * nextThread(cluster * this); 27 27 28 28 void ScheduleInternal(); 29 29 void ScheduleInternal(spinlock * lock); 30 void ScheduleInternal(thread * thrd);31 void ScheduleInternal(spinlock * lock, thread * thrd);30 void ScheduleInternal(thread_desc * thrd); 31 void ScheduleInternal(spinlock * lock, thread_desc * thrd); 32 32 33 33 //----------------------------------------------------------------------------- … … 35 35 struct processorCtx_t { 36 36 processor * proc; 37 coroutine c;37 coroutine_desc c; 38 38 }; 39 39 … … 42 42 void main(processorCtx_t *); 43 43 void start(processor * this); 44 void runThread(processor * this, thread * dst);44 void runThread(processor * this, thread_desc * dst); 45 45 void finishRunning(processor * this); 46 46 void spin(processor * this, unsigned int * spin_count); … … 53 53 } 54 54 55 extern void ThreadCtxSwitch(coroutine * src, coroutine* dst);55 extern void ThreadCtxSwitch(coroutine_desc * src, coroutine_desc * dst); 56 56 57 57 #endif //KERNEL_PRIVATE_H -
src/libcfa/concurrency/monitor
rbf4ac09 rf2e40a9f 22 22 #include "stdlib" 23 23 24 struct __monitor_t{24 struct monitor_desc { 25 25 spinlock lock; 26 thread * owner;26 thread_desc * owner; 27 27 simple_thread_list entry_queue; 28 28 unsigned int recursion; 29 29 }; 30 30 31 static inline void ?{}( __monitor_t* this) {31 static inline void ?{}(monitor_desc * this) { 32 32 this->owner = 0; 33 33 this->recursion = 0; … … 35 35 36 36 //Basic entering routine 37 void enter( __monitor_t*);38 void leave( __monitor_t*);37 void enter(monitor_desc *); 38 void leave(monitor_desc *); 39 39 40 40 //Array entering routine 41 void enter( __monitor_t**, int count);42 void leave( __monitor_t**, int count);41 void enter(monitor_desc **, int count); 42 void leave(monitor_desc **, int count); 43 43 44 44 struct monitor_guard_t { 45 __monitor_t** m;45 monitor_desc ** m; 46 46 int count; 47 47 }; 48 48 49 static inline int ?<?( __monitor_t* lhs, __monitor_t* rhs) {49 static inline int ?<?(monitor_desc* lhs, monitor_desc* rhs) { 50 50 return ((intptr_t)lhs) < ((intptr_t)rhs); 51 51 } 52 52 53 static inline void ?{}( monitor_guard_t * this, __monitor_t** m ) {53 static inline void ?{}( monitor_guard_t * this, monitor_desc ** m ) { 54 54 this->m = m; 55 55 this->count = 1; … … 57 57 } 58 58 59 static inline void ?{}( monitor_guard_t * this, __monitor_t** m, int count ) {59 static inline void ?{}( monitor_guard_t * this, monitor_desc ** m, int count ) { 60 60 this->m = m; 61 61 this->count = count; -
src/libcfa/concurrency/monitor.c
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // __monitor_t.c --8 // monitor_desc.c -- 9 9 // 10 10 // Author : Thierry Delisle … … 19 19 #include "kernel_private.h" 20 20 21 void enter( __monitor_t* this) {21 void enter(monitor_desc * this) { 22 22 lock( &this->lock ); 23 thread * thrd = this_thread();23 thread_desc * thrd = this_thread(); 24 24 25 25 if( !this->owner ) { … … 45 45 } 46 46 47 void leave( __monitor_t* this) {47 void leave(monitor_desc * this) { 48 48 lock( &this->lock ); 49 49 50 thread * thrd = this_thread();50 thread_desc * thrd = this_thread(); 51 51 assert( thrd == this->owner ); 52 52 … … 55 55 56 56 //If we left the last level of recursion it means we are changing who owns the monitor 57 thread * new_owner = 0;57 thread_desc * new_owner = 0; 58 58 if( this->recursion == 0) { 59 59 //Get the next thread in the list … … 72 72 } 73 73 74 void enter( __monitor_t** monitors, int count) {74 void enter(monitor_desc ** monitors, int count) { 75 75 for(int i = 0; i < count; i++) { 76 76 // printf("%d\n", i); … … 79 79 } 80 80 81 void leave( __monitor_t** monitors, int count) {81 void leave(monitor_desc ** monitors, int count) { 82 82 for(int i = count - 1; i >= 0; i--) { 83 83 // printf("%d\n", i); -
src/libcfa/concurrency/thread
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // thread s--8 // thread -- 9 9 // 10 10 // Author : Thierry Delisle … … 21 21 #include "invoke.h" 22 22 23 #include "coroutine s"23 #include "coroutine" 24 24 25 25 //----------------------------------------------------------------------------- … … 29 29 trait is_thread(dtype T) { 30 30 void main(T* this); 31 thread * get_thread(T* this);31 thread_desc* get_thread(T* this); 32 32 }; 33 33 34 #define DECL_THREAD(X) thread * get_thread(X* this) { return &this->t; } void main(X* this)34 #define DECL_THREAD(X) thread_desc* get_thread(X* this) { return &this->t; } void main(X* this) 35 35 36 36 forall( dtype T | is_thread(T) ) 37 static inline coroutine * get_coroutine(T* this) {37 static inline coroutine_desc* get_coroutine(T* this) { 38 38 return &get_thread(this)->c; 39 39 } 40 40 41 static inline coroutine * get_coroutine(thread* this) {41 static inline coroutine_desc* get_coroutine(thread_desc* this) { 42 42 return &this->c; 43 43 } 44 44 45 thread * this_thread(void);45 thread_desc * this_thread(void); 46 46 47 47 //----------------------------------------------------------------------------- 48 48 // Ctors and dtors 49 void ?{}(thread * this);50 void ^?{}(thread * this);49 void ?{}(thread_desc* this); 50 void ^?{}(thread_desc* this); 51 51 52 52 //----------------------------------------------------------------------------- -
src/libcfa/concurrency/thread.c
rbf4ac09 rf2e40a9f 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // thread s.c --8 // thread.c -- 9 9 // 10 10 // Author : Thierry Delisle … … 15 15 // 16 16 17 #include "thread s"17 #include "thread" 18 18 19 19 #include "kernel_private.h" … … 28 28 } 29 29 30 extern processor * get_this_processor();30 extern thread_local processor * this_processor; 31 31 32 32 //----------------------------------------------------------------------------- … … 41 41 // Thread ctors and dtors 42 42 43 void ?{}(thread * this) {43 void ?{}(thread_desc* this) { 44 44 (&this->c){}; 45 45 this->c.name = "Anonymous Coroutine"; … … 48 48 } 49 49 50 void ^?{}(thread * this) {50 void ^?{}(thread_desc* this) { 51 51 ^(&this->c){}; 52 52 } … … 74 74 forall( dtype T | is_thread(T) ) 75 75 void start( T* this ) { 76 coroutine * thrd_c = get_coroutine(this);77 thread * thrd_h = get_thread (this);76 coroutine_desc* thrd_c = get_coroutine(this); 77 thread_desc* thrd_h = get_thread (this); 78 78 thrd_c->last = this_coroutine(); 79 get_this_processor()->current_coroutine = thrd_c;79 this_processor->current_coroutine = thrd_c; 80 80 81 81 LIB_DEBUG_PRINTF("Thread start : %p (t %p, c %p)\n", this, thrd_c, thrd_h); … … 94 94 95 95 void yield( void ) { 96 ScheduleInternal( get_this_processor()->current_thread );96 ScheduleInternal( this_processor->current_thread ); 97 97 } 98 98 99 void ThreadCtxSwitch(coroutine * src, coroutine* dst) {99 void ThreadCtxSwitch(coroutine_desc* src, coroutine_desc* dst) { 100 100 // set state of current coroutine to inactive 101 101 src->state = Inactive; … … 107 107 // set new coroutine that the processor is executing 108 108 // and context switch to it 109 get_this_processor()->current_coroutine = dst;109 this_processor->current_coroutine = dst; 110 110 CtxSwitch( src->stack.context, dst->stack.context ); 111 get_this_processor()->current_coroutine = src;111 this_processor->current_coroutine = src; 112 112 113 113 // set state of new coroutine to active … … 116 116 } 117 117 118 // C Helper to signal the termination of a thread 118 // C Helper to signal the termination of a thread_desc 119 119 // Used in invoke.c 120 120 extern "C" { 121 void __thread_signal_termination( thread * this ) {121 void __thread_signal_termination( thread_desc * this ) { 122 122 this->c.state = Halted; 123 123 LIB_DEBUG_PRINTF("Thread end : %p\n", this); -
src/tests/coroutine.c
rbf4ac09 rf2e40a9f 1 1 #include <fstream> 2 #include <coroutine s>2 #include <coroutine> 3 3 4 4 struct Fibonacci { 5 5 int fn; // used for communication 6 coroutine c;6 coroutine_desc c; 7 7 }; 8 8 … … 11 11 } 12 12 13 coroutine * get_coroutine(Fibonacci* this) {13 coroutine_desc* get_coroutine(Fibonacci* this) { 14 14 return &this->c; 15 15 } … … 47 47 #ifdef MORE_DEBUG 48 48 Fibonacci *pf1 = &f1, *pf2 = &f2; 49 coroutine *cf1 = &f1.c, *cf2 = &f2.c;49 coroutine_desc *cf1 = &f1.c, *cf2 = &f2.c; 50 50 covptr_t *vf1 = vtable(pf1), *vf2 = vtable(pf2); 51 coroutine *cv1 = get_coroutine(vf1), *cv2 = get_coroutine(vf2);51 coroutine_desc *cv1 = get_coroutine(vf1), *cv2 = get_coroutine(vf2); 52 52 Fibonacci *ov1 = (Fibonacci *)get_object(vf1), *ov2 = (Fibonacci *)get_object(vf2); 53 53 -
src/tests/monitor.c
rbf4ac09 rf2e40a9f 2 2 #include <kernel> 3 3 #include <monitor> 4 #include <thread s>4 #include <thread> 5 5 6 6 struct global_t { 7 7 int value; 8 __monitor_tm;8 monitor_desc m; 9 9 }; 10 10 … … 16 16 17 17 void increment( /*mutex*/ global_t * this ) { 18 __monitor_t* mon = &this->m;18 monitor_desc * mon = &this->m; 19 19 monitor_guard_t g1 = { &mon }; 20 20 { … … 27 27 } 28 28 29 struct MyThread { thread t; };29 struct MyThread { thread_desc t; }; 30 30 31 31 DECL_THREAD(MyThread); -
src/tests/multi-monitor.c
rbf4ac09 rf2e40a9f 2 2 #include <kernel> 3 3 #include <monitor> 4 #include <thread s>4 #include <thread> 5 5 6 6 static int global12, global23, global13; 7 7 8 static __monitor_tm1, m2, m3;8 static monitor_desc m1, m2, m3; 9 9 10 void increment( /*mutex*/ __monitor_t * p1, /*mutex*/ __monitor_t* p2, int * value ) {11 __monitor_t* mons[] = { p1, p2 };10 void increment( /*mutex*/ monitor_desc * p1, /*mutex*/ monitor_desc * p2, int * value ) { 11 monitor_desc * mons[] = { p1, p2 }; 12 12 monitor_guard_t g = { mons, 2 }; 13 13 *value += 1; … … 15 15 16 16 struct MyThread { 17 thread t;17 thread_desc t; 18 18 int target; 19 19 }; -
src/tests/test.py
rbf4ac09 rf2e40a9f 250 250 parser = argparse.ArgumentParser(description='Script which runs cforall tests') 251 251 parser.add_argument('--debug', help='Run all tests in debug or release', type=yes_no, default='no') 252 parser.add_argument('--concurrent', help='Run concurrent tests', type=yes_no, default=' no')252 parser.add_argument('--concurrent', help='Run concurrent tests', type=yes_no, default='yes') 253 253 parser.add_argument('--dry-run', help='Don\'t run the tests, only output the commands', action='store_true') 254 254 parser.add_argument('--list', help='List all test available', action='store_true') -
src/tests/thread.c
rbf4ac09 rf2e40a9f 2 2 #include <kernel> 3 3 #include <stdlib> 4 #include <thread s>4 #include <thread> 5 5 6 struct First { thread t; signal_once* lock; };7 struct Second { thread t; signal_once* lock; };6 struct First { thread_desc t; signal_once* lock; }; 7 struct Second { thread_desc t; signal_once* lock; }; 8 8 9 9 DECL_THREAD(First);
Note:
See TracChangeset
for help on using the changeset viewer.