From: "Rolf" <rolf.ebert_nospam_@gmx.net>
Subject: Re: tasksing and TCP sockets
Date: 31 Jan 2006 14:52:49 -0800
Date: 2006-01-31T14:52:49-08:00 [thread overview]
Message-ID: <1138747969.510279.15280@g49g2000cwa.googlegroups.com> (raw)
In-Reply-To: <uoe1tf7c8.fsf@acm.org>
Stephen Leake wrote:
> "Rolf" <rolf.ebert_nospam_@gmx.net> writes:
>
> > In a stripped down version I can succesfully connect to the server
> > (using GNAT.Sockets) and either read the sensor data *or* write actor
> > data. The program is currently split in two tasks. One tasks contains
> > the application code and the actor communication (using
> > type_id'output(channel)). The second tasks gets started during program
> > initialisation. It reads the data from the socket via
> > type_id'input(channel) and provides the data to the application through
> > a protected object.
> >
> > The problem that I face is that the second task seems to starve the
> > first one. As soon as it is active, the application does not generate
> > debug output anymore.
>
> You need to set the priorities correctly,
Does that mean e.g. to set the main task to 10 and the second task to
5?
> and you need to ensure that
> there are no busy waits; the second task should be _suspended_ waiting
> on socket completions, not polling for them.
How would I do that? I have no explicit busy wait, I use
Var := Sensor_Cmd_T'Input (Channel);
If possible, I'd like to keep that easy way of data input and avoid
explicit conversion and read commands.
> > Some background info: gcc-3.4.4 on Windows XP.
>
> That may be a problem. I find the commercially supported GNAT to be
> less broken.
This is a hobby project.
> > Java for the world simulation.
>
> Yuck. I assume that's not by choice?
The world simulation already exists. I won't recode it in Ada. (and I
kind of like Java, too)
> > The simulator sends about 20 packages à 11bytes every 100ms. The
> > application sends typically 2-3 packages per second.
>
> That's certainly "reasonable rates"
>
That is almost nothing!
> > I have delay statements in both main loops (varied between 0.0 and
> > 0.2 seconds).
>
> You should _not_ need delay statements. Redesign to be waiting on
> socket completions.
How?
> Or, if you are designing to a cyclic execution, you can poll on the
> sockets, but just once per cycle. You can use
> GNAT.Sockets.Control_Socket for that.
>
I shall check that.
> > My questions:
> > - is that a reasonable tasking approach?
>
> In general, yes. But the details matter a lot.
>
> > - I don't know much about sockets (or better I don't remember
> > much). Does a waiting read (in the second task) block a write in the
> > first task?
>
> Not in Windows with GNAT 5.03a. gcc-3.4.4 on Cygwin may be different.
There is no real Ada compiler on Cygwin. I use the Windows
(mingw-based) gcc-3.4.4. I shall see if GNAT GPL 2005 gives different
results.
> > - how can I interrupt the waiting read task to force activity in the
> > main task?
>
> Depends on how it is waiting. If is in a GNAT.Sockets.Receive_Socket,
> you can't (short of shutting down the socket). So periodic polling
> might be better.
I suppose it waits in the Sensor_Cmd_T'Input (Channel) routine, but I
am not sure.
> > - what other hints can you give me?
>
> Get an AdaCore support contract.
>
In a professional environment certainly, but not here ...
Rolf
next prev parent reply other threads:[~2006-01-31 22:52 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-01-30 22:12 tasksing and TCP sockets Rolf
2006-01-31 2:40 ` Stephen Leake
2006-01-31 6:59 ` tmoran
2006-01-31 23:03 ` Rolf
2006-02-01 1:26 ` Stephen Leake
2006-02-01 7:39 ` Rolf
2006-02-01 14:52 ` Stephen Leake
2006-02-03 20:33 ` Rolf
2006-02-04 12:48 ` Stephen Leake
2006-02-06 5:02 ` Dave Thompson
2006-01-31 22:52 ` Rolf [this message]
2006-02-01 1:23 ` Stephen Leake
2006-02-01 21:12 ` Simon Wright
2006-01-31 3:02 ` Steve
2006-01-31 10:09 ` Dmitry A. Kazakov
2006-01-31 21:55 ` Simon Wright
2006-02-01 8:54 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox