On Monday, 13 September 2021 at 17:18:30 UTC, eugene wrote:
Then after pressing ^C (SIGINT) the program gets SIGSEGV, since references to sg0 and sg1 are no longer valid (they are "sitting" in epoll_event structure).

engine/ecap.d(54): Error: field `EpollEvent.es` cannot assign to misaligned pointers in `@safe` code engine/ecap.d(56): Error: cannot take address of local `e` in `@safe` function `registerEventSource`

from adding @safe to ecap.EventQueue.registerEventSource, and then from using a @trusted block to silence the first complaint.

Instead of using a temporary EpollEvent array in EventQueue.wait, you could make the array an instance variable and have registerEventSource populate it directly, so that the GC can always trace from this array to an EnventSource.

... however, I don't think this fixes your problem, or is your only problem, since the segfault's still observed when this memory is leaked:

```d
    void registerEventSource(EventSource es) {
        import core.memory : pureMalloc, GC;

        auto p = cast(EpollEvent*) pureMalloc(EpollEvent.sizeof);
        p.event_mask = 0;
        p.es = es;
        GC.addRoot(p);
        int r = epoll_ctl(id, EPOLL_CTL_ADD, es.id, p);
        assert(r == 0, "epoll_ctl(ADD) failed");
    }
```

Reply via email to