comp.lang.ada
 help / color / mirror / Atom feed
* Re: Device file not closing on close command
  2001-05-24 18:39 Device file not closing on close command Tilman Gloetzner
@ 2001-05-24 18:16 ` Pat Rogers
  2001-05-24 20:42 ` Ted Dennison
  1 sibling, 0 replies; 6+ messages in thread
From: Pat Rogers @ 2001-05-24 18:16 UTC (permalink / raw)


Procedure access_dev is the master of task TtyS2.  Since you never told
TtyS2 to quit it is still running, so access_dev can not complete.  Call the
"quit" entry after you call the "close" entry.

---
Patrick Rogers                       Consulting and Training in:
http://www.classwide.com          Real-Time/OO Languages
progers@classwide.com               Hard Deadline Schedulability Analysis
(281)648-3165                                 Software Fault Tolerance


"Tilman Gloetzner" <Tilman.Gloetzner@uundz.de> wrote in message
news:3B0D5544.ED114B7E@uundz.de...
> Hi,
>
> the program below controls a task handeling a serial device. The task
> opens the device file, and 5 secs later the device file should be
> closed. When running the program below, the device is opened, but when
> the time comes to close the device the task just blocks on the
> closecommand. If I open and close the device from the main procedure it
> just works fine. The device is connected to a GPS receiver which is
> constantly sending data. I am using gnat 3.13 onlinux (2.1.18) and linux
> native threads.
>
> Why does the task block(is it because there is still unread data in the
> device -- but why would it work then if I open and close the device from
> the main procedure rather than from the task ?) ? How can I make the
> task close the file right away ?
>
>
> Thank you,
>
> Tilman
>
>
>
> ================== main =====================
> with Text_IO;use Text_IO;
> with Device;use Device;
>
> procedure access_dev is
>    TtyS2:   DevTask;
>    In_Stream: File_Type;
> begin
>    TtyS2.Open("/dev/ttyS2");
>    delay(5.0);
>    Put_Line("waited for 5 secs");
>    TtyS2.Close;
>
> end access_dev;
>
> =============== package specification ==============
> package Device is
>    task type DevTask is
>       entry Open(Dev:String);
>       entry Close;
>       entry Quit;
>    end DevTask;
> end Device;
> ============== package body =======================
> with Text_Io;use Text_Io;
> with Device; use Device;
> package body Device is
>       task body DevTask is
>          Exit_Flag: Boolean := False;
>          In_Stream: File_Type;
>          Buf:       String(1..82);
>          Noc:       Integer := 0;
>       begin
>          while (Exit_Flag = False) loop
>             select
>                accept Open(Dev:String) do
>                   Put_Line("Openening Device " & Dev );
>                   Open(In_Stream,IN_FILE, "/dev/ttyS2");
>                   Put_Line("Device opened");
>                end Open;
>             or
>                accept Close do
>                   --if (Is_Open(In_Stream)) then
>                      Put_Line("Closing Device");
>                      Close(In_Stream);
>                      Put_Line("Device closed");
>             --      end if;
>                end Close;
>             or
>                accept Quit do
>                   Exit_Flag := True;
>                end Quit;
>             or
>                delay(0.0);
> --               if (Is_Open(In_Stream)) then
>                    Get_Line(In_Stream,Buf,Noc);
>                    Put_Line(Buf(1..Noc));
> --               end if;
>             end select;
>          end loop;
>        Put_line("Task terminated");
>       end DevTask;
> end Device;
>





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Device file not closing on close command
@ 2001-05-24 18:39 Tilman Gloetzner
  2001-05-24 18:16 ` Pat Rogers
  2001-05-24 20:42 ` Ted Dennison
  0 siblings, 2 replies; 6+ messages in thread
From: Tilman Gloetzner @ 2001-05-24 18:39 UTC (permalink / raw)


Hi,
 
the program below controls a task handeling a serial device. The task
opens the device file, and 5 secs later the device file should be
closed. When running the program below, the device is opened, but when
the time comes to close the device the task just blocks on the
closecommand. If I open and close the device from the main procedure it
just works fine. The device is connected to a GPS receiver which is
constantly sending data. I am using gnat 3.13 onlinux (2.1.18) and linux
native threads.
 
