vibe.d: попробуйте отправить сообщение остановленной задаче
При отправке сообщения остановленной задаче vibe.d приложение получает ошибку сегментации. Я не ожидал, что сообщение будет доставлено, но получил уведомление о неудачной попытке отправки (или, по крайней мере, об ошибке).
Следующий пример иллюстрирует эту проблему.
import std.stdio;
import core.thread;
import vibe.core.core;
import vibe.core.concurrency;
static this() {
Task t = runTask({
writeln("Hi");
});
t.join;
t.send(42);
writeln("Bye");
}
При выполнении кода выше, вывод:
Hi
Program exited with code -11
... вместо:
Hi
Bye
CallCack выглядит так.
#0 0x00007ffff6dbd346 in std.concurrency.MessageBox.put(ref std.concurrency.Message) ()
from /usr/lib64/libphobos2.so.0.71
#1 0x000000000051b0b3 in std.concurrency._send!(int)._send(std.concurrency.MsgType, std.concurrency.Tid, int) (_param_2=42, tid=..., type=<incomplete type>)
at /opt/dmd-2.071/import/std/concurrency.d:640
#2 0x000000000051b06d in std.concurrency._send!(int)._send(std.concurrency.Tid, int) (
_param_1=42, tid=...) at /opt/dmd-2.071/import/std/concurrency.d:629
#3 0x000000000051b04b in std.concurrency.send!(int).send(std.concurrency.Tid, int) (
_param_1=42, tid=...) at /opt/dmd-2.071/import/std/concurrency.d:605
#4 0x000000000051b027 in vibe.core.concurrency.send!(int).send(vibe.core.task.Task, int) (
_param_1=42, task=...)
at /home/user/.dub/packages/vibe-d-0.7.30/vibe-d/source/vibe/core/concurrency.d:1239
#5 0x0000000000517b6b in app._staticCtor1() () at /tmp/test/source/app.d:11
...
- Как можно предотвратить segfault? Есть ли проверка функций отправки? Как это можно исправить в vibe.d или phobos2?
- Это ошибка в vibe.d или phobos2?
1 ответ
Решение
Task
имеет running
свойство, которое вы могли бы использовать. Я считаю, что это предполагаемое поведение, так как обработка ошибок обычно должна выполняться на уровне приложения, а не на уровне библиотеки.
import std.stdio;
import core.thread;
import vibe.core.core;
import vibe.core.concurrency;
static this() {
Task t = runTask({
writeln("Hi");
});
t.join;
if (t.running) {
t.send(42);
}
writeln("Bye");
}