comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen_leake@acm.org>
Subject: Re: tasksing and TCP sockets
Date: Mon, 30 Jan 2006 21:40:23 -0500
Date: 2006-01-30T21:40:23-05:00	[thread overview]
Message-ID: <uoe1tf7c8.fsf@acm.org> (raw)
In-Reply-To: 1138659171.491931.322480@g49g2000cwa.googlegroups.com

"Rolf" <rolf.ebert_nospam_@gmx.net> writes:

> Consider an application that communicates with its environment via
> sensors and actors. For testing purposes the low level access to the
> sensor and actor data gets replaced by a TCP socket communication whose
> other end simulates the world, i.e. the world simulation continuously
> writes sensor data to the socket and accepts commands as actor data.
>
>   +-----------------------+
>   |                       |
>   | application           |
>   |                       |
>   +-----------------------+
>   |    h/w abstraction    |
>   |  sensors  |  actors   |
>   +-----------------------+
>              |
>          TCP client
>              |
>              |
>              |
>   TCP server that simulates the world
>

Ok, this makes sense.

> 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, 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. And the simulator must
send data at a reasonable rate, not too fast.

> 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.

> Java for the world simulation. 

Yuck. I assume that's not by choice?

> The simulator sends about 20 packages � 11bytes every 100ms. The
> application sends typically 2-3 packages per second. 

That's certainly "reasonable rates"

> 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.

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.

> 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.

> - 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.

> - what other hints can you give me?

Get an AdaCore support contract.

-- 
-- Stephe



  reply	other threads:[~2006-01-31  2:40 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 [this message]
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
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