Why does the task block(is it because there is still unread data in the
device -- but why would it work then if I open and close the device from
the main procedure rather than from the task ?) ? How can I make the
task close the file right away ?
 
 
Thank you,
 
Tilman                  



================== main =====================
with Text_IO;use Text_IO;
with Device;use Device;
 
procedure access_dev is
   TtyS2:   DevTask;
   In_Stream: File_Type;
begin
   TtyS2.Open("/dev/ttyS2");
   delay(5.0);
   Put_Line("waited for 5 secs");
   TtyS2.Close;
 
end access_dev;
 
=============== package specification ==============
package Device is
   task type DevTask is
      entry Open(Dev:String);
      entry Close;
      entry Quit;
   end DevTask;
end Device;
============== package body =======================
with Text_Io;use Text_Io;
with Device; use Device;
package body Device is
      task body DevTask is
         Exit_Flag: Boolean := False;
         In_Stream: File_Type;
         Buf:       String(1..82);
         Noc:       Integer := 0;
      begin
         while (Exit_Flag = False) loop        
            select
               accept Open(Dev:String) do
                  Put_Line("Openening Device " & Dev );
                  Open(In_Stream,IN_FILE, "/dev/ttyS2");
                  Put_Line("Device opened");
               end Open;
            or
               accept Close do
                  --if (Is_Open(In_Stream)) then
                     Put_Line("Closing Device");
                     Close(In_Stream);
                     Put_Line("Device closed");
            --      end if;
               end Close;
            or
               accept Quit do
                  Exit_Flag := True;
               end Quit;
            or
               delay(0.0);
--               if (Is_Open(In_Stream)) then
                   Get_Line(In_Stream,Buf,Noc);
                   Put_Line(Buf(1..Noc));
--               end if;
            end select;
         end loop;
       Put_line("Task terminated");
      end DevTask;
end Device;



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Device file not closing on close command
  2001-05-24 18:39 Device file not closing on close command Tilman Gloetzner
  2001-05-24 18:16 ` Pat Rogers
@ 2001-05-24 20:42 ` Ted Dennison
  2001-05-24 20:47   ` Ted Dennison
  1 sibling, 1 reply; 6+ messages in thread
From: Ted Dennison @ 2001-05-24 20:42 UTC (permalink / raw)


In article <3B0D5544.ED114B7E@uundz.de>, Tilman Gloetzner says...

>            select
..
>            or
>               delay(0.0);
..
>            end select;

I doubt this has much to do with your problem, but you should probably be using
an "else" rather than an "or delay 0.0".

---
T.E.D.    homepage   - http://www.telepath.com/dennison/Ted/TED.html
          home email - mailto:dennison@telepath.com



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Device file not closing on close command
  2001-05-24 20:42 ` Ted Dennison
@ 2001-05-24 20:47   ` Ted Dennison
  0 siblings, 0 replies; 6+ messages in thread
From: Ted Dennison @ 2001-05-24 20:47 UTC (permalink / raw)


In article <HmeP6.6910$r4.437943@www.newsranger.com>, Ted Dennison says...
>
>In article <3B0D5544.ED114B7E@uundz.de>, Tilman Gloetzner says...
>
>>            select
>..
>>            or
>>               delay(0.0);
>..
>>            end select;
>
>I doubt this has much to do with your problem, but you should probably be using
>an "else" rather than an "or delay 0.0".
..and you probably shouldn't be using either in a tight loop, like you are
doing here. That's a busy loop. It could be that your task is hogging all the
CPU in this busy loop, and is not giving your main task a chance to call the
Quit entry. But since it isn't higher priority, and delay is supposed to act as
a scheduling point, I'd be suprised if this was the problem.


---
T.E.D.    homepage   - http://www.telepath.com/dennison/Ted/TED.html
          home email - mailto:dennison@telepath.com



^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: Device file not closing on close command
@ 2001-05-24 21:06 Beard, Frank
  2001-05-25 22:30 ` Tilman Gloetzner
  0 siblings, 1 reply; 6+ messages in thread
