comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen_leake@acm.org>
Subject: Re: tasksing and TCP sockets
Date: Tue, 31 Jan 2006 20:23:53 -0500
Date: 2006-01-31T20:23:53-05:00	[thread overview]
Message-ID: <uslr3an2u.fsf@acm.org> (raw)
In-Reply-To: 1138747969.510279.15280@g49g2000cwa.googlegroups.com

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

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

Well, I don't know, since I don't know the details of your project.
But it is likely that one should have a higher priority than the
other. The default is for all tasks to have the same priority.

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

Hmm. I don't know how this maps to Read_Socket commands. I would guess
that it waits for the number of Stream_Elements in Sensor_Cmd_T to be
available. But it might wait longer than that, especially if
Sensor_Cmd_T is unconstrained.

You could do a Read_Socket into a Stream_Array, and then do 'Input
from that. That would make it clearer when the task is suspended.

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

Ok.

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

There is an option that expands tasking constructs into lower-level
Ada code, and outputs the source. That may help here, to show what is
going on.

-- 
-- Stephe



  reply	other threads:[~2006-02-01  1:23 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
2006-02-01  1:23     ` Stephen Leake [this message]
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