Use abort() in case of uncaught Error exceptions.
Fixes "dwarfeh(224) fatal error" that are suspected to be related to occasional infinite loops.
This commit is contained in:
parent
3d1175e821
commit
bfc6b89ca4
|
@ -77,7 +77,7 @@ struct Task {
|
||||||
}
|
}
|
||||||
|
|
||||||
package @property ref ThreadInfo tidInfo() @system { return m_fiber ? taskFiber.tidInfo : s_tidInfo; } // FIXME: this is not thread safe!
|
package @property ref ThreadInfo tidInfo() @system { return m_fiber ? taskFiber.tidInfo : s_tidInfo; } // FIXME: this is not thread safe!
|
||||||
|
|
||||||
@property Tid tid() @trusted { return tidInfo.ident; }
|
@property Tid tid() @trusted { return tidInfo.ident; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +346,7 @@ final package class TaskFiber : Fiber {
|
||||||
import std.concurrency : Tid, thisTid;
|
import std.concurrency : Tid, thisTid;
|
||||||
import std.encoding : sanitize;
|
import std.encoding : sanitize;
|
||||||
import vibe.core.core : isEventLoopRunning, recycleFiber, taskScheduler, yield;
|
import vibe.core.core : isEventLoopRunning, recycleFiber, taskScheduler, yield;
|
||||||
|
|
||||||
version (VibeDebugCatchAll) alias UncaughtException = Throwable;
|
version (VibeDebugCatchAll) alias UncaughtException = Throwable;
|
||||||
else alias UncaughtException = Exception;
|
else alias UncaughtException = Exception;
|
||||||
try {
|
try {
|
||||||
|
@ -416,13 +416,13 @@ final package class TaskFiber : Fiber {
|
||||||
logDiagnostic("Full error: %s", th.toString().sanitize());
|
logDiagnostic("Full error: %s", th.toString().sanitize());
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
import std.stdio : stderr, writeln;
|
import std.stdio : stderr, writeln;
|
||||||
import core.stdc.stdlib : exit;
|
import core.stdc.stdlib : abort;
|
||||||
try stderr.writeln(th);
|
try stderr.writeln(th);
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
try stderr.writeln(th.msg);
|
try stderr.writeln(th.msg);
|
||||||
catch (Exception e) {}
|
catch (Exception e) {}
|
||||||
}
|
}
|
||||||
exit(1);
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,7 +521,7 @@ package struct TaskFuncInfo {
|
||||||
|
|
||||||
import std.algorithm : move;
|
import std.algorithm : move;
|
||||||
import std.traits : hasElaborateAssign;
|
import std.traits : hasElaborateAssign;
|
||||||
import std.conv : to;
|
import std.conv : to;
|
||||||
|
|
||||||
static struct TARGS { ARGS expand; }
|
static struct TARGS { ARGS expand; }
|
||||||
|
|
||||||
|
@ -745,7 +745,7 @@ package struct TaskScheduler {
|
||||||
|
|
||||||
/** Holds execution until the task gets explicitly resumed.
|
/** Holds execution until the task gets explicitly resumed.
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void hibernate()
|
void hibernate()
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,7 +47,7 @@ shared class TaskPool {
|
||||||
threads.length = thread_count;
|
threads.length = thread_count;
|
||||||
foreach (i; 0 .. thread_count) {
|
foreach (i; 0 .. thread_count) {
|
||||||
WorkerThread thr;
|
WorkerThread thr;
|
||||||
() @trusted {
|
() @trusted {
|
||||||
thr = new WorkerThread(this);
|
thr = new WorkerThread(this);
|
||||||
thr.name = format("vibe-%s", i);
|
thr.name = format("vibe-%s", i);
|
||||||
thr.start();
|
thr.start();
|
||||||
|
@ -237,7 +237,7 @@ private class WorkerThread : Thread {
|
||||||
|
|
||||||
private void main()
|
private void main()
|
||||||
nothrow {
|
nothrow {
|
||||||
import core.stdc.stdlib : exit;
|
import core.stdc.stdlib : abort;
|
||||||
import core.exception : InvalidMemoryOperationError;
|
import core.exception : InvalidMemoryOperationError;
|
||||||
import std.encoding : sanitize;
|
import std.encoding : sanitize;
|
||||||
|
|
||||||
|
@ -249,19 +249,13 @@ private class WorkerThread : Thread {
|
||||||
if (!m_pool.m_state.lock.term) runEventLoop();
|
if (!m_pool.m_state.lock.term) runEventLoop();
|
||||||
logDebug("Worker thread exit.");
|
logDebug("Worker thread exit.");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
scope (failure) exit(-1);
|
scope (failure) abort();
|
||||||
logFatal("Worker thread terminated due to uncaught exception: %s", e.msg);
|
logFatal("Worker thread terminated due to uncaught exception: %s", e.msg);
|
||||||
logDebug("Full error: %s", e.toString().sanitize());
|
logDebug("Full error: %s", e.toString().sanitize());
|
||||||
} catch (InvalidMemoryOperationError e) {
|
|
||||||
import std.stdio;
|
|
||||||
scope(failure) assert(false);
|
|
||||||
writeln("Error message: ", e.msg);
|
|
||||||
writeln("Full error: ", e.toString().sanitize());
|
|
||||||
exit(-1);
|
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
logFatal("Worker thread terminated due to uncaught error: %s", th.msg);
|
logFatal("Worker thread terminated due to uncaught error: %s", th.msg);
|
||||||
logDebug("Full error: %s", th.toString().sanitize());
|
logDebug("Full error: %s", th.toString().sanitize());
|
||||||
exit(-1);
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +332,7 @@ nothrow @safe:
|
||||||
bool consume(ref TaskFuncInfo tfi)
|
bool consume(ref TaskFuncInfo tfi)
|
||||||
{
|
{
|
||||||
import std.algorithm.mutation : swap;
|
import std.algorithm.mutation : swap;
|
||||||
|
|
||||||
if (m_queue.empty) return false;
|
if (m_queue.empty) return false;
|
||||||
swap(tfi, m_queue.front);
|
swap(tfi, m_queue.front);
|
||||||
m_queue.popFront();
|
m_queue.popFront();
|
||||||
|
|
Loading…
Reference in a new issue