comp.lang.ada
 help / color / mirror / Atom feed
From: Reto Buerki <reet@codelabs.ch>
Subject: Interrupt handler and Ada.Real_Time.Timing_Events
Date: Fri, 15 May 2009 18:26:12 +0200
Date: 2009-05-15T18:26:12+02:00	[thread overview]
Message-ID: <guk532$u44$1@news.motzarella.org> (raw)

Hi,

I hit a rather strange issue today mixing signal/interrupt handling with
Ada.Real_Time.Timing_Events. We have a real life application where we
use timing events but we also need a signal handler to catch signals
from the environment (SIGTERM etc.).

I wrote a small reproducer to illustrate the problem. The following
protected object is used as an interrupt handler, which can be attached
to a specific interrupt/signal:

with Ada.Interrupts;

package Handlers is

   protected type Signal_Handler (Signal : Ada.Interrupts.Interrupt_ID)
   is
      pragma Interrupt_Priority;

      entry Wait;
   private
      procedure Handle_Signal;
      pragma Attach_Handler (Handle_Signal, Signal);

      Occured : Boolean := False;
   end Signal_Handler;

end Handlers;

package body Handlers is

   protected body Signal_Handler is
      procedure Handle_Signal is
      begin
         Occured := True;
      end Handle_Signal;

      entry Wait when Occured is
      begin
         if Wait'Count = 0 then
            Occured := False;
         end if;
      end Wait;
   end Signal_Handler;

end Handlers;

The handler is used like this:

with Ada.Text_IO;
with Ada.Interrupts.Names;

--  Uncommenting the next line breaks interrupt handler
--  with Ada.Real_Time.Timing_Events;

with Handlers;

procedure Interrupt_Problem is
   use Ada.Interrupts;

   Handler : Handlers.Signal_Handler (Signal => Names.SIGTERM);
begin

   if Is_Attached (Interrupt => Names.SIGTERM) then
      Ada.Text_IO.Put_Line ("Attached handler to SIGTERM");
   else
      Ada.Text_IO.Put_Line ("Could not attach to SIGTERM!");
      return;
   end if;

   Handler.Wait;
   Ada.Text_IO.Put_Line ("Interrupt received ...");

end Interrupt_Problem;

As expected, when sending SIGTERM to the running 'Interrupt_Problem'
process "Interrupt received ..." is displayed. So far so good.

As commented in the source code, as soon as the
Ada.Real_Time.Timing_Events package is with'ed, this mechanism breaks.

The signal handler is not invoked any more when I send a SIGTERM signal
to a running 'Interrupt_Problem' process, it just terminates without
triggering the Handler.Wait.

What could be the cause for this behavior? Is there a problem with this
code?

Thanks in advance!
- reto



             reply	other threads:[~2009-05-15 16:26 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-15 16:26 Reto Buerki [this message]
2009-05-15 16:54 ` Interrupt handler and Ada.Real_Time.Timing_Events Adam Beneschan
2009-05-15 23:24   ` Reto Buerki
2009-05-15 16:56 ` Ludovic Brenta
2009-05-15 23:24   ` Hibou57 (Yannick Duchêne)
2009-05-16  0:20   ` Reto Buerki
2009-05-16  0:38     ` Jeffrey R. Carter
2009-05-29 15:59       ` Reto Buerki
2009-05-16  6:28 ` sjw
2009-05-16 11:05 ` Timing Example was " anon
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox