Program crash: GC destroys an object unexpectedly
eugene
dee0xeed at gmail.com
Thu Sep 23 19:32:12 UTC 2021
On Thursday, 23 September 2021 at 18:53:25 UTC, Steven
Schveighoffer wrote:
> On 9/23/21 1:44 PM, eugene wrote:
>> Just a note: there is no 'signal handler' in the program.
>> SIGINT/SIGTERM are **blocked**, notifications (POLLIN) are
>> received via epoll_wait().
>
> Oh interesting! I didn't read the code closely enough.
"everything in Unix is a file" (c)
All event sources (sockets, timers, signal, file system events)
can be 'routed' through i/o multiplexing facilities, like
select/poll(posix)/epoll(linux)/queue(freebsd) etc.
>> Probably, a destructor for Signal class should be added, in
>> which
> Yes, I would recommend that. Always good for a destructor to
> clean up any non-GC resources that haven't already been cleaned
> up. That's actually what class destructors are for.
No, destructors are not necessary, since after SIGINT/SIRTERM
program is about to terminate and all resources will be
released anyway.
In C I do same way - do not close fd, which live from
start to end, do not free() pointers and so on, no need.
> So it gets written to the file descriptor instead?
When signal happens (or timer expires, or file is deleted)
process get EPOLLIN on corresponding file descriptor
via epoll_wait() and then process has to read some info
from these file descriptors.
> And nobody is there reading it, so it's just closed along with
> the process?
Yes, as any other file descriptor.
> I've not done signals this way, it seems pretty clever and less
> prone to asynchronous issues.
It's just great, thanks to Linux kernel developers.
Look in to engine dir in the source.
C (more elaborated) variant:
http://zed.karelia.ru/mmedia/bin/edsm-g2-rev-h.tar.gz
More information about the Digitalmars-d-learn
mailing list