From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,136c120daac2a1 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII Path: g2news1.google.com!postnews.google.com!g49g2000cwa.googlegroups.com!not-for-mail From: "Rolf" Newsgroups: comp.lang.ada Subject: Re: tasksing and TCP sockets Date: 31 Jan 2006 14:52:49 -0800 Organization: http://groups.google.com Message-ID: <1138747969.510279.15280@g49g2000cwa.googlegroups.com> References: <1138659171.491931.322480@g49g2000cwa.googlegroups.com> NNTP-Posting-Host: 84.152.8.65 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Trace: posting.google.com 1138747974 17665 127.0.0.1 (31 Jan 2006 22:52:54 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Tue, 31 Jan 2006 22:52:54 +0000 (UTC) In-Reply-To: User-Agent: G2/0.2 X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5,gzip(gfe),gzip(gfe) Complaints-To: groups-abuse@google.com Injection-Info: g49g2000cwa.googlegroups.com; posting-host=84.152.8.65; posting-account=X6JcNAwAAACCYFUClJvh1OjD0lgttvkm Xref: g2news1.google.com comp.lang.ada:2728 Date: 2006-01-31T14:52:49-08:00 List-Id: Stephen Leake wrote: > "Rolf" 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 :=3D 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 =E0 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. >=20 In a professional environment certainly, but not here ... Rolf