Dmitry A. Kazakov wrote:
> On Tue, 17 Jun 2008 10:07:43 +0200, Reinert Korsnes wrote:
>
>> Assume the package definition given below,
>> and the follow code in my program:
>>
>> type Message_t;
>> type Message_ta is access Message_t;
>> package Message_Stack_p is new Stacks(Message_ta);
>> Send_Stack : Message_Stack_p.Stack;
>>
>> Question: How can I be sure that "Send_Stack" is empty
>> at the start of the program execution ?
>
> Hmm, "sure" in which sense? To make it visible for the reader? To
specify
> in the contract of Stack that it is initially empty?
Yes, yes, to make it visible for the reader.
>
> As for implementation you posted, the stack is empty, because instances
of
> access types are initialized with null (when not explicitly initialized
Yes, but I do not like things depend on the particular implementation :-)
> otherwise). Below you declare:
>
>> type Stack is access Cell;
>
> And
>
> Send_Stack : Message_Stack_p.Stack; -- This will be null = empty
>
>
> Now side comments:
>
> 1.
>
>> procedure Pop(S: in out Stack; X: out Item) is
>> begin
>> X := S.Value;
>> S := S.Next;
>> end;
>
> This is a memory leak. If you allocated a stack element on push, you
> should free it on pop.
How I free it? I may not have a deep enough understanding here :-)
>
> 2. Package initialization is achieved as follows:
>
> package body P is
> ...
> begin
> ... -- Initialize package stuff
> end P;
>
> 3. Package initialization cannot help you here, because the package
> declares an abstract data type of which objects can be created long
after
> the package itself was elaborated (initialized).
But I would like to make it clear for all that the stack is
empty at the start of my program ! (also after that I may
change the implementation).
>
> 4. You have messages. Pointers to messages. These pointers are copied
into
> dynamically allocated linked list called stack.
>
> How are you going to maintain this? Do you want to prevent messages from
> being copied? Then you should reconsider the design of messages allowing
> their queuing without stacks. Alternatively, do you want to copy
messages
> upon queueing (to marshal them)? Then the queue should deal with
> unconstrained objects:
>
> generic
> type Message (<>) is private;
> package Queue is
> ...
>
I want to "stack away" messages to be processed later.
Copied, deleted etc.
reinert


|