Warning: session_start(): open(/var/lib/php/sessions/sess_2kpuundg8mjtl8q36gg0bv6i2h, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass MultiThreadStepper {
Runnable onDone;
Lock lock = lock();
L threads = synchroList();
L steppables = synchroList();
L stepping = synchroList();
int coresToUse = coresToUse();
volatile bool cancelled;
*() {}
*(Steppable... steppables) { addAll(this.steppables, steppables); }
*(Collection extends Steppable> steppables) { addAll(this.steppables, steppables); }
void start {
print("Using " + n2(coresToUse, "core"));
repeat coresToUse {
thread "Multi Thread Stepper" {
final Thread me = currentThread();
threads.add(me);
afterwards {
bool done;
{
lock lock;
threads.remove(me);
done = empty(threads);
}
if (done) callF(onDone);
}
//int i = 0;
while licensed {
Steppable s;
{
lock lock;
if (done()) ret;
//s = get(steppables, mod(i++, l(steppables)));
s = random(steppables);
if (s != null) {
steppables.remove(s);
stepping.add(s);
}
}
if (s == null) continue with sleep(100);
bool done = false;
try {
done = !s.step();
} catch e {
_handleException(e);
done = true;
} finally {
lock lock;
stepping.remove(s);
if (!done) steppables.add(s);
}
}
}
}
}
bool done() { ret empty(steppables) || cancelled; }
void stop {
cancelled = true;
cancelThreads(threads);
}
void cleanMeUp {
stop();
}
MultiThreadStepper onDone(Runnable r) { onDone = r; this; }
}