assert semantic change proposal
Sean Kelly via Digitalmars-d
digitalmars-d at puremagic.com
Wed Aug 6 12:34:47 PDT 2014
On Wednesday, 6 August 2014 at 18:15:41 UTC, David Bregman wrote:
> On Wednesday, 6 August 2014 at 17:18:19 UTC, Sean Kelly wrote:
>> So from a functional perspective, assuming this is a
>> multithreaded app, what should the procedure be when an
>> AssertError is thrown in some thread?
>
> afaik, AssertError works the same as any other exception. If it
> reaches the top without being handled, then the entire app will
> be terminated including all the other threads.
Except that's not really how unhandled exceptions are treated in
threads. They're stored by the thread and (optionally) re-thrown
in the context of whatever thread calls join, if any thread calls
join at all. The assumption at the time was that the joining
thread cared about the state of the thread being joined and so
re-throwing the exception was a way to communicate the error to
the most interested party.
So if the main thread joins a thread that terminated with an
unhandled AssertError, the error will be re-thrown in the context
of the main thread, which will in turn join all remaining running
threads and wait for them to complete. This is the same behavior
as if an AssertError is generated during normal processing of the
main thread. But in neither case is the application forcibly
terminated when an assertion failure occurs.
So again, my question is twofold: what *should* happen, given
this new treatment for assertions, and then *how* will we
accomplish this? A multithreaded process is really pretty much
equivalent to a bunch of standalone processes with shared memory.
There is no facility for forcing a clean termination of another
thread. The best I can think of would be to assume that
std.concurrency is being used for multithreading and sort things
out similar to the existing LinkTerminated signaling, but looking
for a reasonable solution within Druntime would be tricky.
More information about the Digitalmars-d
mailing list