From: Beard, Frank @ 2001-05-24 21:06 UTC (permalink / raw)
  To: 'comp.lang.ada@ada.eu.org'

Using Aonix ObjectAda on Windows NT, we found that a "delay 0.0" had
no effect. I haven't tried it with the latest version of the compiler,
so I don't know if that has changed.  But, at the time we had to use
a delay of 0.02 to get it to switch.

-----Original Message-----
From: Ted Dennison [mailto:dennison@telepath.com]

In article <HmeP6.6910$r4.437943@www.newsranger.com>, Ted Dennison says...
>
>In article <3B0D5544.ED114B7E@uundz.de>, Tilman Gloetzner says...
>
>>            select
>..
>>            or
>>               delay(0.0);
>..
>>            end select;
>
>I doubt this has much to do with your problem, but you should probably be
using
>an "else" rather than an "or delay 0.0".
..and you probably shouldn't be using either in a tight loop, like you are
doing here. That's a busy loop. It could be that your task is hogging all
the
CPU in this busy loop, and is not giving your main task a chance to call the
Quit entry. But since it isn't higher priority, and delay is supposed to act
as
a scheduling point, I'd be suprised if this was the problem.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Device file not closing on close command
  2001-05-24 21:06 Beard, Frank
@ 2001-05-25 22:30 ` Tilman Gloetzner
  0 siblings, 0 replies; 6+ messages in thread
From: Tilman Gloetzner @ 2001-05-25 22:30 UTC (permalink / raw)


1) I replaced "or delay" by "else", and "else delay". No change.

2) I changed the delay to 0.02. No change.

3) Even though the task runs in a busy loop, the load remains low (How
could I implement the task without a busy loop ?).

4) Task switching seems not to be a problem, because the main procedure
always sucessfully rendezvous with the
   "close" - entry of the task ("closing device" is printed every time)

5) The serial device (gps receiver) I am using is a PCMCIA card that
behaves like a serial interface. If I run the program for the first
time, it closes the device file and terminates successfully -- any
further attempt ends in a blocking close command. This is is independent
from the delay time (I tried 0.0,0.01, and  0.2). If remove the card and
reinsert it (this reloads the serial driver), it works again for one
time. From that behaviour I would think that the blocking is either
related to the linux serial driver, or the the implementation of the
gnat library. Any comments on that ?



"Beard, Frank" wrote:
> 
> Using Aonix ObjectAda on Windows NT, we found that a "delay 0.0" had
> no effect. I haven't tried it with the latest version of the compiler,
> so I don't know if that has changed.  But, at the time we had to use
> a delay of 0.02 to get it to switch.
> 
> -----Original Message-----
> From: Ted Dennison [mailto:dennison@telepath.com]
> 
> In article <HmeP6.6910$r4.437943@www.newsranger.com>, Ted Dennison says...
> >
> >In article <3B0D5544.ED114B7E@uundz.de>, Tilman Gloetzner says...
> >
> >>            select
> >..
> >>            or
> >>               delay(0.0);
> >..
> >>            end select;
> >
> >I doubt this has much to do with your problem, but you should probably be
> using
> >an "else" rather than an "or delay 0.0".
> ..and you probably shouldn't be using either in a tight loop, like you are
> doing here. That's a busy loop. It could be that your task is hogging all
> the
> CPU in this busy loop, and is not giving your main task a chance to call the
> Quit entry. But since it isn't higher priority, and delay is supposed to act
> as
> a scheduling point, I'd be suprised if this was the problem.



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2001-05-25 22:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-05-24 18:39 Device file not closing on close command Tilman Gloetzner
2001-05-24 18:16 ` Pat Rogers
2001-05-24 20:42 ` Ted Dennison
2001-05-24 20:47   ` Ted Dennison
  -- strict thread matches above, loose matches on Subject: below --
2001-05-24 21:06 Beard, Frank
2001-05-25 22:30 ` Tilman Gloetzner

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