Nop, your analysis is correct. The return value (if is exists) is also a
potential memory leak. This probably doesn't show up as a problem because
the RoutineObjects take up a fairly substantial amount of memory.
Rick
On Wed, Jun 26, 2013 at 2:32 PM, Mark Miesfeld <miesf...@gmail.com> wrote:
> Thanks Rick.
>
> I started writing a reply based on my experiences so far, but I know you
> could explain it better.
>
> I have one question based on Rony's code:
>
> void executeProgram(RexxThreadContext *threadContext, char *fname, char
> *code)
> {
> RexxRoutineObject rro=threadContext->NewRoutine(fname, code,
> (size_t) strlen(code));
> RexxObjectPtr rop=threadContext->CallRoutine(rro, NULL); //
> call the program without args
> threadContext->ReleaseLocalReference(rro);
> }
>
> In the above, he is not releasing rop, which would be the returned object
> from CallRoutine(). But only releasing rro seemed sufficient in his case
> to solve the problem.
>
> rop will also have a local reference won't it. And also be stored in
> table of local references. That should also have a release shouldn't it?
> Each iteration in the loop will return a new Rexx object from called
> routine won't it? Or is there some reason why rop is not set with a local
> reference?
>
> --
> Mark Miesfeld
>
>
>
> On Wed, Jun 26, 2013 at 11:19 AM, Rick McGuire <object.r...@gmail.com>wrote:
>
>> The interpreter knows nothing about any of the references you have in
>> your C code. Those are just normal pointers, so nothing happens to let the
>> interpreter know that those pointers are out-of-context. The only
>> mechanism the interpreter has available is the context object used to
>> provide the api access. That context object will keep a reference to all
>> objects returned from API calls (e.g. a "local reference"). These objects
>> are thus protected from garbage collection until the context is destroyed.
>> Method, call, and exit contexts are destroyed when you return from the
>> appropriate call out. Thread contexts for attached threads will be
>> destroyed when you detach the thread. The main thread context obtained by
>> creating an interpreter instance will only be destroyed when the instance
>> is destroyed.
>>
>> For most uses, you generally don't need to bother with releasing this.
>> When you return from the method/call/exit, the references will be released
>> automatically. However, if you are creating large numbers of objects (for
>> example, in a loop), you probably should consider releasing the references.
>> The situation you raised originally is a good example, since you were
>> causing a memory leak by never releasing the references for the objects you
>> no longer needed.
>>
>> Mark Miesfeld ran into a situation with his sql lite implementation. In
>> his situation, he was creating a large number of string objects and adding
>> them to a collection object. All of the objects he was creating were added
>> to the collection, so none of them were eligible for collection, but Mark
>> started running into memory issues because the table used to keep all of
>> the local references grew to an enormous size. The solution here was to
>> release the local references after they were added to the collection. Not
>> because the objects were no longer needed, but because the local C
>> reference to the was no longer needed.
>>
>> Rick
>>
>>
>> On Wed, Jun 26, 2013 at 1:52 PM, Rony G. Flatscher <
>> rony.flatsc...@wu.ac.at> wrote:
>>
>>> This question may be of interest for other developers as well, so
>>> moving/asking it to the ooRexx
>>> developer list:
>>>
>>> While experimenting with a little C++ program, there would be a
>>> RexxRoutineObject created using
>>> NewRoutine() which then got executed with CallRoutine() many thousand
>>> times. While doing so memory
>>> consumption constantly increased, even when placing the two statements
>>> in a function of their own.
>>> Therefore I thought there was a memory leak in ooRexx and filed a bug,
>>> which was invalid.
>>>
>>> The solution Rick pointed at was to use DeleteLocalReference() on the
>>> RexxRoutineObject such that it
>>> can be garbage collected, and in effect, this solves the problem!
>>>
>>> ---
>>>
>>> So far, I have been thinking, that if any RexxObject went out of scope
>>> (of a block, of a function)
>>> it got automatically released for the garbage collector.
>>>
>>> Under which conditions must/should one use ReleaseLocalReference() ?
>>>
>>> ---rony
>>>
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> This SF.net email is sponsored by Windows:
>>>
>>> Build for Windows Store.
>>>
>>> http://p.sf.net/sfu/windows-dev2dev
>>> _______________________________________________
>>> Oorexx-devel mailing list
>>> Oorexx-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/oorexx-devel
>>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> This SF.net email is sponsored by Windows:
>>
>> Build for Windows Store.
>>
>> http://p.sf.net/sfu/windows-dev2dev
>> _______________________________________________
>> Oorexx-devel mailing list
>> Oorexx-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/oorexx-devel
>>
>>
>
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by Windows:
>
> Build for Windows Store.
>
> http://p.sf.net/sfu/windows-dev2dev
> _______________________________________________
> Oorexx-devel mailing list
> Oorexx-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/oorexx-devel
>
>
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel