On Wed, Jul 20, 2022 at 12:35 PM Rony G. Flatscher <rony.flatsc...@wu.ac.at> wrote:
> On 20.07.2022 18:05, Rick McGuire wrote: > > When the instance is terminated, all object references are cleared out in > case there might be a dangling reference to the instance object that might > pin it in memory. This includes .local, which should not be pinned > anywhere. I spent fair about of time recently tracing the termination code > to fix #1734, so I know it's doing what it's supposed to be doing. > > I was going to suggest reverting your overrides before terminating the > instance. A more appropriate way to do that is to call the destination > method with no argument. > > Did that as the first strategy: calling destination until .nil gets > returned and then placing back the destination right before it. > > The monitor maintains a queue of the destination objects, so this will pop > your monitor off of the queue and revert to the previous destination. > > Yes. It is possible however that there are Rexx programmers who may put > another destination on top of it (hence popping the destinations until > getting to the very first one in the first attempts) hence using > destination until .nil got returned. (Then changed the logic to simply > remove the monitor objects from .local by replacing the monitor objects > with new ones that got configured like in the beginning which seems to work > as well.) > > The only other thing to comes to mind is that you are calling the > terminate API on the wrong thread or in the wrong circumstances (e.g., on > the correct thread but as the result of a callout from running oorexx > code). I know you tried doing the second one once before. Are you checking > the you are getting a true return value from the terminate call? > > Terminate() is defined to be void (from rexxapi.pdf): > > 1.17.187. Terminate > This API is available in context Instance. > // Method Syntax Form(s) > context->Terminate(); > Terminates the current Rexx interpreter instance. Terminate() may only be > called from the thread context that originally created the interpreter > instance. This call will wait for all threads to complete processing before > returning. > Arguments > None. > Returns > Void. > > When an instance gets created on the native side it will be stored in a > structure together with its Java peer (a jobj) and the Java object > representing the Rexx interpreter configuration used when creating the > instance (a jobj). That structure then gets placed on a simply linked list > on the native side. The Java side gets the context instance pointer > returned as a string rendering. > > In the use case of termination the native side gets that string, turns it > into a RexxInstance pointer and searches it in the linked list. If found it > gets used for invoking Terminate(), if not, then a Java exception gets > raised. > > At operating system thread in which Terminate() gets invoked: this is > controlled by Java (in this case by the cleaner of PhantomReferences). > That is probably your problem. Terminate() is getting called on the wrong thread so the instances are leaking. I've just been looking at the code, and I believe it should be possible to terminate an instance from another thread as long as there's nothing currently running on the initial thread. Rick > > ---rony > > > _______________________________________________ > 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