Changeset 385
- Timestamp:
- 07/12/08 19:00:01 (3 months ago)
- Files:
-
- trunk/tools/tools/base.d (modified) (2 diffs)
- trunk/tools/tools/stackthreads.d (modified) (3 diffs)
- trunk/tools/tools/threadpool.d (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/tools/tools/base.d
r384 r385 332 332 T concat(T)(T a, T b) { return a~b; } 333 333 T add(T)(T a, T b) { return a+b; } 334 T sub (T)(T a, T b) { return a-b; }334 T subtract(T)(T a, T b) { return a-b; } 335 335 struct _op(string O) { 336 336 typeof(mixin("Init!(T) "~O~" Init!(U)")) opCall(T, U)(T a, U b) { … … 1186 1186 } 1187 1187 1188 int ctFind(string text, string match) { 1189 if (text.length < match.length) return -1; 1190 for (int i = 0; i <= text.length - match.length; ++i) { 1191 if (text[i .. i+match.length] == match) return i; 1192 } 1193 return -1; 1194 } 1195 1196 string SwitchCaseFn(string code) { 1197 int arrowpos = ctFind(code, "->"); 1198 assert(arrowpos != -1); 1199 auto value = code[0 .. arrowpos]; 1200 string Case; 1201 if (ctFind(value, "default") == -1) Case = "case "; 1202 return Case~value~": "~code[arrowpos+2 .. $]~"; break; "; 1203 } 1204 1205 string Switch(string var, string code) { 1206 string res = "switch("~var~") { "; 1207 string buffer; 1208 foreach (ch; code) { 1209 if (ch == '|') { 1210 res ~= SwitchCaseFn(buffer); 1211 buffer = ""; 1212 } else buffer ~= ch; 1213 } 1214 res ~= SwitchCaseFn(buffer); 1215 return res ~ "}"; 1216 } 1217 1218 // pragma(msg, Switch("1->a|2->b")); 1219 1188 1220 T Cast(S, T)(S orig) { return cast(T) orig; } 1189 1221 trunk/tools/tools/stackthreads.d
r376 r385 64 64 } 65 65 66 class Generator(T) {66 class Source(T) { 67 67 Coroutine routine; 68 68 T res; void delegate(void delegate(T)) dg; … … 72 72 } 73 73 74 T delegate() generator(T)(void delegate(void delegate(T)) dg) { 75 auto gen = new Generator!(T)(dg); 76 return &gen.opCall; 74 class Sink(T) { 75 Coroutine routine; 76 T v; void delegate(T delegate()) dg; 77 void run(proc yield) { dg({ yield(); return v; }); } 78 void opCall(T t) { v = t; routine(); } 79 mixin This!("dg; #New(routine, &run); #routine(); "); 80 } 81 82 T delegate() source(T)(void delegate(void delegate(T)) dg) { 83 auto src = new Source!(T)(dg); 84 return &src.opCall; 85 } 86 87 void delegate(T) sink(T)(void delegate(T delegate()) dg) { 88 auto snk = new Sink!(T)(dg); 89 return &snk.opCall; 77 90 } 78 91 79 92 T delegate() iterate(T)(T[] array) { 80 return generator(array /apply/ (T[] array, void delegate(T) yield) { foreach (entry; array) yield(entry); });93 return source(array /apply/ (T[] array, void delegate(T) yield) { foreach (entry; array) yield(entry); }); 81 94 } 82 95 … … 93 106 logln("> done"); 94 107 mustFail("ReinvokeTest", test()); 95 /*auto dg = (int i, proc yield) { while (true) { logln(i, ": active"); yield(); } }; 96 auto tri = Range[3] /map/ fix(dg) /map/ (void delegate(proc) dg) { return new Coroutine(dg); }; 97 tri[0].other = tri[1]; tri[1].other = tri[2]; tri[2].other = tri[0]; 98 tri[0]();*/ 99 auto dg = iterate([2, 3, 4, 5][]); 108 auto dg = ([2, 3, 4, 5]).iterate(); 100 109 mustEqual("IterTest #1", dg(), 2); mustEqual("IterTest #2", dg(), 3); 101 110 mustEqual("IterTest #3", dg(), 4); mustEqual("IterTest #4", dg(), 5); 111 int e; 112 auto dg2 = sink((int delegate() get) { while (true) e += get(); }); 113 dg2(2); dg2(3); dg2(4); 114 mustEqual("SinkTest", e, 9); 102 115 } trunk/tools/tools/threadpool.d
r384 r385 5 5 import tools.log, tools.functional; 6 6 7 import std.gc: addRoot; 7 8 Lock lock; // perpetually blocking 8 9 static this() { New(lock); lock.lock; } … … 35 36 return; 36 37 } 38 void slow_shutdown(void delegate() idle) { 39 shutdown_counter = new Semaphore; 40 finish = true; 41 int left; 42 auto me = Thread.getThis(); 43 foreach (thread; threads) if (thread !is me) { 44 addTask("ShutdownThreadsWakeUp", &shutdown_me); 45 left++; 46 } 47 while (left) if (!shutdown_counter.try_acquire) idle(); else left--; 48 return; 49 } 37 50 class Future(T) { 38 51 bool done; MessageChannel!(bool) channel; … … 46 59 bool finished() { if (done) return done; synchronized(this) return done || channel.active; } 47 60 } 61 void mt_foreach(T)(T[] array, void delegate(T) dg) { mt_foreach(array, (int i, T foo) { dg(foo); }); } 48 62 void mt_foreach(T)(T[] array, void delegate(int, T) dg) { 49 63 int left = array.length; 50 64 auto sync = new Object; 51 65 foreach (i, entry; array) addTask(stuple(i, entry) /apply/ (int i, T foo) { dg(i, foo); synchronized(sync) left--; }); 52 while (left) i dle();66 while (left) if (idle()) slowyield(); 53 67 } 54 68 Future!(T) future(T)(T delegate() dg) { … … 78 92 threadnames[thr] = "Freshling PoolThread"; 79 93 thr.start; 94 addRoot(cast(void*) thr); 80 95 synchronized threads~=thr; 81 96 }
