comp.lang.ada
 help / color / mirror / Atom feed
From: Ada BRL <ada.brl.2011@gmail.com>
Subject: Re: Interrupts handling in ADA
Date: Tue, 13 Dec 2011 05:31:16 -0800 (PST)
Date: 2011-12-13T05:31:16-08:00	[thread overview]
Message-ID: <f9054b1c-0c03-4a17-9604-3b5344402c7d@da3g2000vbb.googlegroups.com> (raw)
In-Reply-To: jc3rrs$27sq$1@news.ett.com.ua

On 12 Dic, 03:19, a...@att.net wrote:
> --  Interrupts are not necessary. From you description a simple set of
> --  tasks is all that is needed.
> --
> --  This program outline uses three task to read three sockets and
> --  after pre-processing and verifing data (if needed) passes this
> --  data to a main task. The main task then can continue processing
> --  this data.
> --
> --  Exception handling is limited to Socket error which will cause
> --  that task to die and after reporting to the Main task. Then Main
> --  task uses the abort statement to kill other tasks.
> --
>
> with Ada.Text_IO ;
> with Interfaces ;
> with GNAT.Sockets ;
>
> use  Ada.Text_IO ;
> use  Interfaces ;
> use  GNAT.Sockets ;
>
> procedure v is
>
>   localhost : constant Inet_Addr_Type := Inet_Addr ( "127.0.0.1" ) ;
>   localport : constant Port_Type      := 16#FFF0# ;
>
>   task One is
>       entry Start ; -- to insure network is operational
>   end One ;
>
>   task Two is
>       entry Start ;
>   end Two ;
>
>   task Three is
>       entry Start ;
>   end Three ;
>
>   task Main is
>       --  accept data from first two tasks.
>
>       entry Acknowledge_1 ( Data : Unsigned_32 ) ;
>       entry Acknowledge_2 ( Data : Unsigned_32 ) ;
>
>       --  accept data from third task only
>
>       entry Control ( Data : Character ) ;
>
>       --  denotes that network exception has ocurred from one of
>       --  the three tasks. The ( 1 .. 3 ) sets a range for
>       --  identifing the calling task. Where ( 1 ) is task One,
>       --  ( 2 ) is task Two and ( 3 ) is task Three.
>
>       entry Dead ( 1 .. 3 ) ;
>   end Main ;
>
>   --
>   --  Task bodies
>   --
>   task body One is
>
>       Socket  : Socket_Type    ;
>       Address : Sock_Addr_Type ;
>       Channel : Stream_Access  ;
>
>       Data    : Unsigned_32 ;
>
>   begin
>     -- Initialize Sockect
>
>     Create_Socket ( Socket, Family_Inet, Socket_Datagram ) ;
>     Address.Addr := localhost ;
>     Address.Port := localport + 1 ;
>     Connect_Socket ( Socket, Address ) ;
>     Channel := Stream ( Socket ) ;
>
>     accept Start ;
>
>         -- Wait for controller to activate
>         loop
>
>           -- Wait for data.
>
>           Unsigned_32'Read ( Channel, Data ) ;
>
>           -- Verify or Pre-process data, if needed
>
>           -- Send data to main task.
>
>           Main.Acknowledge_1 ( Data ) ;
>         end loop ;
>
>   exception
>     when Socket_Error =>
>         if Main'Callable then
>           Main.Dead ( 1 ) ;
>         end if ;
>         Close_Socket ( Socket ) ;
>   end One ;
>
>   task body Two is
>
>       Socket  : Socket_Type    ;
>       Address : Sock_Addr_Type ;
>       Channel : Stream_Access  ;
>
>       Data    : Unsigned_32 ;
>
>   begin
>     -- Initialize Sockect
>
>     Create_Socket ( Socket, Family_Inet, Socket_Datagram ) ;
>     Address.Addr := localhost ;
>     Address.Port := localport + 2 ;
>     Connect_Socket ( Socket, Address ) ;
>     Channel := Stream ( Socket ) ;
>
>     accept Start ;
>
>         -- Wait for controller to activate
>         loop
>
>           -- Wait for data.
>
>           Unsigned_32'Read ( Channel, Data ) ;
>
>           -- Verify or Pre-process data, if needed
>
>           -- Send data to main task.
>
>           Main.Acknowledge_2 ( Data ) ;
>         end loop ;
>
>   exception
>     when Socket_Error =>
>         if Main'Callable then
>           Main.Dead ( 2 ) ;
>         end if ;
>         Close_Socket ( Socket ) ;
>   end Two ;
>
>   task body Three is
>
>       Socket  : Socket_Type    ;
>       Address : Sock_Addr_Type ;
>       Channel : Stream_Access  ;
>
>       Data    : Character ;
>
>   begin
>     -- Initialize Sockect
>
>     Create_Socket ( Socket, Family_Inet, Socket_Datagram ) ;
>     Address.Addr := localhost ;
>     Address.Port := localport + 3 ;
>     Connect_Socket ( Socket, Address ) ;
>     Channel := Stream ( Socket ) ;
>
>     accept Start ;
>
>         -- Wait for controller to activate
>         loop
>
>           -- Wait for data.
>
>           Character'Read ( Channel, Data ) ;
>
>           -- Verify or Pre-process data, if needed
>
>           -- Send data to main task.
>
>           Main.Control ( Data ) ;
>         end loop ;
>
>   exception
>     when Socket_Error =>
>         if Main'Callable then
>           Main.Dead ( 3 ) ;
>         end if ;
>         Close_Socket ( Socket ) ;
>   end Three ;
>
>   --
>   --  Main Task body
>   --
>   task body Main is
>
>     Task_1_Data : Unsigned_32 ;
>     Task_2_Data : Unsigned_32 ;
>     Task_3_Data : Character ;
>     --
>     Task_Error : exception ;
>
>   begin
>     -- preform any initialize
>     loop
>       select
>         accept Acknowledge_1 ( Data : Unsigned_32 ) do
>           Task_1_Data := Data ;
>           -- process data from task 1
>         end Acknowledge_1 ;
>       or
>         accept Acknowledge_2 ( Data : Unsigned_32 ) do
>           Task_2_Data := Data ;
>           -- process data from task 2
>         end Acknowledge_2 ;
>       or
>         accept Control ( Data : Character ) do
>           Task_3_Data := Data ;
>           -- process data from task 3
>         end Control ;
>       or
>         accept Dead ( 1 ) ;
>           Put_Line ( "Error has ocurred in Task One" ) ;
>           raise Task_Error ;
>       or
>         accept Dead ( 2 ) ;
>           Put_Line ( "Error has ocurred in Task Two" ) ;
>           raise Task_Error ;
>       or
>         accept Dead ( 3 ) ;
>           Put_Line ( "Error has ocurred in Task Three" ) ;
>           raise Task_Error ;
>       end select ;
>
>       -- Continue processing with Data from all tasks
>
>     end loop ;
>
>   exception
>     when Task_Error =>
>       Put_Line ( "Error has cause this program to die" ) ;
>        -- abort all tasks
>       abort One ;
>       abort Two ;
>       abort Three ;
>   end Main ;
>
> --
> -- The Main task could start the three child task
> --
>
> begin
>
>   -- Verify all task are operational
>
>   if not One'Callable then
>     Put_Line ( "Error in Task One" ) ;
>     abort Two ;
>     abort Three ;
>     abort Main  ;
>
>   elsif not Two'Callable then
>     Put_Line ( "Error in Task Two" ) ;
>     abort One ;
>     abort Three ;
>     abort Main  ;
>
>   elsif not Three'Callable then
>     Put_Line ( "Error in Task Three" ) ;
>     abort One ;
>     abort Two ;
>     abort Main  ;
>
>   else
>     One.Start ;
>     Two.Start ;
>     Three.Start ;
>   end if ;
>
> exception
>   when others =>
>     null ;
> end v ;
>
> In <30143086.6.1323549838421.JavaMail.geo-discussion-forums@vbbfq24>, "Ada @ BRL" <ada.brl.2...@gmail.com> writes:
>
>
>
>
>
>
>
> >Hello,
> >I'm an Erasmus student at the University of Bristol - UK and I'm carrying out the work for my master thesis in Computer Engineering.
>
> >I'm programming a multithreading application in C / C++ and ADA.
> >The latter is a completely new language for me...
>
> >The environment of ADA applcation is:
> >I have 4 tasks that execute at the same time:
> >one is the main task,
> >the other three execute a "read" from network (socket) function inside their bodies (on the other side there's the C/C++ application with 3 network sockets).
> >[I decided to use the sockets instead of dll/lib import because this approach hasn't worked... =( ]
>
> >I want that when new data is available on one or more socket threads, this / these threads somehow notify the main thread that data is arrived and then safely send the data to it.
>
> >I've thought to use the interrupts...because I haven't found any references about the use of "events" in ADA.
> >I've thought to attach three different handler of interrupts into the main task and then to generate the interrupt from the socket task with ada.interrupts.signal.generate_interrupt.
> >Socket 1 will generate interrupt #1, socket 2 -> interrupt #2 and so on.
>
> >May you tell me please if this is the right way to face the problem?
> >I'm not skilled in ada and so there could be other better methods...
>
> >I've used the pragmas attach_handler and interrupt_handler but unfortunately I'm still not able to get all the stuff working...
>
> >I think it's a problem of ADA implementation because:
> >even if I call pragma unreserve_all_interrupts I've found that the function Is_Reserved(Interr_ID) returns FALSE only for this signals IDs: 2(SIGINT), 4(SIGILL), 8(SIGFPE), 11(SISEGV), 15(SIGTERM), 22(SIGABRT).
>
> >I guess that this is the opposite behaviour as I expected...
> >If I try to set an handler to the interrupt say 9, the program cannot start due to this error:
>
> >raised PROGRAM_ERROR : adjust/finalize raised PROGRAM_ERROR: s-interr.adb:343 explicit raise
>
> >If I call the function Is_Attached the program suddenly exits:
> >Program exited with code 01.
> >(gdb)
>
> >Do you know if is it possible to generate user defined interrupts?
>
> >Can you help me please to find out what's the problem?
> >Unfortunately there's not so much documentation about ADA  =( and I'm late for my thesis...
>
> >Thank you very much in advance for your help,
> >Ada @ BRL

Thank you for your complete example!



      parent reply	other threads:[~2011-12-13 13:33 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-10 20:43 Interrupts handling in ADA Ada @ BRL
2011-12-10 21:13 ` Vinzent Hoefler
2011-12-10 22:09 ` Niklas Holsti
2011-12-10 22:27 ` Simon Wright
2011-12-11 20:21   ` Martin Dowie
2011-12-13 13:51     ` Ada BRL
2011-12-13 23:18       ` Martin Dowie
2011-12-13 14:11     ` Niklas Holsti
2011-12-13 14:54       ` Simon Wright
2011-12-13 15:06         ` Ada BRL
2011-12-13 21:49           ` Niklas Holsti
2011-12-13 23:18       ` Martin Dowie
2011-12-13 12:47   ` Ada BRL
2011-12-13 15:07     ` Simon Wright
2011-12-13 15:23       ` Ada BRL
2011-12-13 18:14         ` Simon Wright
2011-12-13 18:56           ` Ada BRL
2011-12-13 19:56           ` Bill Findlay
2011-12-13 22:15         ` Niklas Holsti
2011-12-13 15:34       ` Simon Wright
2011-12-13 17:55         ` Ada BRL
2011-12-13 18:18           ` Dmitry A. Kazakov
2011-12-13 19:01             ` Ada BRL
2011-12-13 19:58               ` Dmitry A. Kazakov
2011-12-13 18:24           ` Simon Wright
2011-12-11  0:15 ` Jeffrey Carter
2011-12-13 12:53   ` Ada BRL
2011-12-11  9:23 ` Dmitry A. Kazakov
2011-12-13 13:11   ` Ada BRL
2011-12-13 14:04     ` Dmitry A. Kazakov
2011-12-13 14:51       ` Ada BRL
2011-12-13 15:02         ` Ada BRL
2011-12-13 15:39         ` Dmitry A. Kazakov
2011-12-13 18:51           ` Ada BRL
2011-12-13 19:51             ` Dmitry A. Kazakov
2011-12-13 23:32             ` georg bauhaus
2011-12-11 12:04 ` Georg Bauhaus
2011-12-13 14:08   ` Ada BRL
2011-12-12  3:19 ` anon
2011-12-12  9:12   ` Niklas Holsti
2011-12-13 13:36     ` Ada BRL
2011-12-12 15:23   ` björn lundin
2011-12-13 13:38     ` Ada BRL
2011-12-13 13:56       ` Ludovic Brenta
2011-12-13 14:10         ` Ada BRL
2011-12-13 13:31   ` Ada BRL [this message]
replies disabled

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