Changes in / [d0ffed1:f37147b]
- Location:
- src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeTools/DeclStats.cc
rd0ffed1 rf37147b 63 63 std::map<unsigned, unsigned> p_poly; ///< Count of decls with each percentage of polymorphic elements 64 64 VectorMap<unsigned> n_types; ///< Count of decls with each number of distinct types in the pack 65 /// Count of decls with each percentage of new types in lists. 66 /// Types used in the parameter list that recur in the return list are not considered to be new. 67 std::map<unsigned, unsigned> p_new; 65 68 66 69 ArgPackStats& operator+= (const ArgPackStats& o) { … … 71 74 sum(p_poly, o.p_poly); 72 75 sum(n_types, o.n_types); 76 sum(p_new, o.p_new); 73 77 74 78 return *this; … … 86 90 /// Count of uses of each non-basic type 87 91 std::unordered_map<std::string, unsigned> compound_type_names; 92 /// Count of decls using each basic type 93 std::unordered_map<std::string, unsigned> basic_type_decls; 94 /// Count of decls using each compound type 95 std::unordered_map<std::string, unsigned> compound_type_decls; 88 96 /// Stats for the parameter list 89 97 ArgPackStats params; … … 98 106 ArgPackStats assn_returns; 99 107 100 Stats() : n_decls(0), n_type_params(), by_name(), basic_type_names(), compound_type_names(), params(), returns(), n_assns(), assn_params(), assn_returns() {}108 Stats() : n_decls(0), n_type_params(), by_name(), basic_type_names(), compound_type_names(), basic_type_decls(), compound_type_decls(), params(), returns(), n_assns(), assn_params(), assn_returns() {} 101 109 102 110 public: … … 107 115 sum( basic_type_names, o.basic_type_names ); 108 116 sum( compound_type_names, o.compound_type_names ); 117 sum( basic_type_decls, o.basic_type_decls ); 118 sum( compound_type_decls, o.compound_type_decls ); 109 119 sum( params, o.params ); 110 120 sum( returns, o.returns ); … … 120 130 std::unordered_set<std::string> seen_names; ///< Stores manglenames already seen to avoid double-counting 121 131 Stats total; 132 /// Count of expressions with (depth, fanout) 133 std::map<std::pair<unsigned, unsigned>, unsigned> exprs_by_fanout_at_depth; 122 134 123 135 /// Update arg pack stats based on a declaration list 124 void analyze( Stats& stats, ArgPackStats& pstats, std::list<DeclarationWithType*>& decls ) {136 void analyze( Stats& stats, std::unordered_set<std::string>& seen, ArgPackStats& pstats, std::list<DeclarationWithType*>& decls ) { 125 137 std::unordered_set<std::string> types; 126 unsigned n = 0; 127 unsigned n_basic = 0; 128 unsigned n_poly = 0; 138 unsigned n = 0; ///< number of args/returns 139 unsigned n_basic = 0; ///< number of basic types 140 unsigned n_poly = 0; ///< number of polymorphic types 141 unsigned n_new = 0; ///< number of new types 129 142 for ( auto decl : decls ) { 130 143 Type* dt = decl->get_type(); … … 135 148 dt->print( ss ); 136 149 types.insert( ss.str() ); 150 bool this_new = seen.insert( ss.str() ).second; 151 if ( this_new ) { ++n_new; } 137 152 138 153 if ( dynamic_cast<BasicType*>( dt ) ) { 139 154 ++n_basic; 140 155 ++stats.basic_type_names[ ss.str() ]; 156 if ( this_new ) { 157 ++stats.basic_type_decls[ ss.str() ]; 158 } 141 159 } else if ( GenPoly::hasPolyBase( dt ) ) { 142 160 ++n_poly; 143 161 } else { 144 162 ++stats.compound_type_names[ ss.str() ]; 163 if ( this_new ) { 164 ++stats.compound_type_decls[ ss.str() ]; 165 } 145 166 } 146 167 } … … 151 172 ++pstats.p_basic[ n_basic*100/n ]; 152 173 ++pstats.p_poly[ n_poly*100/n ]; 174 ++pstats.p_new[ n_new*100/n ]; 153 175 } 154 176 ++pstats.n_types.at( types.size() ); … … 156 178 157 179 void analyzeFunc( FunctionType* fnTy, Stats& stats, ArgPackStats& params, ArgPackStats& returns ) { 158 analyze( stats, params, fnTy->get_parameters() ); 159 analyze( stats, returns, fnTy->get_returnVals() ); 180 std::unordered_set<std::string> seen; 181 analyze( stats, seen, params, fnTy->get_parameters() ); 182 analyze( stats, seen, returns, fnTy->get_returnVals() ); 183 } 184 185 void analyzeExpr( UntypedExpr *expr, unsigned depth ) { 186 auto& args = expr->get_args(); 187 unsigned fanout = args.size(); 188 ++exprs_by_fanout_at_depth[ std::make_pair(depth, fanout) ]; 189 for ( Expression* arg : args ) { 190 if ( UntypedExpr *uearg = dynamic_cast<UntypedExpr*>(arg) ) { 191 analyzeExpr( uearg, depth+1 ); 192 } 193 } 160 194 } 161 195 … … 196 230 } 197 231 232 virtual void visit( UntypedExpr *expr ) { 233 analyzeExpr( expr, 0 ); 234 } 235 198 236 private: 199 237 template<typename F> … … 275 313 printAllMap("%_poly_" + name, [&extract](const Stats& stats) { return extract(stats).p_poly; }); 276 314 printAllMap("n_distinct_types_" + name, [&extract](const Stats& stats) { return extract(stats).n_types; }); 315 printAllMap("%_new_types_in_" + name, [&extract](const Stats& stats) { return extract(stats).p_new; }); 316 } 317 318 void printPairMap( const std::string& name, 319 const std::map<std::pair<unsigned, unsigned>, unsigned>& map ) { 320 for ( const auto& entry : map ) { 321 const auto& key = entry.first; 322 std::cout << "\"" << name << "\"," << key.first << "," << key.second << "," 323 << entry.second << std::endl; 324 } 277 325 } 278 326 … … 291 339 printAll("basic_type_names", [](const Stats& stats) { return stats.basic_type_names.size(); }); 292 340 printAllSparseHisto("basic_type_uses", [](const Stats& stats) { return stats.basic_type_names; }); 341 printAllSparseHisto("decls_using_basic_type", [](const Stats& stats) { return stats.basic_type_decls; }); 293 342 printAll("compound_type_names", [](const Stats& stats) { return stats.compound_type_names.size(); }); 294 343 printAllSparseHisto("compound_type_uses", [](const Stats& stats) { return stats.compound_type_names; }); 344 printAllSparseHisto("decls_using_compound_type", [](const Stats& stats) { return stats.compound_type_decls; }); 295 345 printAllPack("params", [](const Stats& stats) { return stats.params; }); 296 346 printAllPack("returns", [](const Stats& stats) { return stats.returns; }); … … 298 348 printAllPack("assn_params", [](const Stats& stats) { return stats.assn_params; }); 299 349 printAllPack("assn_returns", [](const Stats& stats) { return stats.assn_returns; }); 350 std::cout << std::endl; 351 352 printPairMap("exprs_by_depth+fanout", exprs_by_fanout_at_depth); 300 353 } 301 354 }; -
src/Parser/ParseNode.h
rd0ffed1 rf37147b 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/libcfa/concurrency/invoke.h
rd0ffed1 rf37147b 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
rd0ffed1 rf37147b 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
rd0ffed1 rf37147b 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/prelude/prelude.cf
rd0ffed1 rf37147b 131 131 !?( float _Complex ), !?( double _Complex ), !?( long double _Complex ); 132 132 133 forall ( dtype DT ) int !?( DT * ); 134 forall ( dtype DT ) int !?( const DT * ); 135 forall ( dtype DT ) int !?( volatile DT * ); 133 136 forall ( dtype DT ) int !?( const volatile DT * ); 134 137 forall ( ftype FT ) int !?( FT * ); … … 235 238 ?>?( long double, long double ), ?>=?( long double, long double ); 236 239 240 forall( dtype DT ) signed int ?<?( DT *, DT * ); 241 forall( dtype DT ) signed int ?<?( const DT *, const DT * ); 242 forall( dtype DT ) signed int ?<?( volatile DT *, volatile DT * ); 237 243 forall( dtype DT ) signed int ?<?( const volatile DT *, const volatile DT * ); 244 245 forall( dtype DT ) signed int ?>?( DT *, DT * ); 246 forall( dtype DT ) signed int ?>?( const DT *, const DT * ); 247 forall( dtype DT ) signed int ?>?( volatile DT *, volatile DT * ); 238 248 forall( dtype DT ) signed int ?>?( const volatile DT *, const volatile DT * ); 249 250 forall( dtype DT ) signed int ?<=?( DT *, DT * ); 251 forall( dtype DT ) signed int ?<=?( const DT *, const DT * ); 252 forall( dtype DT ) signed int ?<=?( volatile DT *, volatile DT * ); 239 253 forall( dtype DT ) signed int ?<=?( const volatile DT *, const volatile DT * ); 254 255 forall( dtype DT ) signed int ?>=?( DT *, DT * ); 256 forall( dtype DT ) signed int ?>=?( const DT *, const DT * ); 257 forall( dtype DT ) signed int ?>=?( volatile DT *, volatile DT * ); 240 258 forall( dtype DT ) signed int ?>=?( const volatile DT *, const volatile DT * ); 241 259 -
src/tests/avltree/avl_test.c
rd0ffed1 rf37147b 36 36 37 37 // char* -> char* 38 int ?<?(char *a, char *b) { 39 return strcmp(a,b) < 0; 38 struct c_str { char *str; }; // wraps a C string 39 int ?<?(c_str a, c_str b) { 40 return strcmp(a.str,b.str) < 0; 40 41 } 41 tree(c har *, char *) * ssmap = create("queso", "cheese");42 insert(&ssmap, "foo", "bar");43 insert(&ssmap, "hello", "world");42 tree(c_str, char *) * ssmap = create((c_str){"queso"}, "cheese"); 43 insert(&ssmap, (c_str){"foo"}, "bar"); 44 insert(&ssmap, (c_str){"hello"}, "world"); 44 45 assert( height(ssmap) == 2 ); 45 46 46 printf("%s %s %s\n", *find(ssmap, "hello"), *find(ssmap, "foo"), *find(ssmap, "queso"));47 printf("%s %s %s\n", *find(ssmap, (c_str){"hello"}), *find(ssmap, (c_str){"foo"}), *find(ssmap, (c_str){"queso"})); 47 48 48 remove(&ssmap, "foo");49 remove(&ssmap, (c_str){"foo"}); 49 50 delete(ssmap); 50 51 } -
src/tests/monitor.c
rd0ffed1 rf37147b 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.