danvratil / qcoro

C++ Coroutines for Qt
https://qcoro.dvratil.cz
MIT License
331 stars 53 forks source link

QCoroSignal crashes #167

Closed jmiturasolutions closed 1 year ago

jmiturasolutions commented 1 year ago

When using QCoroSignalListener in following code I am getting crash:

struct Payload {
    QString someData;
};

struct Message {
    int id = 0;
    Payload payload;
};

class DeMux : public QObject {
    Q_OBJECT
public:
    void send(const Message &msg)
    {
        emit messageReceived(msg);
    }

    Q_SIGNAL void messageReceived(const Message &msg);

    QCoro::Task<Payload> waitForMessage(int id)
    {
        QCORO_FOREACH(Message msg, qCoroSignalListener(this, &DeMux::messageReceived)) {
            if (msg.id == id) {
                co_return msg.payload;
            }
        }
        co_return {};
    }
};

Q_DECLARE_METATYPE(Message);

int main()
{
    Message msg1 {
        .id = 1,
        .payload = { .someData = "msg1" }
    };
    Message msg2 {
        .id = 2,
        .payload = { .someData = "msg2" }
    };
    DeMux demux;
    QCoro::Task<> task = [&]() -> QCoro::Task<> {
        auto wait1 = demux.waitForMessage(1);
        auto wait2 = demux.waitForMessage(2);
        demux.send(msg1);
        demux.send(msg2);
        co_await wait1;
        co_await wait2;
    }();
    QCoro::waitFor(task);
    return 0;
}

Issue is not isolated to QCoroSignalListener. Same happens if I replace impl with plain QCoroSignal:

QCoro::Task<Payload> waitForMessage(int id)
{
    while (true) {
        Message msg = co_await qCoro(this, &DeMux::messageReceived);
        if (msg.id == id) {
            co_return msg.payload;
        }
    }
    co_return {};
}

I am on Windows 10 x64 using VS2019 with QCoro 0.8.0 and Qt 5.15.6.