Externals and Memory Leaks???

Dave dave at looktowindward.com
Thu May 24 12:40:01 EDT 2007


Hi Chris,

Thanks for the information, but I'm a bit confused! In the RunRev  
script I have the following code:

local myBuffer
local myNewData

repeat until <some_condition>
  get XGetData("myTempData")
XProcessData(myTempData,"myNewData")
end repeat

In my externals I allocate a new buffer each time it's called, should  
I check if the variable already has something allocated to it and  
free it if so? I am guessing this is what you mean when you say store  
the Allocations in a list? So before allocating a new buffer check if  
the variable has a buffer assigned and then free it if (and only if)  
it's in the list?

Thanks again
All the Best
Dave

On 24 May 2007, at 15:58, chris bohnert wrote:

> Dave,
>
> Yep..when you use SetVariableEx you're responsible for managing the  
> memory.
> Normally I handle this by building a SafeAlloc function in C or by  
> creating
> my own  new/delete in c++.
>
> This will let you store your allocs in a list and handle their  
> release as
> necessary.  In my experience, releasing only what I know I have  
> allocated is
> much safer than trying to free random memory blocks coming back  
> from rev.
>
> hope that helps.
>
> --
> cb
>
> On 5/24/07, Dave <dave at looktowindward.com> wrote:
>>
>> Hi All,
>>
>> I have a Stack that uses two functions from an external:
>>
>> XGetData("myTempData")
>> XProcessData(myTempData,"myNewData")
>>
>> XGetData() Gets the data into the correct format and stores it in the
>> RunRev variable "myTempData".
>>
>> XProcessData() takes the data in "myTempData", processes it and puts
>> the results into "myNewData".
>>
>> This all works well and produces good results, the only problem is
>> that memory seems to be leaking by quite a lot and the two data
>> buffers here are quite large.
>>
>> In the external, I use malloc() to allocate the buffers and then use
>> "SetVariableEx()" to pass it back to RunRev. My question is, who is
>> responsible for freeing the data?
>>
>> I am guessing that the on each subsequent call to the External
>> Functions causes a new block to be allocated and overwrites the
>> contents of the old RunRev "ExternalString" structure without first
>> freeing it. How should I handle this? Do I need to check if the
>> variable passed into my external already has data allocated and if so
>> either free or re-use the data (the block sizes are likely to be the
>> same).
>>
>> Any advice or help on this greatly appreciated.
>>
>> All the Best
>> Dave
>>
>> PS
>>
>> I set the External Variable using the following function:
>>
>>
>> OSStatus LTWLibraryUtilsSetExternalVariablePtr( char*
>> theVariableNamePtr,
>>                                                                       
>>                            const
>> char*                     theVariablePtr,
>>
>>                                                                       
>>                            long                             
>> theVariableSize)
>> {
>> ExternalString                          myExternalVariableInfo;
>> int                                                      
>> myRunRevStatus;
>>
>> //**
>> //**    Get the External Variable
>> //**
>> myExternalVariableInfo.buffer = theVariablePtr;
>> myExternalVariableInfo.length = theVariableSize;
>> SetVariableEx
>> (theVariableNamePtr,"",&myExternalVariableInfo,&myRunRevStatus);
>> if (myRunRevStatus == EXTERNAL_FAILURE)
>>         return(kRunRevVariableNotDefined);
>>
>> //**
>> //**    Good Return
>> //**
>> return(noErr);
>> }
>>
>> _______________________________________________
>> use-revolution mailing list
>> use-revolution at lists.runrev.com
>> Please visit this url to subscribe, unsubscribe and manage your
>> subscription preferences:
>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>
>>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your  
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution




More information about the use-livecode mailing list