Stack Switching Question
J. Landman Gay
jacque at hyperactivesw.com
Wed Oct 5 23:01:23 EDT 2005
Dave Cragg wrote:
>
> On 5 Oct 2005, at 21:04, Richard Gaskin wrote:
>
>> J. Landman Gay wrote:
>>
>>> Richard Gaskin wrote:
>>>
>>>> I used the file name form to illustrate another difference between
>>>> HC and Rev: while you would indeed need to open a stack in HC in
>>>> order to get stuff out of it, in Rev you can get property values of
>>>> objects in unopened stacks. When you do that the engine reads the
>>>> file into memory to access what's being requested; if the stack has
>>>> been accessed before it'll stay in memory (unless you turn on the
>>>> stack's destroyStack property), so subsequent accesses will be
>>>> lightning fast.
>>>>
>>> Just an addendum: Actually, I've been using this technique on
>>> multiple stacks, and found that once accessed, the stack stays open
>>> until you explicitly close it regardless of its destroystack
>>> settings. I found this out after I accessed data from a ton of
>>> external stacks and then discovered them all open later on. I had to
>>> specifically close them to remove them from RAM (their destroystack
>>> was true, so that did the trick.) If an accessed stack has its
>>> destroystack set to false, just closing it won't be enough, the
>>> script will have to delete it as well. (I know you already know
>>> that, Richard, just mentioning it for completeness.)
>>>
>>
>>
>> Actually I didn't know that. Is that a bug? It rather invalidates
>> the destroyStack property, no?
>>
>
> I think we could debate that one for a month or two. :-)
>
> I suppose the destroyStack is intended to apply when a stack is closed,
> and therefore has been explicitly opened earlier. Referencing an
> external stack isn't the same as opening it.
To me, it is like opening a stack invisibly without any system messages.
At least, that's how I think of it. Destroystack applies to referenced
stacks just as it does to stacked opened other ways -- when a script
closes them, they are removed from memory if that property is set to
true. Otherwise, a script must issue a "delete stack" command to get rid
of it.
>
> Like Jacque, I've been caught out with stacks in memory when I'd long
> forgotten about. However, one practical problem for the engine to
> overcome would be to determine when it should purge the stack.
> Typically, when I reference an external stack, I'm likely to make a few
> references to it within a handler. Having to reload the stack for each
> reference could introduce an overhead. (Perhaps referenced stacks
> should be purged when any currently running handlers finish.)
>
> Meanwhile, I try to remember to specifically delete each externally
> referenced stack.
After some thought, I think the current implementation is correct.
Destroystack doesn't (and shouldn't) control whether or not a stack
closes, it just manages the stack's behavior when it does close.
In my situation, I sometimes need to refer to a stack repeatedly across
handlers, and other times only need it once. I don't think I want the
engine deciding for me when the stack should close, I'd rather control
that myself. As long as I know that referencing a stack loads it into
memory, closing it later at my convenience isn't a problem.
--
Jacqueline Landman Gay | jacque at hyperactivesw.com
HyperActive Software | http://www.hyperactivesw.com
More information about the use-livecode
mailing list