From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,2968b7d68d1e26f4,start X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2004-01-03 11:01:04 PST Path: archiver1.google.com!news2.google.com!newsfeed2.dallas1.level3.net!news.level3.com!news-out.visi.com!petbe.visi.com!news.tele.dk!news.tele.dk!small.news.tele.dk!fr.ip.ndsoftware.net!proxad.net!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!pa112.osielsko.sdi.tpnet.pl!nobody From: TIlman Glotzner Newsgroups: comp.lang.ada Subject: gnat/linux:setitimer Date: Sun, 04 Jan 2004 03:52:42 +0900 Organization: ETAS Message-ID: <0e07tb.cha.ln@pa112.osielsko.sdi.tpnet.pl> Reply-To: Tilman.Gloetzner@etas.co.kr NNTP-Posting-Host: pa112.osielsko.sdi.tpnet.pl Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7Bit X-Trace: atlantis.news.tpi.pl 1073156483 16778 213.77.186.112 (3 Jan 2004 19:01:23 GMT) X-Complaints-To: usenet@tpi.pl NNTP-Posting-Date: Sat, 3 Jan 2004 19:01:23 +0000 (UTC) User-Agent: KNode/0.7.1 Xref: archiver1.google.com comp.lang.ada:4077 Date: 2004-01-04T03:52:42+09:00 List-Id: Hello, below my attempt to connect the linux system timer to an ada program. 1) In the process list, I see the program distributed over 5 processes. Each signal handler is mapped onto one process. One process is probably needed for the main program. On which part of the program are the other 2 processes mapped to ? 2) When the timer expires, the timer signal (SIGALRM) is not catched by the signal handler. The signal handlers itselves apparrently work as the handlers react to signals sent by a unix kill command. As process number I need to give the PID of the appropriate signal handler. I suspect that the signal is sent to the process that started the itimer. As the signal signal handlers run as separated processes, the SIGALRM signal issued from the itimer does not reach the signal handlers. What do I need to do to make it work ? 3) Is there a unix utility that allows me to monitor signals, i.e. which program issues which signal, and which program catches it ? 4) I first tried to import the system call "setitimer", and hand over setitimer's parameters by access types(ITimervalPtrs'address). The program also compiles if handing over the variables directly (not references to the variables). Is gnat/ada doing a parameter conversion to a reference implicitly for me ? Thank you, Tilman -------------------------------------------------------------- -- Filename: timer.ads -------------------------------------------------------------- with Type_Defs,System.Address_To_Access_Conversions,Ada.Interrupts.Names; use Type_Defs,Ada.Interrupts, Ada.Interrupts.Names; package Timer is -- Timers run in real time. ITIMER_REAL: constant := 0; -- Timers run only when the process is executing. ITIMER_VIRTUAL: constant := 1; -- Timers run when the process is executing and when -- the system is executing on behalf of the process. ITIMER_PROF: constant := 2; type T_Time is new Long_Integer; type T_Timeval is record Tv_Sec : T_Time; -- seconds Tv_Usec: T_Time; -- microseconds end record; type T_Itimerval is record It_Interval: T_Timeval; -- next value It_Value: T_Timeval; -- current Value end record; package TimevalPtrs is new System.Address_To_Access_Conversions( T_Timeval ); package ITimervalPtrs is new System.Address_To_Access_Conversions( T_Itimerval ); protected SignalHandler is -- SIGINT (Control-C) signals will be intercepted by -- HandleControlC procedure HandleControlPwrFail; pragma Attach_Handler( HandleControlPwrFail, SIGPWR ); -- Signal handler for SIGALARM issued from a timer procedure HandleAlarm; pragma Attach_Handler( HandleAlarm, SIGALRM ); end SignalHandler; procedure Setitimer(RC:out Integer; Which: in Integer ; Value: in out T_Itimerval; Ovalue: in out T_Itimerval); pragma Import (C,Setitimer); pragma Import_Valued_Procedure(Setitimer); end Timer; -------------------------------------------------------------- -- Filename: timer.adb -------------------------------------------------------------- with Timer, System.Address_To_Access_Conversions,Text_IO; use Timer,Text_Io; package body Timer is protected body SignalHandler is -- This protected type contains all our signal handlers procedure HandleAlarm is -- Alarm signal handler begin Put_Line( "HandleAlarm: ALARMSIG catched." ); end HandleAlarm; procedure HandleControlPwrFail is -- Power fail signal handler begin Put_Line( "HandleControlPwrFail activated by catched signal SIGPWR" ); end HandleControlPwrFail; end SignalHandler; end Timer; -------------------------------------------------------------- -- Filename: timer_test.adb -------------------------------------------------------------- with Text_Io,Timer,Ada.Interrupts,Ada.Interrupts.Names; use Text_Io,Timer,Ada.Interrupts,Ada.Interrupts.Names; procedure Timer_Test_B is Handler : Parameterless_Handler; Counter: Integer := 0; Timer: aliased T_Itimerval := ((0,10000),(0,10000)); OldTimer: aliased T_Itimerval := ((0,0),(0,0)); I: Integer := 20; begin Put_Line("Timer_Test"); Put_Line("=========="); Timer.It_Value.Tv_Sec := 0; Timer.It_Value.Tv_Usec := 100000; Timer.It_Interval.Tv_Sec := 0; Timer.It_Interval.Tv_Usec := 100000; if Is_Reserved( SIGALRM ) then Put_Line( "The ALARMSIG handler is reserved" ); else Put_Line( "The ALARMSIG handler isn't reserved" ); end if; if Is_Attached( SIGALRM ) then Put_Line( "The ALARMSIG handler is attached" ); else Put_Line( "The ALARMSIG handler isn't attached" ); end if; if Is_Reserved( SIGPWR ) then Put_Line( "The SIGPWR handler is reserved" ); else Put_Line( "The SIGPWR handler isn't reserved" ); end if; if Is_Attached( SIGPWR ) then Put_Line( "The SIGPWR handler is attached" ); else Put_Line( "The SIGPWR handler isn't attached" ); end if; New_Line; Put_Line( "Testing SIGALRM handler..." ); Handler := Current_Handler( SIGALRM ); -- Current_Handler gives a callback to the handler Handler.all; Put_Line( "End testing SIGALRM handler..." ); New_Line; Put_Line( "Testing SIGPWR handler..." ); Handler := Current_Handler( SIGPWR ); -- Current_Handler gives a callback to the handler Handler.all; Put_Line( "End testing SIGPWR handler..." ); New_Line; Put_Line("Timer parameters"); Put_Line("----------------"); Put_Line("Time.sec = " & Timer.It_Value.Tv_Sec'Img ); Put_Line("Time.usec= " & Timer.It_Value.Tv_Usec'Img ); Put_Line("Preset.sec = " & Timer.It_Interval.Tv_Sec'Img ); Put_Line("Preset.usec= " & Timer.It_Interval.Tv_Usec'Img ); New_Line; Put("Arming timer..."); Setitimer(I,ITIMER_REAL,Timer,OldTimer); -- ITimervalPtrs.To_Address(Timer'Unchecked_access), -- ITimervalPtrs.To_Address(OldTimer'Unchecked_Access)); Put_Line(" Timer armed."); New_Line; Put_Line("I := " & I'Img); while (Counter <= I) loop null; -- Counter := Counter + 1; -- delay(1.0); end loop; end Timer_Test_B; -- Tilman Gloetzner ETAS Korea Ltd, Seoul, Korea