[erlang-questions] gen_tcp nonblocking send

Igor Ribeiro Sucupira igorrs@REDACTED
Fri May 2 00:55:31 CEST 2008


On Thu, May 1, 2008 at 7:34 PM, Igor Ribeiro Sucupira <igorrs@REDACTED> wrote:
> On Thu, May 1, 2008 at 5:01 PM, Valentin Micic <valentin@REDACTED> wrote:
>  > >
>  >  > You didn't read my suggestion carefully enough - try again.
>  >  >
>  >
>  >  You're right -- I did not read it carefully enough. Your suggestion would
>  >  not develop a scheduling problem. However, after reading it again, I'm
>  >  really not sure why would O_NDEALY be such an evil thing, if it is
>  >  implemented as a separate function call (and not as a flag), that would
>  >  return a binary containing unsent octets. It would certainly help (in this
>  >  case not-so) intelligent queuing on the caller side -- unlike your sender
>  >  that needs to do pre-emptive queuing, until it receive's ack from "relay",
>  >  it would need to queue only unsent octets, right?
>
>
>  I don't really see the point of dealing with "partial sends" and
>  queuing unsent octets, if all you want is to send the whole message.
>  It doesn't look necessary in a concurrent environment with lightweight threads.
>
>  As for O_NDELAY, I still think it could be useful in some situation,
>  but not in this case,

In fact, it maybe could make a small difference here.

In the implementation we've suggested, we could have this:
t0) Start sending {k1, v0}. Local buffer is full. send-process blocked.
t1) k1 updated to v1.
t2) Local buffer has space. {k1, v0} being sent.
t3) k1 updated to v2.
t4) {k1, v0} sent. Start sending v2.

Maybe O_NDELAY would allow us to do this:
t0) Start trying actively (non-blocking) to send {k1, v0}. Local buffer is full.
t1) k1 updated to v1. Give up on v0. Now we're trying to send {k1, v1}.
t2) Local buffer has space. {k1, v1} being sent.
t3) k1 updated to v2.
t4) {k1, v1} sent. Start sending v2.


Which is clearly better.

Igor.

> for a similar reason: you'll be sending the data
>  anyway, as soon as you can do it. So, why not just spawn a process to
>  do exactly that wait-and-send?
>
>  Igor.
>



More information about the erlang-questions mailing list