> Support MSG_WAITALL flag with recv() when using rsockets.
> 
> Signed-off-by: Sridhar Samudrala <[email protected]>

The MSG_PEEK description that you pointed me to wasn't in the man page 
documentation that I was looking at.  That simplifies things.

I originally expected adding MSG_WAITALL support to be as trivial as your 
patch, and it didn't end up quite as simple as I expected.  It was mostly 
because I tried to handle MSG_PEEK differently, but I also have a note in my 
version.  Please see below.

> diff --git a/src/rsocket.c b/src/rsocket.c
> index b9105a1..81f2654 100644
> --- a/src/rsocket.c
> +++ b/src/rsocket.c
> @@ -1131,6 +1131,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int
> flags)
>               }
>       }
>       fastlock_acquire(&rs->rlock);
> +waitall:
>       if (!rs_have_rdata(rs)) {
>               ret = rs_get_comp(rs, rs_nonblocking(rs, flags),
> rs_conn_have_rdata);
>               if (ret)
> @@ -1167,6 +1168,10 @@ ssize_t rrecv(int socket, void *buf, size_t len, int
> flags)
>               buf += rsize;
>       }
>       rs->rbuf_bytes_avail += len - left;

The above line doesn't work as written if placed inside a loop.  And we can't 
move it outside of the loop, or we may not give credits to the remote side.

> +
> +     if ((flags & MSG_WAITALL) && left)
> +             goto waitall;

One minor difference is that I used a do - while() loop in place of if - goto, 
but I also added a state check of (rs->state & rs_connect_rd).

Since we don't have to deal with MSG_PEEK, I'll fix-up how rbuf_bytes_avail is 
updated and send out an updated patch for review.

- Sean
N�����r��y����b�X��ǧv�^�)޺{.n�+����{��ٚ�{ay�ʇڙ�,j��f���h���z��w���
���j:+v���w�j�m��������zZ+�����ݢj"��!�i

Reply via email to