From: Anh Vo <anhvofrcaus@gmail.com>
Subject: Re: Timing_Events: Event time still set after Cancel_Handler
Date: Mon, 14 Sep 2009 14:20:00 -0700 (PDT)
Date: 2009-09-14T14:20:00-07:00 [thread overview]
Message-ID: <bc1894ba-375d-49ca-99e2-acf99787437e@b25g2000prb.googlegroups.com> (raw)
In-Reply-To: h8lq0s$cau$1@news.eternal-september.org
On Sep 14, 9:12 am, Reto Buerki <r...@codelabs.ch> wrote:
> Hi all,
>
> Before reporting a bug, I wanted to ask your opinion on this. Consider
> the following code:
>
> --
>
> with Ada.Real_Time.Timing_Events;
>
> package Timers is
>
> use Ada.Real_Time.Timing_Events;
>
> protected type Timer_Type is
> procedure Setup (At_Time : Ada.Real_Time.Time);
> function Get_Time return Ada.Real_Time.Time;
> procedure Stop (Status : out Boolean);
> private
> procedure Handle (Event : in out Timing_Event);
>
> Event : Timing_Event;
> end Timer_Type;
>
> end Timers;
>
> --
>
> package body Timers is
>
> protected body Timer_Type is
>
> function Get_Time return Ada.Real_Time.Time is
> begin
> return Event.Time_Of_Event;
> end Get_Time;
>
> procedure Handle (Event : in out Timing_Event) is
> begin
> null;
> end Handle;
>
> procedure Setup (At_Time : Ada.Real_Time.Time) is
> begin
> Event.Set_Handler (At_Time => At_Time,
> Handler => Handle'Access);
> end Setup;
>
> procedure Stop (Status : out Boolean) is
> begin
> Event.Cancel_Handler (Cancelled => Status);
> end Stop;
>
> end Timer_Type;
>
> end Timers;
>
> --
>
> with Ada.Text_IO;
> with Ada.Real_Time;
>
> with Timers;
>
> procedure Cancel_Handler is
> use Ada.Real_Time;
>
> Handler : Timers.Timer_Type;
> Timer : constant Time := Clock + Minutes (60);
> begin
> if Handler.Get_Time = Time_First then
> Ada.Text_IO.Put_Line ("Time is Time_First ...");
> end if;
>
> Handler.Setup (At_Time => Timer);
> if Handler.Get_Time = Timer then
> Ada.Text_IO.Put_Line ("Handler set ...");
> end if;
>
> declare
> Stopped : Boolean := False;
> begin
> Handler.Stop (Status => Stopped);
>
> if Stopped then
> Ada.Text_IO.Put_Line ("Timer cancelled ...");
> if Handler.Get_Time = Timer then
> Ada.Text_IO.Put_Line ("Why is the time still set then?");
> end if;
> end if;
> end;
>
> end Cancel_Handler;
>
> --
>
> The 'Timers' package provides a simple protected type 'Timer_Type' which
> basically just wraps an Ada.Real_Time.Timing_Events.Timing_Event type.
> The Setup() procedure can be used to set a specific event time.
>
> Stop() just calls the Cancel_Handler() procedure of the internal
> Timing_Event. This procedure 'clears' the event (if it is set).
>
> Ada RM D.15 about Real_Time.Timing Events states:
>
> 9/2 An object of type Timing_Event is said to be set if it is associated
> with a non-null value of type Timing_Event_Handler and cleared
> otherwise. All Timing_Event objects are initially cleared.
>
> 17/2 The procedure Cancel_Handler clears the event if it is set.
> Cancelled is assigned True if the event was set prior to it being
> cleared; otherwise it is assigned False.
>
> 18/2 The function Time_Of_Event returns the time of the event if the
> event is set; otherwise it returns Real_Time.Time_First.
>
> The RM does not explicitly state what happens with the event time value
> associated with a specific event after a call to Cancel_Handler(), but
> it seems logical to assume that Time_Of_Event should return Time_First
> again because no event is 'set' after it has been cleared (handler set
> to 'null').
>
> With FSF GNAT, only the event handler is cleared, the event time remains
> set. Tested with GNAT 4.3.2 and 4.4.1 on Debian Stable/SID.
>
> Could this be considered as a bug?
I say it is a bug because ARM 18/2 is violated.
Anh Vo
next prev parent reply other threads:[~2009-09-14 21:20 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-14 16:12 Timing_Events: Event time still set after Cancel_Handler Reto Buerki
2009-09-14 21:20 ` Anh Vo [this message]
2009-09-16 21:19 ` Reto Buerki
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox