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:
Sönke Ludwig 2017-07-18 22:51:09 +02:00
parent 3d1175e821
commit bfc6b89ca4
No known key found for this signature in database
GPG key ID: D95E8DB493EE314C
2 changed files with 11 additions and 17 deletions

View file

@ -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()
{ {

View file

@ -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();