Crashes in Java_sun_lwawt_macosx_LWCToolkit_stopAWTRunLoop (called with NULL argument)
Hendrik Schreiber
hs at tagtraum.com
Tue Sep 2 07:58:10 UTC 2014
On Aug 29, 2014, at 23:39, Michael Hall <mik3hall at gmail.com> wrote:
> On Aug 29, 2014, at 7:45 AM, Hendrik Schreiber <hs at tagtraum.com> wrote:
>
>> public void exit() {
>> if (!isOwned()) {
>> throw new IllegalMonitorStateException();
>> }
>> LWCToolkit.stopAWTRunLoop(awtRunLoopMediator);
>> awtRunLoopMediator = 0;
>> }
>
> What does isOwned() do?
It's defined in the superclass, Mutex.
> Doesn't it ensure that clearing the loop mediator is only done by the owning thread? If some other thread successfully runs through exit doesn't it mean this is not working correctly?
>
[...]
> Wouldn't it be simpler and safer to fix it in the JNI?
> if (mediatorObject) CFRelease(mediatorObject);
That's certainly also possible, but it also does not solve the issue completely.
The underlying problem is that exit() shouldn't be called more than once in the first place. My suggestion for improving the sun.lwawt.macosx.CToolkitThreadBlockedHandler code were only aimed at programmatically enforcing the implicit contract. It does not solve the problem that causes the issue.
I have created a test case and tried to explain what the problem is in http://mail.openjdk.java.net/pipermail/awt-dev/2014-September/008425.html hoping that AWT folks provide some input. AWT, because the class that calls exit() twice is a class shared between all platforms. It would be shortsighted to try to "fix" this only for OS X.
-hendrik
More information about the macosx-port-dev
mailing list