Changeset fd061ed3
- Timestamp:
- Feb 28, 2017, 1:49:12 PM (8 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:
- 14f6bb39
- Parents:
- 31868da (diff), cc7f4b1 (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. - Files:
-
- 1 deleted
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
Jenkinsfile
r31868da rfd061ed3 173 173 174 174 def notify_server() { 175 sh 'curl --silent -X POST http://plg2:8082/jenkins/notify > /dev/null '175 sh 'curl --silent -X POST http://plg2:8082/jenkins/notify > /dev/null || true' 176 176 return 177 177 } … … 320 320 321 321 //Then publish the results 322 sh 'curl --silent --data @bench.csv http://plg2:8082/jenkins/publish > /dev/null '322 sh 'curl --silent --data @bench.csv http://plg2:8082/jenkins/publish > /dev/null || true' 323 323 } 324 324 -
src/Parser/DeclarationNode.cc
r31868da rfd061ed3 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 23 15:45:02201713 // Update Count : 7 5912 // Last Modified On : Thu Feb 23 22:21:06 2017 13 // Update Count : 775 14 14 // 15 15 … … 607 607 type->aggInst.aggregate = o->type; 608 608 if ( o->type->kind == TypeData::Aggregate ) { 609 type->aggInst.hoistType = o->type->aggregate.body; 609 610 type->aggInst.params = maybeClone( o->type->aggregate.actuals ); 611 } else { 612 type->aggInst.hoistType = o->type->enumeration.body; 610 613 } // if 611 614 type->qualifiers |= o->type->qualifiers; … … 881 884 newType->aggInst.aggregate->aggregate.fields = nullptr; 882 885 } // if 886 // don't hoist twice 887 newType->aggInst.hoistType = false; 883 888 } // if 884 889 … … 941 946 SemanticError errors; 942 947 std::back_insert_iterator< std::list< DeclarationWithType * > > out( outputList ); 943 948 944 949 for ( const DeclarationNode * cur = firstNode; cur; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) { 945 950 try { … … 953 958 auto obj = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, nullptr, inst, nullptr ); 954 959 obj->location = cur->location; 955 * out++ = obj; 960 * out++ = obj; 956 961 delete agg; 957 962 } else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) { … … 1035 1040 1036 1041 switch ( type->kind ) { 1037 case TypeData::Enum: { 1038 if ( type->enumeration.body ) { 1039 EnumDecl * typedecl = buildEnum( type, attributes ); 1040 return new EnumInstType( buildQualifiers( type ), typedecl ); 1041 } else { 1042 return new EnumInstType( buildQualifiers( type ), *type->enumeration.name ); 1043 } 1044 } 1042 case TypeData::Enum: 1045 1043 case TypeData::Aggregate: { 1046 ReferenceToType * ret; 1047 if ( type->aggregate.body ) { 1048 AggregateDecl * typedecl = buildAggregate( type, attributes ); 1049 switch ( type->aggregate.kind ) { 1050 case DeclarationNode::Struct: 1051 ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl ); 1052 break; 1053 case DeclarationNode::Union: 1054 ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl ); 1055 break; 1056 case DeclarationNode::Trait: 1057 assert( false ); 1058 //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl ); 1059 break; 1060 default: 1061 assert( false ); 1062 } // switch 1063 } else { 1064 switch ( type->aggregate.kind ) { 1065 case DeclarationNode::Struct: 1066 ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name ); 1067 break; 1068 case DeclarationNode::Union: 1069 ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name ); 1070 break; 1071 case DeclarationNode::Trait: 1072 assert( false ); 1073 //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl ); 1074 break; 1075 default: 1076 assert( false ); 1077 } // switch 1078 } // if 1044 ReferenceToType * ret = buildComAggInst( type, attributes ); 1079 1045 buildList( type->aggregate.actuals, ret->get_parameters() ); 1080 1046 return ret; -
src/Parser/ParseNode.h
r31868da rfd061ed3 109 109 ExpressionNode( const ExpressionNode &other ); 110 110 virtual ~ExpressionNode() {} 111 virtual ExpressionNode * clone() const { return expr ? new ExpressionNode( expr->clone() ) : nullptr; }111 virtual ExpressionNode * clone() const override { return expr ? new ExpressionNode( expr->clone() ) : nullptr; } 112 112 113 113 bool get_extension() const { return extension; } … … 259 259 DeclarationNode(); 260 260 ~DeclarationNode(); 261 DeclarationNode * clone() const ;261 DeclarationNode * clone() const override; 262 262 263 263 DeclarationNode * addQualifiers( DeclarationNode * ); -
src/Parser/TypeData.cc
r31868da rfd061ed3 10 10 // Created On : Sat May 16 15:12:51 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 23 16:26:39201713 // Update Count : 4 7712 // Last Modified On : Thu Feb 23 21:48:55 2017 13 // Update Count : 485 14 14 // 15 15 … … 62 62 aggInst.aggregate = nullptr; 63 63 aggInst.params = nullptr; 64 aggInst.hoistType = false;; 64 65 break; 65 66 case Enum: … … 195 196 newtype->aggInst.aggregate = maybeClone( aggInst.aggregate ); 196 197 newtype->aggInst.params = maybeClone( aggInst.params ); 198 newtype->aggInst.hoistType = aggInst.hoistType; 197 199 break; 198 200 case Enum: … … 644 646 } // buildAggregate 645 647 648 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes ) { 649 switch ( type->kind ) { 650 case TypeData::Enum: { 651 if ( type->enumeration.body ) { 652 EnumDecl * typedecl = buildEnum( type, attributes ); 653 return new EnumInstType( buildQualifiers( type ), typedecl ); 654 } else { 655 return new EnumInstType( buildQualifiers( type ), *type->enumeration.name ); 656 } // if 657 } 658 case TypeData::Aggregate: { 659 ReferenceToType * ret; 660 if ( type->aggregate.body ) { 661 AggregateDecl * typedecl = buildAggregate( type, attributes ); 662 switch ( type->aggregate.kind ) { 663 case DeclarationNode::Struct: 664 ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl ); 665 break; 666 case DeclarationNode::Union: 667 ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl ); 668 break; 669 case DeclarationNode::Trait: 670 assert( false ); 671 //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl ); 672 break; 673 default: 674 assert( false ); 675 } // switch 676 } else { 677 switch ( type->aggregate.kind ) { 678 case DeclarationNode::Struct: 679 ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name ); 680 break; 681 case DeclarationNode::Union: 682 ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name ); 683 break; 684 case DeclarationNode::Trait: 685 ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name ); 686 break; 687 default: 688 assert( false ); 689 } // switch 690 } // if 691 return ret; 692 } 693 default: 694 assert( false ); 695 } // switch 696 } // buildAggInst 697 646 698 ReferenceToType * buildAggInst( const TypeData * td ) { 647 699 assert( td->kind == TypeData::AggregateInst ); 648 700 649 ReferenceToType * ret; 650 if ( td->aggInst.aggregate->kind == TypeData::Enum ) { 651 ret = new EnumInstType( buildQualifiers( td ), *td->aggInst.aggregate->enumeration.name ); 652 } else { 653 assert( td->aggInst.aggregate->kind == TypeData::Aggregate ); 654 switch ( td->aggInst.aggregate->aggregate.kind ) { 655 case DeclarationNode::Struct: 656 assert( td->aggInst.aggregate->aggregate.name ); 657 ret = new StructInstType( buildQualifiers( td ), *td->aggInst.aggregate->aggregate.name ); 658 break; 659 case DeclarationNode::Union: 660 ret = new UnionInstType( buildQualifiers( td ), *td->aggInst.aggregate->aggregate.name ); 661 break; 662 case DeclarationNode::Trait: 663 ret = new TraitInstType( buildQualifiers( td ), *td->aggInst.aggregate->aggregate.name ); 664 break; 665 default: 666 assert( false ); 667 } // switch 668 } // if 701 // ReferenceToType * ret = buildComAggInst( td->aggInst.aggregate, std::list< Attribute * >() ); 702 ReferenceToType * ret = nullptr; 703 TypeData * type = td->aggInst.aggregate; 704 switch ( type->kind ) { 705 case TypeData::Enum: { 706 return new EnumInstType( buildQualifiers( type ), *type->enumeration.name ); 707 } 708 case TypeData::Aggregate: { 709 switch ( type->aggregate.kind ) { 710 case DeclarationNode::Struct: 711 ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name ); 712 break; 713 case DeclarationNode::Union: 714 ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name ); 715 break; 716 case DeclarationNode::Trait: 717 ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name ); 718 break; 719 default: 720 assert( false ); 721 } // switch 722 } 723 break; 724 default: 725 assert( false ); 726 } // switch 727 728 ret->set_hoistType( td->aggInst.hoistType ); 669 729 buildList( td->aggInst.params, ret->get_parameters() ); 670 730 buildForall( td->forall, ret->get_forall() ); -
src/Parser/TypeData.h
r31868da rfd061ed3 10 10 // Created On : Sat May 16 15:18:36 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 23 1 5:16:18201713 // Update Count : 15 512 // Last Modified On : Thu Feb 23 17:14:46 2017 13 // Update Count : 158 14 14 // 15 15 … … 38 38 TypeData * aggregate; 39 39 ExpressionNode * params; 40 bool hoistType; 40 41 }; 41 42 … … 104 105 ArrayType * buildArray( const TypeData * ); 105 106 AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > ); 107 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes ); 106 108 ReferenceToType * buildAggInst( const TypeData * ); 107 109 NamedTypeDecl * buildSymbolic( const TypeData *, const std::string &name, DeclarationNode::StorageClass sc ); -
src/SymTab/Validate.cc
r31868da rfd061ed3 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 2 17:47:54201713 // Update Count : 31 212 // Last Modified On : Thu Feb 23 21:33:55 2017 13 // Update Count : 318 14 14 // 15 15 … … 629 629 } else { 630 630 TypeDeclMap::const_iterator base = typedeclNames.find( typeInst->get_name() ); 631 assertf( base != typedeclNames.end(), "Can't find name %s", typeInst->get_name().c_str() );631 assertf( base != typedeclNames.end(), "Can't find typedecl name %s", typeInst->get_name().c_str() ); 632 632 typeInst->set_baseType( base->second ); 633 633 } // if … … 660 660 // Note, qualifiers on the typedef are superfluous for the forward declaration. 661 661 if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( tyDecl->get_base() ) ) { 662 return new StructDecl( aggDecl->get_name() );662 return aggDecl->get_baseStruct() ? Mutator::mutate( aggDecl->get_baseStruct() ) : new StructDecl( aggDecl->get_name() ); 663 663 } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( tyDecl->get_base() ) ) { 664 return new UnionDecl( aggDecl->get_name() );664 return aggDecl->get_baseUnion() ? Mutator::mutate( aggDecl->get_baseUnion() ) : new UnionDecl( aggDecl->get_name() ); 665 665 } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( tyDecl->get_base() ) ) { 666 666 return new EnumDecl( enumDecl->get_name() ); … … 732 732 } 733 733 734 // there may be typedefs nested within aggregates in order for everything to work properly, these should be removed734 // there may be typedefs nested within aggregates. in order for everything to work properly, these should be removed 735 735 // as well 736 736 template<typename AggDecl> -
src/SynTree/ReferenceToType.cc
r31868da rfd061ed3 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 2 17:45:07201713 // Update Count : 2 312 // Last Modified On : Thu Feb 23 16:38:54 2017 13 // Update Count : 24 14 14 // 15 15 … … 23 23 #include "Common/utility.h" 24 24 25 ReferenceToType::ReferenceToType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), name( name ) {25 ReferenceToType::ReferenceToType( const Type::Qualifiers &tq, const std::string &name, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), name( name ), hoistType( false ) { 26 26 } 27 27 28 ReferenceToType::ReferenceToType( const ReferenceToType &other ) : Type( other ), name( other.name ) {28 ReferenceToType::ReferenceToType( const ReferenceToType &other ) : Type( other ), name( other.name ), hoistType( other.hoistType ) { 29 29 cloneAll( other.parameters, parameters ); 30 30 } -
src/SynTree/Type.h
r31868da rfd061ed3 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 2 17:43:01201713 // Update Count : 3 312 // Last Modified On : Thu Feb 23 16:38:53 2017 13 // Update Count : 34 14 14 // 15 15 … … 240 240 void set_name( std::string newValue ) { name = newValue; } 241 241 std::list< Expression* >& get_parameters() { return parameters; } 242 bool get_hoistType() const { return hoistType; } 243 void set_hoistType( bool newValue ) { hoistType = newValue; } 242 244 243 245 virtual ReferenceToType *clone() const = 0; … … 250 252 std::string name; 251 253 private: 254 bool hoistType; 252 255 }; 253 256 -
src/libcfa/concurrency/invoke.h
r31868da rfd061ed3 60 60 61 61 struct coStack_t { 62 unsigned int size; // size of stack63 void *storage; // pointer to stack64 void *limit; // stack grows towards stack limit65 void *base; // base of stack66 void *context; // address of cfa_context_t67 void *top; // address of top of storage62 unsigned int size; // size of stack 63 void *storage; // pointer to stack 64 void *limit; // stack grows towards stack limit 65 void *base; // base of stack 66 void *context; // address of cfa_context_t 67 void *top; // address of top of storage 68 68 bool userStack; 69 69 }; … … 73 73 struct coroutine { 74 74 struct coStack_t stack; 75 const char *name; // textual name for coroutine/task, initialized by uC++ generated code76 int errno_; // copy of global UNIX variable errno77 enum coroutine_state state; // current execution status for coroutine78 struct coroutine *starter; // first coroutine to resume this one79 struct coroutine *last; // last coroutine to resume this one75 const char *name; // textual name for coroutine/task, initialized by uC++ generated code 76 int errno_; // copy of global UNIX variable errno 77 enum coroutine_state state; // current execution status for coroutine 78 struct coroutine *starter; // first coroutine to resume this one 79 struct coroutine *last; // last coroutine to resume this one 80 80 }; 81 81 82 82 struct thread { 83 struct coroutine c; // coroutine body used to store context84 struct signal_once terminated; // indicate if execuation state is not halted85 struct thread * next; // instrusive link field for threads83 struct coroutine c; // coroutine body used to store context 84 struct signal_once terminated; // indicate if execuation state is not halted 85 struct thread * next; // instrusive link field for threads 86 86 }; 87 87 -
src/libcfa/concurrency/monitor
r31868da rfd061ed3 21 21 #include "invoke.h" 22 22 23 struct monitor{23 struct __monitor_t { 24 24 spinlock lock; 25 thread * holder;25 thread * owner; 26 26 simple_thread_list entry_queue; 27 unsigned int recursion; 27 28 }; 28 29 29 void enter(monitor *); 30 void leave(monitor *); 30 static inline void ?{}(__monitor_t * this) { 31 this->owner = 0; 32 this->recursion = 0; 33 } 31 34 32 struct monitor_guard { 33 monitor * m; 35 void enter(__monitor_t *); 36 void leave(__monitor_t *); 37 38 struct monitor_guard_t { 39 __monitor_t * m; 34 40 }; 35 41 36 static inline void ?{}( monitor_guard * this, monitor* m ) {42 static inline void ?{}( monitor_guard_t * this, __monitor_t * m ) { 37 43 this->m = m; 38 44 enter( this->m ); 39 45 } 40 46 41 static inline void ^?{}( monitor_guard * this ) {47 static inline void ^?{}( monitor_guard_t * this ) { 42 48 leave( this->m ); 43 49 } -
src/libcfa/concurrency/monitor.c
r31868da rfd061ed3 6 6 // file "LICENCE" distributed with Cforall. 7 7 // 8 // monitor.c --8 // __monitor_t.c -- 9 9 // 10 10 // Author : Thierry Delisle … … 19 19 #include "kernel_private.h" 20 20 21 void enter( monitor* this) {21 void enter(__monitor_t * this) { 22 22 lock( &this->lock ); 23 23 thread * thrd = this_thread(); 24 24 25 if( this->holder ) { 25 if( !this->owner ) { 26 //No one has the monitor, just take it 27 this->owner = thrd; 28 this->recursion = 1; 29 } 30 else if( this->owner == thrd) { 31 //We already have the monitor, just not how many times we took it 32 assert( this->recursion > 0 ); 33 this->recursion += 1; 34 } 35 else { 36 //Some one else has the monitor, wait in line for it 26 37 append( &this->entry_queue, thrd ); 27 38 ScheduleInternal( &this->lock ); 28 return; 29 } 30 else { 31 this->holder = thrd; 39 40 //ScheduleInternal will unlock spinlock, no need to unlock ourselves 41 return; 32 42 } 33 43 … … 35 45 } 36 46 37 void leave( monitor* this) {47 void leave(__monitor_t * this) { 38 48 lock( &this->lock ); 39 49 40 50 thread * thrd = this_thread(); 41 assert( thrd == this-> holder );51 assert( thrd == this->owner ); 42 52 43 this->holder = pop_head( &this->entry_queue ); 53 //Leaving a recursion level, decrement the counter 54 this->recursion -= 1; 55 56 //If we left the last level of recursion it means we are changing who owns the monitor 57 thread * new_owner = 0; 58 if( this->recursion == 0) { 59 //Get the next thread in the list 60 new_owner = this->owner = pop_head( &this->entry_queue ); 61 62 //We are passing the monitor to someone else, which means recursion level is not 0 63 this->recursion = new_owner ? 1 : 0; 64 } 44 65 45 66 unlock( &this->lock ); 46 67 47 if( this->holder ) ScheduleThread( this->holder ); 68 //If we have a new owner, we need to wake-up the thread 69 if( new_owner ) { 70 ScheduleThread( new_owner ); 71 } 48 72 } -
src/libcfa/iostream
r31868da rfd061ed3 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 12 18:01:09 201613 // Update Count : 9 312 // Last Modified On : Fri Feb 24 21:09:09 2017 13 // Update Count : 94 14 14 // 15 15 … … 45 45 46 46 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, char ); 47 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, signed char ); 48 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, unsigned char ); 47 49 48 50 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, short int ); -
src/libcfa/iostream.c
r31868da rfd061ed3 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 12 18:01:39 201613 // Update Count : 30 612 // Last Modified On : Fri Feb 24 21:09:59 2017 13 // Update Count : 307 14 14 // 15 15 … … 26 26 ostype * ?|?( ostype *os, char c ) { 27 27 prtfmt( os, "%c", c ); 28 sepOff( os ); 29 return os; 30 } // ?|? 31 32 forall( dtype ostype | ostream( ostype ) ) 33 ostype * ?|?( ostype *os, signed char c ) { 34 prtfmt( os, "%hhd", c ); 35 sepOff( os ); 36 return os; 37 } // ?|? 38 39 forall( dtype ostype | ostream( ostype ) ) 40 ostype * ?|?( ostype *os, unsigned char c ) { 41 prtfmt( os, "%hhu", c ); 28 42 sepOff( os ); 29 43 return os; -
src/libcfa/stdlib
r31868da rfd061ed3 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 23 14:11:47201713 // Update Count : 10 012 // Last Modified On : Fri Feb 24 21:07:16 2017 13 // Update Count : 101 14 14 // 15 15 … … 95 95 //--------------------------------------- 96 96 97 char abs(char );97 unsigned char abs( signed char ); 98 98 extern "C" { int abs( int ); } // use default C routine for int 99 long int abs( long int );100 long long int abs( long long int );99 unsigned long int abs( long int ); 100 unsigned long long int abs( long long int ); 101 101 float abs( float ); 102 102 double abs( double ); -
src/libcfa/stdlib.c
r31868da rfd061ed3 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 23 14:11:29201713 // Update Count : 17 012 // Last Modified On : Fri Feb 24 21:08:11 2017 13 // Update Count : 171 14 14 // 15 15 … … 240 240 //--------------------------------------- 241 241 242 char abs(char v ) { return abs( (int)v ); }243 long int abs( long int v ) { return labs( v ); }244 long long int abs( long long int v ) { return llabs( v ); }242 unsigned char abs( signed char v ) { return abs( (int)v ); } 243 unsigned long int abs( long int v ) { return labs( v ); } 244 unsigned long long int abs( long long int v ) { return llabs( v ); } 245 245 float abs( float x ) { return fabsf( x ); } 246 246 double abs( double x ) { return fabs( x ); } -
src/tests/monitor.c
r31868da rfd061ed3 6 6 struct global_t { 7 7 int value; 8 monitorm;8 __monitor_t m; 9 9 }; 10 10 … … 16 16 17 17 void increment( /*mutex*/ global_t * this ) { 18 monitor_guard g = { &this->m }; 19 this->value += 1; 18 monitor_guard_t g1 = { &this->m }; 19 { 20 monitor_guard_t g2 = { &this->m }; 21 { 22 monitor_guard_t g3 = { &this->m }; 23 this->value += 1; 24 } 25 } 20 26 } 21 27
Note: See TracChangeset
for help on using the changeset viewer.