Changeset 94b1022a
- Timestamp:
- May 30, 2018, 9:28:18 PM (6 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, with_gc
- Children:
- bd946e4
- Parents:
- 35718a9 (diff), ae32d96 (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. - Location:
- src
- Files:
-
- 2 added
- 1 deleted
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r35718a9 r94b1022a 172 172 // *** Declarations 173 173 void CodeGenerator::postvisit( FunctionDecl * functionDecl ) { 174 // deleted decls should never be used, so don't print them 175 if ( functionDecl->isDeleted && genC ) return; 174 176 extension( functionDecl ); 175 177 genAttributes( functionDecl->get_attributes() ); … … 185 187 functionDecl->get_statements()->accept( *visitor ); 186 188 } // if 189 if ( functionDecl->isDeleted ) { 190 output << " = void"; 191 } 187 192 } 188 193 189 194 void CodeGenerator::postvisit( ObjectDecl * objectDecl ) { 195 // deleted decls should never be used, so don't print them 196 if ( objectDecl->isDeleted && genC ) return; 190 197 if (objectDecl->get_name().empty() && genC ) { 191 198 // only generate an anonymous name when generating C code, otherwise it clutters the output too much … … 206 213 objectDecl->get_init()->accept( *visitor ); 207 214 } // if 215 if ( objectDecl->isDeleted ) { 216 output << " = void"; 217 } 208 218 209 219 if ( objectDecl->get_bitfieldWidth() ) { … … 827 837 expr->expr->accept( *visitor ); 828 838 } 839 840 void CodeGenerator::postvisit( GenericExpr * expr ) { 841 assertf( ! genC, "C11 _Generic expressions should not reach code generation." ); 842 output << "_Generic("; 843 expr->control->accept( *visitor ); 844 output << ", "; 845 unsigned int numAssocs = expr->associations.size(); 846 unsigned int i = 0; 847 for ( GenericExpr::Association & assoc : expr->associations ) { 848 if (assoc.isDefault) { 849 output << "default: "; 850 } else { 851 output << genType( assoc.type, "", pretty, genC ) << ": "; 852 } 853 assoc.expr->accept( *visitor ); 854 if ( i+1 != numAssocs ) { 855 output << ", "; 856 } 857 i++; 858 } 859 output << ")"; 860 } 861 829 862 830 863 // *** Statements -
src/CodeGen/CodeGenerator.h
r35718a9 r94b1022a 94 94 void postvisit( ConstructorExpr * ); 95 95 void postvisit( DeletedExpr * ); 96 void postvisit( GenericExpr * ); 96 97 97 98 //*** Statements -
src/Common/PassVisitor.h
r35718a9 r94b1022a 125 125 virtual void visit( InitExpr * initExpr ) override final; 126 126 virtual void visit( DeletedExpr * delExpr ) override final; 127 virtual void visit( GenericExpr * genExpr ) override final; 127 128 128 129 virtual void visit( VoidType * basicType ) override final; … … 223 224 virtual Expression * mutate( InitExpr * initExpr ) override final; 224 225 virtual Expression * mutate( DeletedExpr * delExpr ) override final; 226 virtual Expression * mutate( GenericExpr * genExpr ) override final; 225 227 226 228 virtual Type * mutate( VoidType * basicType ) override final; … … 311 313 void indexerAddUnionFwd ( UnionDecl * node ) { indexer_impl_addUnionFwd ( pass, 0, node ); } 312 314 void indexerAddTrait ( TraitDecl * node ) { indexer_impl_addTrait ( pass, 0, node ); } 313 void indexerAddWith ( std::list< Expression * > & exprs, BaseSyntaxNode * withStmt ) { indexer_impl_addWith 315 void indexerAddWith ( std::list< Expression * > & exprs, BaseSyntaxNode * withStmt ) { indexer_impl_addWith( pass, 0, exprs, withStmt ); } 314 316 315 317 -
src/Common/PassVisitor.impl.h
r35718a9 r94b1022a 2073 2073 2074 2074 //-------------------------------------------------------------------------- 2075 // GenericExpr 2076 template< typename pass_type > 2077 void PassVisitor< pass_type >::visit( GenericExpr * node ) { 2078 VISIT_START( node ); 2079 2080 indexerScopedAccept( node->result, *this ); 2081 maybeAccept_impl( node->control, *this ); 2082 for ( GenericExpr::Association & assoc : node->associations ) { 2083 indexerScopedAccept( assoc.type, *this ); 2084 maybeAccept_impl( assoc.expr, *this ); 2085 } 2086 2087 VISIT_END( node ); 2088 } 2089 2090 template< typename pass_type > 2091 Expression * PassVisitor< pass_type >::mutate( GenericExpr * node ) { 2092 MUTATE_START( node ); 2093 2094 indexerScopedMutate( node->env, *this ); 2095 indexerScopedMutate( node->result, *this ); 2096 maybeMutate_impl( node->control, *this ); 2097 for ( GenericExpr::Association & assoc : node->associations ) { 2098 indexerScopedMutate( assoc.type, *this ); 2099 maybeMutate_impl( assoc.expr, *this ); 2100 } 2101 2102 MUTATE_END( Expression, node ); 2103 } 2104 2105 //-------------------------------------------------------------------------- 2075 2106 // VoidType 2076 2107 template< typename pass_type > -
src/Concurrency/Keywords.cc
r35718a9 r94b1022a 443 443 bool first = false; 444 444 std::list<DeclarationWithType*> mutexArgs = findMutexArgs( decl, first ); 445 if( mutexArgs.empty() ) return;446 447 if( CodeGen::isConstructor(decl->name) && first ) SemanticError( decl, "constructors cannot have mutex parameters" );448 449 445 bool isDtor = CodeGen::isDestructor( decl->name ); 450 446 447 // Is this function relevant to monitors 448 if( mutexArgs.empty() ) { 449 // If this is the destructor for a monitor it must be mutex 450 if(isDtor) { 451 Type* ty = decl->get_functionType()->get_parameters().front()->get_type(); 452 453 // If it's a copy, it's not a mutex 454 ReferenceType* rty = dynamic_cast< ReferenceType * >( ty ); 455 if( ! rty ) return; 456 457 // If we are not pointing directly to a type, it's not a mutex 458 Type* base = rty->get_base(); 459 if( dynamic_cast< ReferenceType * >( base ) ) return; 460 if( dynamic_cast< PointerType * >( base ) ) return; 461 462 // Check if its a struct 463 StructInstType * baseStruct = dynamic_cast< StructInstType * >( base ); 464 if( !baseStruct ) return; 465 466 // Check if its a monitor 467 if(baseStruct->baseStruct->is_monitor() || baseStruct->baseStruct->is_thread()) 468 SemanticError( decl, "destructors for structures declared as \"monitor\" must use mutex parameters\n" ); 469 } 470 return; 471 } 472 473 // Monitors can't be constructed with mutual exclusion 474 if( CodeGen::isConstructor(decl->name) && !first ) SemanticError( decl, "constructors cannot have mutex parameters" ); 475 476 // It makes no sense to have multiple mutex parameters for the destructor 451 477 if( isDtor && mutexArgs.size() != 1 ) SemanticError( decl, "destructors can only have 1 mutex argument" ); 452 478 479 // Make sure all the mutex arguments are monitors 453 480 for(auto arg : mutexArgs) { 454 481 validate( arg ); 455 482 } 456 483 484 // Check if we need to instrument the body 457 485 CompoundStmt* body = decl->get_statements(); 458 486 if( ! body ) return; 459 487 488 // Do we have the required headers 460 489 if( !monitor_decl || !guard_decl || !dtor_guard_decl ) 461 SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>" ); 462 490 SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>\n" ); 491 492 // Instrument the body 463 493 if( isDtor ) { 464 494 addDtorStatments( decl, body, mutexArgs ); -
src/Parser/DeclarationNode.cc
r35718a9 r94b1022a 1067 1067 SemanticError( this, "invalid function specifier for " ); 1068 1068 } // if 1069 return buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, maybeBuild< Initializer >(initializer), attributes )->set_extension( extension ); 1069 bool isDelete = initializer && initializer->get_isDelete(); 1070 Declaration * decl = buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, isDelete ? nullptr : maybeBuild< Initializer >(initializer), attributes )->set_extension( extension ); 1071 if ( isDelete ) { 1072 DeclarationWithType * dwt = strict_dynamic_cast<DeclarationWithType *>( decl ); 1073 dwt->isDeleted = true; 1074 } 1075 return decl; 1070 1076 } // if 1071 1077 -
src/Parser/InitializerNode.cc
r35718a9 r94b1022a 27 27 28 28 InitializerNode::InitializerNode( ExpressionNode * _expr, bool aggrp, ExpressionNode * des ) 29 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ) {29 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ), isDelete( false ) { 30 30 if ( aggrp ) 31 31 kids = dynamic_cast< InitializerNode * >( get_next() ); … … 36 36 37 37 InitializerNode::InitializerNode( InitializerNode * init, bool aggrp, ExpressionNode * des ) 38 : expr( nullptr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ) {38 : expr( nullptr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ), isDelete( false ) { 39 39 if ( init ) 40 40 set_last( init ); … … 46 46 set_next( nullptr ); 47 47 } // InitializerNode::InitializerNode 48 49 InitializerNode::InitializerNode( bool isDelete ) : expr( nullptr ), aggregate( false ), designator( nullptr ), kids( nullptr ), maybeConstructed( false ), isDelete( isDelete ) {} 48 50 49 51 InitializerNode::~InitializerNode() { … … 84 86 85 87 Initializer * InitializerNode::build() const { 88 assertf( ! isDelete, "Should not build delete stmt InitializerNode" ); 86 89 if ( aggregate ) { 87 90 // steal designators from children -
src/Parser/ParseNode.h
r35718a9 r94b1022a 87 87 InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = nullptr ); 88 88 InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr ); 89 InitializerNode( bool isDelete ); 89 90 ~InitializerNode(); 90 91 virtual InitializerNode * clone() const { assert( false ); return nullptr; } … … 97 98 InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; } 98 99 bool get_maybeConstructed() const { return maybeConstructed; } 100 101 bool get_isDelete() const { return isDelete; } 99 102 100 103 InitializerNode * next_init() const { return kids; } … … 110 113 InitializerNode * kids; 111 114 bool maybeConstructed; 115 bool isDelete; 112 116 }; // InitializerNode 113 117 -
src/Parser/TypeData.cc
r35718a9 r94b1022a 65 65 case Aggregate: 66 66 // aggregate = new Aggregate_t; 67 aggregate.kind = DeclarationNode::NoAggregate; 67 68 aggregate.name = nullptr; 68 69 aggregate.params = nullptr; … … 70 71 aggregate.fields = nullptr; 71 72 aggregate.body = false; 73 aggregate.tagged = false; 74 aggregate.parent = nullptr; 72 75 break; 73 76 case AggregateInst: … … 198 201 break; 199 202 case Aggregate: 203 newtype->aggregate.kind = aggregate.kind; 200 204 newtype->aggregate.name = aggregate.name ? new string( *aggregate.name ) : nullptr; 201 205 newtype->aggregate.params = maybeClone( aggregate.params ); 202 206 newtype->aggregate.actuals = maybeClone( aggregate.actuals ); 203 207 newtype->aggregate.fields = maybeClone( aggregate.fields ); 204 newtype->aggregate.kind = aggregate.kind;205 208 newtype->aggregate.body = aggregate.body; 206 209 newtype->aggregate.tagged = aggregate.tagged; -
src/Parser/parser.yy
r35718a9 r94b1022a 175 175 bool flag; 176 176 CatchStmt::Kind catch_kind; 177 GenericExpr * genexpr; 177 178 } 178 179 … … 259 260 %type<flag> asm_volatile_opt 260 261 %type<en> handler_predicate_opt 262 %type<genexpr> generic_association generic_assoc_list 261 263 262 264 // statements … … 501 503 { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; } 502 504 | GENERIC '(' assignment_expression ',' generic_assoc_list ')' // C11 503 { SemanticError( yylloc, "_Generic is currently unimplemented." ); $$ = nullptr; } 505 { 506 // add the missing control expression to the GenericExpr and return it 507 $5->control = maybeMoveBuild<Expression>( $3 ); 508 $$ = new ExpressionNode( $5 ); 509 } 504 510 ; 505 511 506 512 generic_assoc_list: // C11 507 |generic_association513 generic_association 508 514 | generic_assoc_list ',' generic_association 515 { 516 // steal the association node from the singleton and delete the wrapper 517 $1->associations.splice($1->associations.end(), $3->associations); 518 delete $3; 519 $$ = $1; 520 } 509 521 ; 510 522 511 523 generic_association: // C11 512 524 type_no_function ':' assignment_expression 525 { 526 // create a GenericExpr wrapper with one association pair 527 $$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild<Expression>($3) } } ); 528 } 513 529 | DEFAULT ':' assignment_expression 530 { $$ = new GenericExpr( nullptr, { { maybeMoveBuild<Expression>($3) } } ); } 514 531 ; 515 532 … … 2081 2098 { $$ = $2; } 2082 2099 | '=' VOID 2083 { $$ = n ullptr; }2100 { $$ = new InitializerNode( true ); } 2084 2101 | ATassign initializer 2085 2102 { $$ = $2->set_maybeConstructed( false ); } -
src/ResolvExpr/AlternativeFinder.cc
r35718a9 r94b1022a 97 97 void postvisit( InitExpr * initExpr ); 98 98 void postvisit( DeletedExpr * delExpr ); 99 void postvisit( GenericExpr * genExpr ); 99 100 100 101 /// Adds alternatives for anonymous members … … 1756 1757 assertf( false, "AlternativeFinder should never see a DeletedExpr." ); 1757 1758 } 1759 1760 void AlternativeFinder::Finder::postvisit( GenericExpr * ) { 1761 assertf( false, "_Generic is not yet supported." ); 1762 } 1758 1763 } // namespace ResolvExpr 1759 1764 -
src/SymTab/Indexer.cc
r35718a9 r94b1022a 148 148 for ( auto decl : copy ) { 149 149 if ( FunctionDecl * function = dynamic_cast< FunctionDecl * >( decl.id ) ) { 150 std::list< DeclarationWithType * > & params = function-> get_functionType()->get_parameters();150 std::list< DeclarationWithType * > & params = function->type->parameters; 151 151 assert( ! params.empty() ); 152 152 // use base type of pointer, so that qualifiers on the pointer type aren't considered. … … 170 170 bool noUserDefinedFunc = ! val.existsUserDefinedFunc; 171 171 bool isUserDefinedFunc = ball.isUserDefinedFunc; 172 bool isAcceptableDefaultCtor = (! val.existsUserDefinedCtor || (! val.existsUserDefinedDefaultCtor && ball.decl.id-> get_linkage()== LinkageSpec::Intrinsic)) && ball.isDefaultCtor; // allow default constructors only when no user-defined constructors exist, except in the case of intrinsics, which require exact overrides172 bool isAcceptableDefaultCtor = (! val.existsUserDefinedCtor || (! val.existsUserDefinedDefaultCtor && ball.decl.id->linkage == LinkageSpec::Intrinsic)) && ball.isDefaultCtor; // allow default constructors only when no user-defined constructors exist, except in the case of intrinsics, which require exact overrides 173 173 bool isAcceptableCopyFunc = ! val.existsUserDefinedCopyFunc && ball.isCopyFunc; // handles copy ctor and assignment operator 174 174 bool isAcceptableDtor = ! val.existsUserDefinedDtor && ball.isDtor; … … 471 471 void Indexer::addId( DeclarationWithType * decl, Expression * baseExpr ) { 472 472 // default handling of conflicts is to raise an error 473 addId( decl, [decl](IdData &, const std::string & msg) { SemanticError( decl, msg ); return true; }, baseExpr );473 addId( decl, [decl](IdData &, const std::string & msg) { SemanticError( decl, msg ); return true; }, baseExpr, decl->isDeleted ? decl : nullptr ); 474 474 } 475 475 -
src/SymTab/Mangler.cc
r35718a9 r94b1022a 171 171 "w", // SignedInt128 172 172 "Uw", // UnsignedInt128 173 " a", // Float80174 " A", // Float128173 "x", // Float80 174 "y", // Float128 175 175 }; 176 176 static_assert( … … 225 225 GuardValue( inFunctionType ); 226 226 inFunctionType = true; 227 std::list< Type* > returnTypes = getTypes( functionType-> get_returnVals());227 std::list< Type* > returnTypes = getTypes( functionType->returnVals ); 228 228 acceptAll( returnTypes, *visitor ); 229 229 mangleName << "_"; 230 std::list< Type* > paramTypes = getTypes( functionType-> get_parameters());230 std::list< Type* > paramTypes = getTypes( functionType->parameters ); 231 231 acceptAll( paramTypes, *visitor ); 232 232 mangleName << "_"; … … 236 236 printQualifiers( refType ); 237 237 238 mangleName << ( refType-> get_name().length() + prefix.length() ) << prefix << refType->get_name();238 mangleName << ( refType->name.length() + prefix.length() ) << prefix << refType->name; 239 239 240 240 if ( mangleGenericParams ) { 241 std::list< Expression* >& params = refType-> get_parameters();241 std::list< Expression* >& params = refType->parameters; 242 242 if ( ! params.empty() ) { 243 243 mangleName << "_"; 244 244 for ( std::list< Expression* >::const_iterator param = params.begin(); param != params.end(); ++param ) { 245 245 TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param ); 246 assertf(paramType, "Aggregate parameters should be type expressions: %s", to String(*param).c_str());247 maybeAccept( paramType-> get_type(), *visitor );246 assertf(paramType, "Aggregate parameters should be type expressions: %s", toCString(*param)); 247 maybeAccept( paramType->type, *visitor ); 248 248 } 249 249 mangleName << "_"; -
src/SynTree/Declaration.cc
r35718a9 r94b1022a 104 104 } 105 105 106 106 107 // Local Variables: // 107 108 // tab-width: 4 // -
src/SynTree/Declaration.h
r35718a9 r94b1022a 84 84 Expression *asmName; 85 85 std::list< Attribute * > attributes; 86 bool isDeleted = false; 86 87 87 88 DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs ); -
src/SynTree/Expression.cc
r35718a9 r94b1022a 748 748 } 749 749 750 GenericExpr::Association::Association( Type * type, Expression * expr ) : type( type ), expr( expr ), isDefault( false ) {} 751 GenericExpr::Association::Association( Expression * expr ) : type( nullptr ), expr( expr ), isDefault( true ) {} 752 GenericExpr::Association::Association( const Association & other ) : type( maybeClone( other.type ) ), expr( maybeClone( other.expr ) ), isDefault( other.isDefault ) {} 753 GenericExpr::Association::~Association() { 754 delete type; 755 delete expr; 756 } 757 758 GenericExpr::GenericExpr( Expression * control, const std::list<Association> & assoc ) : Expression(), control( control ), associations( assoc ) {} 759 GenericExpr::GenericExpr( const GenericExpr & other ) : Expression(other), control( maybeClone( other.control ) ), associations( other.associations ) { 760 } 761 GenericExpr::~GenericExpr() { 762 delete control; 763 } 764 765 void GenericExpr::print( std::ostream & os, Indenter indent ) const { 766 os << "C11 _Generic Expression" << std::endl << indent+1; 767 control->print( os, indent+1 ); 768 os << std::endl << indent+1 << "... with associations: " << std::endl; 769 for ( const Association & assoc : associations ) { 770 os << indent+1; 771 if (assoc.isDefault) { 772 os << "... default: "; 773 assoc.expr->print( os, indent+1 ); 774 } else { 775 os << "... type: "; 776 assoc.type->print( os, indent+1 ); 777 os << std::endl << indent+1 << "... expression: "; 778 assoc.expr->print( os, indent+1 ); 779 os << std::endl; 780 } 781 os << std::endl; 782 } 783 } 750 784 751 785 // Local Variables: // -
src/SynTree/Expression.h
r35718a9 r94b1022a 865 865 }; 866 866 867 /// C11 _Generic expression 868 class GenericExpr : public Expression { 869 public: 870 struct Association { 871 Type * type = nullptr; 872 Expression * expr = nullptr; 873 bool isDefault = false; 874 875 Association( Type * type, Expression * expr ); 876 Association( Expression * expr ); 877 Association( const Association & other ); 878 Association & operator=( const Association & other ) = delete; // at the moment this isn't used, and I don't want to implement it 879 ~Association(); 880 }; 881 882 Expression * control; 883 std::list<Association> associations; 884 885 GenericExpr( Expression * control, const std::list<Association> & assoc ); 886 GenericExpr( const GenericExpr & other ); 887 virtual ~GenericExpr(); 888 889 virtual GenericExpr * clone() const { return new GenericExpr( * this ); } 890 virtual void accept( Visitor & v ) { v.visit( this ); } 891 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 892 virtual void print( std::ostream & os, Indenter indent = {} ) const; 893 }; 894 867 895 // Local Variables: // 868 896 // tab-width: 4 // -
src/SynTree/Mutator.h
r35718a9 r94b1022a 93 93 virtual Expression * mutate( InitExpr * initExpr ) = 0; 94 94 virtual Expression * mutate( DeletedExpr * delExpr ) = 0; 95 virtual Expression * mutate( GenericExpr * genExpr ) = 0; 95 96 96 97 virtual Type * mutate( VoidType * basicType ) = 0; -
src/SynTree/SynTree.h
r35718a9 r94b1022a 101 101 class InitExpr; 102 102 class DeletedExpr; 103 class GenericExpr; 103 104 104 105 class Type; -
src/SynTree/Visitor.h
r35718a9 r94b1022a 95 95 virtual void visit( InitExpr * initExpr ) = 0; 96 96 virtual void visit( DeletedExpr * delExpr ) = 0; 97 virtual void visit( GenericExpr * genExpr ) = 0; 97 98 98 99 virtual void visit( VoidType * basicType ) = 0; -
src/benchmark/Makefile.am
r35718a9 r94b1022a 277 277 278 278 compile-io$(EXEEXT): 279 @${CC} -quiet -fsyntax-only -w ../tests/io .c@CFA_FLAGS@ ${AM_CFLAGS} ${CFLAGS} ${ccflags}279 @${CC} -quiet -fsyntax-only -w ../tests/io1.c @CFA_FLAGS@ ${AM_CFLAGS} ${CFLAGS} ${ccflags} 280 280 281 281 compile-monitor$(EXEEXT): 282 @${CC} -quiet -fsyntax-only -w ../tests/concurrent/monitor.c 282 @${CC} -quiet -fsyntax-only -w ../tests/concurrent/monitor.c @CFA_FLAGS@ ${AM_CFLAGS} ${CFLAGS} ${ccflags} 283 283 284 284 compile-operators$(EXEEXT): … … 289 289 290 290 compile-typeof$(EXEEXT): 291 @${CC} -quiet -fsyntax-only -w ../tests/typeof.c 292 291 @${CC} -quiet -fsyntax-only -w ../tests/typeof.c @CFA_FLAGS@ ${AM_CFLAGS} ${CFLAGS} ${ccflags} 292 -
src/libcfa/Makefile.am
r35718a9 r94b1022a 51 51 # not all platforms support concurrency, add option do disable it 52 52 if BUILD_CONCURRENCY 53 headers += concurrency/coroutine concurrency/thread concurrency/kernel concurrency/monitor 53 headers += concurrency/coroutine concurrency/thread concurrency/kernel concurrency/monitor concurrency/mutex 54 54 endif 55 55 -
src/libcfa/Makefile.in
r35718a9 r94b1022a 97 97 98 98 # not all platforms support concurrency, add option do disable it 99 @BUILD_CONCURRENCY_TRUE@am__append_3 = concurrency/coroutine concurrency/thread concurrency/kernel concurrency/monitor 99 @BUILD_CONCURRENCY_TRUE@am__append_3 = concurrency/coroutine concurrency/thread concurrency/kernel concurrency/monitor concurrency/mutex 100 100 101 101 # not all platforms support concurrency, add option do disable it … … 153 153 containers/pair.c containers/result.c containers/vector.c \ 154 154 concurrency/coroutine.c concurrency/thread.c \ 155 concurrency/kernel.c concurrency/monitor.c assert.c \156 exception.c virtual.c concurrency/CtxSwitch-@MACHINE_TYPE@.S\157 concurrency/ alarm.c concurrency/invoke.c \158 concurrency/ preemption.c155 concurrency/kernel.c concurrency/monitor.c concurrency/mutex.c \ 156 assert.c exception.c virtual.c \ 157 concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \ 158 concurrency/invoke.c concurrency/preemption.c 159 159 am__dirstamp = $(am__leading_dot)dirstamp 160 160 @BUILD_CONCURRENCY_TRUE@am__objects_1 = concurrency/libcfa_d_a-coroutine.$(OBJEXT) \ 161 161 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-thread.$(OBJEXT) \ 162 162 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-kernel.$(OBJEXT) \ 163 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-monitor.$(OBJEXT) 163 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-monitor.$(OBJEXT) \ 164 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_d_a-mutex.$(OBJEXT) 164 165 am__objects_2 = libcfa_d_a-fstream.$(OBJEXT) \ 165 166 libcfa_d_a-iostream.$(OBJEXT) libcfa_d_a-iterator.$(OBJEXT) \ … … 188 189 containers/result.c containers/vector.c \ 189 190 concurrency/coroutine.c concurrency/thread.c \ 190 concurrency/kernel.c concurrency/monitor.c assert.c \191 exception.c virtual.c concurrency/CtxSwitch-@MACHINE_TYPE@.S\192 concurrency/ alarm.c concurrency/invoke.c \193 concurrency/ preemption.c191 concurrency/kernel.c concurrency/monitor.c concurrency/mutex.c \ 192 assert.c exception.c virtual.c \ 193 concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \ 194 concurrency/invoke.c concurrency/preemption.c 194 195 @BUILD_CONCURRENCY_TRUE@am__objects_5 = concurrency/libcfa_a-coroutine.$(OBJEXT) \ 195 196 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-thread.$(OBJEXT) \ 196 197 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-kernel.$(OBJEXT) \ 197 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-monitor.$(OBJEXT) 198 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-monitor.$(OBJEXT) \ 199 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-mutex.$(OBJEXT) 198 200 am__objects_6 = libcfa_a-fstream.$(OBJEXT) libcfa_a-iostream.$(OBJEXT) \ 199 201 libcfa_a-iterator.$(OBJEXT) libcfa_a-limits.$(OBJEXT) \ … … 264 266 containers/result containers/vector concurrency/coroutine \ 265 267 concurrency/thread concurrency/kernel concurrency/monitor \ 266 ${shell find stdhdr -type f -printf "%p "} math gmp time_t.h\267 clock bits/align.h bits/containers.h bits/defs.h bits/debug.h \268 bits/ locks.h concurrency/invoke.h268 concurrency/mutex ${shell find stdhdr -type f -printf "%p "} \ 269 math gmp time_t.h clock bits/align.h bits/containers.h \ 270 bits/defs.h bits/debug.h bits/locks.h concurrency/invoke.h 269 271 HEADERS = $(nobase_cfa_include_HEADERS) 270 272 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) … … 548 550 concurrency/libcfa_d_a-monitor.$(OBJEXT): concurrency/$(am__dirstamp) \ 549 551 concurrency/$(DEPDIR)/$(am__dirstamp) 552 concurrency/libcfa_d_a-mutex.$(OBJEXT): concurrency/$(am__dirstamp) \ 553 concurrency/$(DEPDIR)/$(am__dirstamp) 550 554 concurrency/CtxSwitch-@MACHINE_TYPE@.$(OBJEXT): \ 551 555 concurrency/$(am__dirstamp) \ … … 580 584 concurrency/$(DEPDIR)/$(am__dirstamp) 581 585 concurrency/libcfa_a-monitor.$(OBJEXT): concurrency/$(am__dirstamp) \ 586 concurrency/$(DEPDIR)/$(am__dirstamp) 587 concurrency/libcfa_a-mutex.$(OBJEXT): concurrency/$(am__dirstamp) \ 582 588 concurrency/$(DEPDIR)/$(am__dirstamp) 583 589 concurrency/libcfa_a-alarm.$(OBJEXT): concurrency/$(am__dirstamp) \ … … 635 641 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-kernel.Po@am__quote@ 636 642 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-monitor.Po@am__quote@ 643 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-mutex.Po@am__quote@ 637 644 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-preemption.Po@am__quote@ 638 645 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-thread.Po@am__quote@ … … 642 649 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po@am__quote@ 643 650 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po@am__quote@ 651 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-mutex.Po@am__quote@ 644 652 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-preemption.Po@am__quote@ 645 653 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_d_a-thread.Po@am__quote@ … … 930 938 @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-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi` 931 939 940 concurrency/libcfa_d_a-mutex.o: concurrency/mutex.c 941 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-mutex.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-mutex.Tpo -c -o concurrency/libcfa_d_a-mutex.o `test -f 'concurrency/mutex.c' || echo '$(srcdir)/'`concurrency/mutex.c 942 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-mutex.Tpo concurrency/$(DEPDIR)/libcfa_d_a-mutex.Po 943 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/mutex.c' object='concurrency/libcfa_d_a-mutex.o' libtool=no @AMDEPBACKSLASH@ 944 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 945 @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-mutex.o `test -f 'concurrency/mutex.c' || echo '$(srcdir)/'`concurrency/mutex.c 946 947 concurrency/libcfa_d_a-mutex.obj: concurrency/mutex.c 948 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-mutex.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-mutex.Tpo -c -o concurrency/libcfa_d_a-mutex.obj `if test -f 'concurrency/mutex.c'; then $(CYGPATH_W) 'concurrency/mutex.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/mutex.c'; fi` 949 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-mutex.Tpo concurrency/$(DEPDIR)/libcfa_d_a-mutex.Po 950 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/mutex.c' object='concurrency/libcfa_d_a-mutex.obj' libtool=no @AMDEPBACKSLASH@ 951 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 952 @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-mutex.obj `if test -f 'concurrency/mutex.c'; then $(CYGPATH_W) 'concurrency/mutex.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/mutex.c'; fi` 953 932 954 libcfa_d_a-assert.o: assert.c 933 955 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-assert.Tpo -c -o libcfa_d_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c … … 1237 1259 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1238 1260 @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-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi` 1261 1262 concurrency/libcfa_a-mutex.o: concurrency/mutex.c 1263 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-mutex.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-mutex.Tpo -c -o concurrency/libcfa_a-mutex.o `test -f 'concurrency/mutex.c' || echo '$(srcdir)/'`concurrency/mutex.c 1264 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-mutex.Tpo concurrency/$(DEPDIR)/libcfa_a-mutex.Po 1265 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/mutex.c' object='concurrency/libcfa_a-mutex.o' libtool=no @AMDEPBACKSLASH@ 1266 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1267 @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-mutex.o `test -f 'concurrency/mutex.c' || echo '$(srcdir)/'`concurrency/mutex.c 1268 1269 concurrency/libcfa_a-mutex.obj: concurrency/mutex.c 1270 @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-mutex.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-mutex.Tpo -c -o concurrency/libcfa_a-mutex.obj `if test -f 'concurrency/mutex.c'; then $(CYGPATH_W) 'concurrency/mutex.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/mutex.c'; fi` 1271 @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-mutex.Tpo concurrency/$(DEPDIR)/libcfa_a-mutex.Po 1272 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concurrency/mutex.c' object='concurrency/libcfa_a-mutex.obj' libtool=no @AMDEPBACKSLASH@ 1273 @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1274 @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-mutex.obj `if test -f 'concurrency/mutex.c'; then $(CYGPATH_W) 'concurrency/mutex.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/mutex.c'; fi` 1239 1275 1240 1276 libcfa_a-assert.o: assert.c -
src/libcfa/bits/containers.h
r35718a9 r94b1022a 183 183 verify( *tail == NULL ); 184 184 return val; 185 } 186 187 forall(dtype T | is_node(T)) 188 static inline bool ?!=?( __queue(T) & this, zero_t zero ) { 189 return this.head != 0; 185 190 } 186 191 #endif … … 261 266 __get( node ).prev = NULL; 262 267 } 268 269 forall(dtype T | sized(T)) 270 static inline bool ?!=?( __dllist(T) & this, zero_t zero ) { 271 return this.head != 0; 272 } 263 273 #undef next 264 274 #undef prev -
src/libcfa/concurrency/kernel
r35718a9 r94b1022a 23 23 extern "C" { 24 24 #include <pthread.h> 25 #include <semaphore.h> 25 26 } 26 27 … … 43 44 extern struct cluster * mainCluster; 44 45 45 enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule }; 46 enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule, Callback }; 47 48 typedef void (*__finish_callback_fptr_t)(void); 46 49 47 50 //TODO use union, many of these fields are mutually exclusive (i.e. MULTI vs NOMULTI) 48 51 struct FinishAction { 49 52 FinishOpCode action_code; 53 /* 54 // Union of possible actions 55 union { 56 // Option 1 : locks and threads 57 struct { 58 // 1 thread or N thread 59 union { 60 thread_desc * thrd; 61 struct { 62 thread_desc ** thrds; 63 unsigned short thrd_count; 64 }; 65 }; 66 // 1 lock or N lock 67 union { 68 __spinlock_t * lock; 69 struct { 70 __spinlock_t ** locks; 71 unsigned short lock_count; 72 }; 73 }; 74 }; 75 // Option 2 : action pointer 76 __finish_callback_fptr_t callback; 77 }; 78 /*/ 50 79 thread_desc * thrd; 80 thread_desc ** thrds; 81 unsigned short thrd_count; 51 82 __spinlock_t * lock; 52 83 __spinlock_t ** locks; 53 84 unsigned short lock_count; 54 thread_desc ** thrds;55 unsigned short thrd_count;85 __finish_callback_fptr_t callback; 86 //*/ 56 87 }; 57 88 static inline void ?{}(FinishAction & this) { … … 101 132 102 133 // Idle lock 134 sem_t idleLock; 103 135 104 136 // Link lists fields -
src/libcfa/concurrency/kernel.c
r35718a9 r94b1022a 49 49 thread_desc * mainThread; 50 50 51 struct { __dllist_t(cluster 51 struct { __dllist_t(cluster) list; __spinlock_t lock; } global_clusters; 52 52 53 53 //----------------------------------------------------------------------------- … … 143 143 runner.proc = &this; 144 144 145 sem_init(&idleLock, 0, 0); 146 145 147 start( &this ); 146 148 } … … 156 158 pthread_join( kernel_thread, NULL ); 157 159 } 160 161 sem_destroy(&idleLock); 158 162 } 159 163 … … 257 261 // its final actions must be executed from the kernel 258 262 void finishRunning(processor * this) with( this->finish ) { 259 if( action_code == Release ) { 260 verify( ! kernelTLS.preemption_state.enabled ); 263 verify( ! kernelTLS.preemption_state.enabled ); 264 choose( action_code ) { 265 case No_Action: 266 break; 267 case Release: 261 268 unlock( *lock ); 262 } 263 else if( action_code == Schedule ) { 269 case Schedule: 264 270 ScheduleThread( thrd ); 265 } 266 else if( action_code == Release_Schedule ) { 267 verify( ! kernelTLS.preemption_state.enabled ); 271 case Release_Schedule: 268 272 unlock( *lock ); 269 273 ScheduleThread( thrd ); 270 } 271 else if( action_code == Release_Multi ) { 272 verify( ! kernelTLS.preemption_state.enabled ); 274 case Release_Multi: 273 275 for(int i = 0; i < lock_count; i++) { 274 276 unlock( *locks[i] ); 275 277 } 276 } 277 else if( action_code == Release_Multi_Schedule ) { 278 case Release_Multi_Schedule: 278 279 for(int i = 0; i < lock_count; i++) { 279 280 unlock( *locks[i] ); … … 282 283 ScheduleThread( thrds[i] ); 283 284 } 284 } 285 else { 286 assert(action_code == No_Action); 285 case Callback: 286 callback(); 287 default: 288 abort("KERNEL ERROR: Unexpected action to run after thread"); 287 289 } 288 290 } … … 291 293 // TODO : find some strategy to put cores to sleep after some time 292 294 void spin(processor * this, unsigned int * spin_count) { 293 (*spin_count)++; 295 // (*spin_count)++; 296 halt(this); 294 297 } 295 298 … … 396 399 with( *thrd->curr_cluster ) { 397 400 lock ( ready_queue_lock __cfaabi_dbg_ctx2 ); 401 bool was_empty = !(ready_queue != 0); 398 402 append( ready_queue, thrd ); 399 403 unlock( ready_queue_lock ); 404 405 if( was_empty ) { 406 lock (proc_list_lock __cfaabi_dbg_ctx2); 407 if(idles) { 408 wake(idles.head); 409 } 410 unlock (proc_list_lock); 411 } 400 412 } 401 413 … … 497 509 } 498 510 511 void BlockInternal(__finish_callback_fptr_t callback) { 512 disable_interrupts(); 513 with( *kernelTLS.this_processor ) { 514 finish.action_code = Callback; 515 finish.callback = callback; 516 } 517 518 verify( ! kernelTLS.preemption_state.enabled ); 519 returnToKernel(); 520 verify( ! kernelTLS.preemption_state.enabled ); 521 522 enable_interrupts( __cfaabi_dbg_ctx ); 523 } 524 499 525 // KERNEL ONLY 500 526 void LeaveThread(__spinlock_t * lock, thread_desc * thrd) { … … 627 653 //============================================================================================= 628 654 629 // void halt(processor * this) with( this ) { 630 // pthread_mutex_lock( &idle.lock ); 631 632 633 634 // // SKULLDUGGERY: Even if spurious wake-up is a thing 635 // // spuriously waking up a kernel thread is not a big deal 636 // // if it is very rare. 637 // pthread_cond_wait( &idle.cond, &idle.lock); 638 // pthread_mutex_unlock( &idle.lock ); 639 // } 640 641 // void wake(processor * this) with( this ) { 642 // pthread_mutex_lock (&idle.lock); 643 // pthread_cond_signal (&idle.cond); 644 // pthread_mutex_unlock(&idle.lock); 645 // } 655 void halt(processor * this) with( *this ) { 656 with( *cltr ) { 657 lock (proc_list_lock __cfaabi_dbg_ctx2); 658 remove (procs, *this); 659 push_front(idles, *this); 660 unlock (proc_list_lock); 661 } 662 663 __cfaabi_dbg_print_safe("Kernel : Processor %p ready to sleep\n", this); 664 665 sem_wait(&idleLock); 666 667 __cfaabi_dbg_print_safe("Kernel : Processor %p woke up and ready to run\n", this); 668 669 with( *cltr ) { 670 lock (proc_list_lock __cfaabi_dbg_ctx2); 671 remove (idles, *this); 672 push_front(procs, *this); 673 unlock (proc_list_lock); 674 } 675 } 676 677 void wake(processor * this) { 678 __cfaabi_dbg_print_safe("Kernel : Waking up processor %p\n", this); 679 sem_post(&this->idleLock); 680 } 646 681 647 682 //============================================================================================= -
src/libcfa/concurrency/kernel_private.h
r35718a9 r94b1022a 48 48 void BlockInternal(__spinlock_t * locks [], unsigned short count); 49 49 void BlockInternal(__spinlock_t * locks [], unsigned short count, thread_desc * thrds [], unsigned short thrd_count); 50 void BlockInternal(__finish_callback_fptr_t callback); 50 51 void LeaveThread(__spinlock_t * lock, thread_desc * thrd); 51 52 … … 56 57 void runThread(processor * this, thread_desc * dst); 57 58 void finishRunning(processor * this); 59 void halt(processor * this); 60 void wake(processor * this); 58 61 void terminate(processor * this); 59 62 void spin(processor * this, unsigned int * spin_count); -
src/libcfa/concurrency/monitor.c
r35718a9 r94b1022a 297 297 this.count = count; 298 298 299 // Sort monitors based on address -> TODO use a sort specialized for small numbers299 // Sort monitors based on address 300 300 __libcfa_small_sort(this.m, count); 301 301 -
src/libcfa/concurrency/preemption.c
r35718a9 r94b1022a 266 266 void terminate(processor * this) { 267 267 this->do_terminate = true; 268 wake(this); 268 269 sigval_t value = { PREEMPT_TERMINATE }; 269 270 pthread_sigqueue( this->kernel_thread, SIGUSR1, value ); -
src/tests/concurrent/signal/block.c
r35718a9 r94b1022a 40 40 } 41 41 42 void ^?{} ( global_data_t & this ) {}42 void ^?{} ( global_data_t & mutex this ) {} 43 43 44 44 global_data_t globalA, globalB; -
src/tests/concurrent/signal/disjoint.c
r35718a9 r94b1022a 26 26 monitor global_data_t; 27 27 void ?{}( global_data_t & this ); 28 void ^?{} ( global_data_t & this );28 void ^?{} ( global_data_t & mutex this ); 29 29 30 30 monitor global_data_t { … … 42 42 } 43 43 44 void ^?{} ( global_data_t & this ) {}44 void ^?{} ( global_data_t & mutex this ) {} 45 45 46 46 //------------------------------------------------------------------------------ -
src/tests/pybin/tools.py
r35718a9 r94b1022a 83 83 return sh(cmd) 84 84 85 def which(program): 86 import os 87 def is_exe(fpath): 88 return os.path.isfile(fpath) and os.access(fpath, os.X_OK) 89 90 fpath, fname = os.path.split(program) 91 if fpath: 92 if is_exe(program): 93 return program 94 else: 95 for path in os.environ["PATH"].split(os.pathsep): 96 exe_file = os.path.join(path, program) 97 if is_exe(exe_file): 98 return exe_file 99 100 return None 85 101 ################################################################################ 86 102 # file handling … … 219 235 return False 220 236 237 def fancy_print(text): 238 column = which('column') 239 if column: 240 cmd = "%s 2> /dev/null" % column 241 print(cmd) 242 proc = Popen(cmd, stdin=PIPE, stderr=None, shell=True) 243 proc.communicate(input=text) 244 else: 245 print(text) 221 246 222 247 settings.set_machine_default( getMachineType ) -
src/tests/test.py
r35718a9 r94b1022a 277 277 elif options.list : 278 278 print("Listing for %s:%s"% (settings.arch.string, settings.debug.string)) 279 print("\n".join(map(lambda t: "%s" % (t.toString()), tests)))279 fancy_print("\n".join(map(lambda t: "%s" % (t.toString()), tests))) 280 280 281 281 else :
Note: See TracChangeset
for help on using the changeset viewer.