I think I figured it out. After the exception is thrown, the destructor for
the StemHandler variable gets invoked, which ends up making a call to
several APIs while in the state where the kernel semaphore is held. This
acquires, and then releases the semaphore, which has the effect that the
ApiContext ends up not releasing the semaphore when invoked because it
doesn't believe it is holding it. This looks like a Windows bug or compiler
bug to me, because the destructors are getting invoked out of order. That
is, the StemHandler destructor appears to be invoked BEFORE the ApiContext
one for the ThrowException2() call. We may need to continue to rely on
using the RaiseExceptionX calls.

Rick

On Fri, Nov 20, 2020 at 9:03 AM Erich Steinböck <erich.steinbo...@gmail.com>
wrote:

> This is Windows-only.
> But it also seems to be SysFileTree-specific - see below code sample.
>
> ~~~
> i = 1
> start:
>   signal on syntax
>   select case i
>     when 1 then call SysGetKey "z"
>     when 2 then call SysSearchPath "PATH", "%", "z"
>     when 3 then call SysFileSearch "%", "%", f., "z"
>     when 4 then call SysFileTree "%", f., "z"
>     when 5 then call SysFileTree "", f.
>     otherwise exit
>   end
>   say "no SYNTAX"
>   syntax:
>   signal off syntax
>   say condition("object")~code condition("object")~message
>   i += 1
>
>   m = ""~start("LENGTH")
>   r = m~result
> signal start
> ~~~
>
> On Fri, Nov 20, 2020 at 1:08 PM Rick McGuire <object.r...@gmail.com>
> wrote:
>
>> I suspected it would. I'm not sure what's going on here. The destructor
>> for ApiContext in the ThrowException2 stub is supposed to release the
>> kernel semaphore when an exception is thrown, then when the exception is
>> caught in NativeActivation, the semaphore is reacquired. Somehow, the
>> semaphore is ending up as a nested request, such that the main thread ends
>> up holding on to it forever. I've traced this process in the debugger, and
>> everything is happening as suspected, but somehow the mutex is still messed
>> up. Does this fail on any other platforms, or is it just a Windows problem?
>>
>> Rick
>>
>> On Fri, Nov 20, 2020 at 5:58 AM Erich Steinböck <
>> erich.steinbo...@gmail.com> wrote:
>>
>>> Replacing ThrowException2 with RaiseException2 in nullStringException()
>>> in RexxUtilCommon.hpp makes this piece of code work again.
>>>
>>> On Fri, Nov 20, 2020 at 10:34 AM Erich Steinböck <
>>> erich.steinbo...@gmail.com> wrote:
>>>
>>>> isolate the problem to a single test
>>>>>
>>>> OK, this piece of code reproduces the hang - both on 32- and 64-bit
>>>> Windows
>>>>
>>>> ~~~
>>>> signal on syntax
>>>> call SysFileTree "", f.
>>>> syntax:
>>>>
>>>> m = ""~start("HELLO")
>>>> r = m~result
>>>> ~~~
>>>>
>>>> _______________________________________________
>>> Oorexx-devel mailing list
>>> Oorexx-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/oorexx-devel
>>>
>> _______________________________________________
>> Oorexx-devel mailing list
>> Oorexx-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/oorexx-devel
>>
> _______________________________________________
> Oorexx-devel mailing list
> Oorexx-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/oorexx-devel
>
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to