comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: RFC: Prototype for a user threading library in Ada
Date: Sat, 25 Jun 2016 22:21:16 -0500
Date: 2016-06-25T22:21:16-05:00	[thread overview]
Message-ID: <nknhna$c5t$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: nkl8bm$19q7$1@gioia.aioe.org

"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message 
news:nkl8bm$19q7$1@gioia.aioe.org...
> On 2016-06-24 02:38, rieachus@comcast.net wrote:
>> I don't get it.  If this is your "motivation":
>>
>>> The motivation is a two-liner. Let you have some consumer of data:
>>>
>>>    procedure Write (Buffer : String; Last : out Integer);
>>>
>>> It may take less than the whole string when called, but will take more
>>> data later. So, the parameter Last. Now you want to write a program in a
>>> *normal* way:
>>>
>>>    Write ("This");
>>>    Write ("That");
>>>
>>> That's it.
>>
>> You may want to make your Last parameter in or in out, but that's a 
>> detail.
>
> It is not a detail. The caller of Write does not know how much data the 
> transport layer is ready to accept. That is the nature of non-blocking 
> I/O. Write takes as much data it can and tells through Last where the 
> caller must continue *later*.
>
> A blocking busy-waiting wrapper looks this way:
>
>    procedure Write (Buffer : String) is
>       First : Integer := Buffer'First;
>       Last  : Integer;
>    begin
>       loop
>          Write (Buffer (First..Buffer'Last), Last);
>          exit when Last = Buffer'Last;
>          First := Last + 1;
>       end loop;
>    end Write;

You forgot the "delay 0.0;" (or "yield;" as Ada 2012 aliased it):

    procedure Write (Buffer : String) is
       First : Integer := Buffer'First;
       Last  : Integer;
    begin
       loop
          Write (Buffer (First..Buffer'Last), Last);
          exit when Last = Buffer'Last;
          First := Last + 1;
          delay 0.0;
       end loop;
    end Write;

The delay gives up the processor so that other tasks can run. It's how most 
I/O works in Janus/Ada. (Note that if you know something about the latencies 
of Write, you can use a better value than "0.0", so you don't try again 
until you're pretty sure the system is ready. For instance, for socket I/O 
we typically use 0.01, so the program isn't churning and doing nothing. 
[Although we usually use a system of increasing delays, so that if it is 
ready almost immediately, we're continuing to write, else we're waiting 
longer and not wasting time trying something that's unlikely to be ready.])

That, combined with proper tasking runtimes, would seem to provide better 
results than doing all one thing (task = thread) or all othe ther (some 
fancy coroutine system).

                                      Randy.



  parent reply	other threads:[~2016-06-26  3:21 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-17  9:44 RFC: Prototype for a user threading library in Ada Hadrien Grasland
2016-06-17 16:18 ` Niklas Holsti
2016-06-17 16:46   ` Dmitry A. Kazakov
2016-06-18  8:16     ` Hadrien Grasland
2016-06-18  8:47       ` Dmitry A. Kazakov
2016-06-18  9:17         ` Hadrien Grasland
2016-06-18 11:53           ` Dmitry A. Kazakov
2016-06-20  8:23             ` Hadrien Grasland
2016-06-20  9:22               ` Dmitry A. Kazakov
2016-06-23  1:42       ` Randy Brukardt
2016-06-23  8:39         ` Dmitry A. Kazakov
2016-06-23 22:12           ` Randy Brukardt
2016-06-24  7:34             ` Dmitry A. Kazakov
2016-06-24 23:00               ` Randy Brukardt
2016-06-25  7:11                 ` Dmitry A. Kazakov
2016-06-26  2:02                   ` rieachus
2016-06-26  6:26                     ` Dmitry A. Kazakov
2016-06-24  0:38           ` rieachus
2016-06-25  6:28             ` Dmitry A. Kazakov
2016-06-26  1:34               ` rieachus
2016-06-26  3:21               ` Randy Brukardt [this message]
2016-06-26  6:15                 ` Dmitry A. Kazakov
2016-06-28 20:44                   ` Anh Vo
2016-07-02  4:13                   ` Randy Brukardt
2016-07-02 10:25                     ` Dmitry A. Kazakov
2016-07-05 21:53                       ` Randy Brukardt
2016-07-06  9:25                         ` Dmitry A. Kazakov
2016-07-07  0:32                           ` Randy Brukardt
2016-07-07  6:08                             ` Niklas Holsti
2016-07-08  0:03                               ` Randy Brukardt
2016-07-08  7:32                                 ` Dmitry A. Kazakov
2016-07-11 19:40                                   ` Randy Brukardt
2016-07-12  8:37                                     ` Dmitry A. Kazakov
2016-07-12 21:31                                       ` Randy Brukardt
2016-07-08 20:17                                 ` Niklas Holsti
2016-06-24 21:06         ` Hadrien Grasland
2016-06-26  3:09           ` Randy Brukardt
2016-06-26  6:41             ` Dmitry A. Kazakov
2016-07-02  4:21               ` Randy Brukardt
2016-07-02 10:33                 ` Dmitry A. Kazakov
2016-07-05 21:24                   ` Randy Brukardt
2016-07-06 13:46                     ` Dmitry A. Kazakov
2016-07-07  1:00                       ` Randy Brukardt
2016-07-07 14:23                         ` Dmitry A. Kazakov
2016-07-07 23:43                           ` Randy Brukardt
2016-07-08  8:23                             ` Dmitry A. Kazakov
2016-07-11 19:44                               ` Randy Brukardt
2016-06-26  9:09             ` Hadrien Grasland
2016-07-02  4:36               ` Randy Brukardt
2016-07-02  5:30                 ` Simon Wright
2016-07-05 21:29                   ` Randy Brukardt
2016-07-02 11:13                 ` Hadrien Grasland
2016-07-02 13:18                   ` Dmitry A. Kazakov
2016-07-02 16:49                     ` Hadrien Grasland
2016-07-02 21:33                       ` Niklas Holsti
2016-07-03 20:56                         ` Hadrien Grasland
2016-07-02 17:26                   ` Niklas Holsti
2016-07-02 21:14                   ` Niklas Holsti
2016-07-03  7:42                     ` Hadrien Grasland
2016-07-03  8:39                       ` Dmitry A. Kazakov
2016-07-03 21:15                         ` Hadrien Grasland
2016-07-04  7:44                           ` Dmitry A. Kazakov
2016-07-05 21:38                   ` Randy Brukardt
2016-06-21  2:40     ` rieachus
2016-06-21  7:34       ` Dmitry A. Kazakov
2016-06-18  7:56   ` Hadrien Grasland
2016-06-18  8:33 ` Hadrien Grasland
2016-06-18 11:38 ` Hadrien Grasland
2016-06-18 13:17   ` Niklas Holsti
2016-06-18 16:27   ` Jeffrey R. Carter
2016-06-20  8:42 ` Hadrien Grasland
2016-07-10  0:45 ` rieachus
replies disabled

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