clib_bitmap_t *libc_wr_bitmap;
clib_bitmap_t *libc_ex_bitmap;
vcl_poll_t *vcl_poll;
+ struct pollfd *libc_poll;
+ u16 *libc_poll_idxs;
u8 select_vcl;
u8 epoll_wait_vcl;
u8 vcl_needs_real_epoll; /*< vcl needs next epoll_create to
{
func_str = "libc_close";
- if (LDP_DEBUG > 0)
- clib_warning
- ("LDP<%d>: fd %d (0x%x): calling %s(): epfd %u (0x%x)",
- getpid (), fd, fd, func_str, epfd, epfd);
+ LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): epfd %u (0x%x)",
+ getpid (), fd, fd, func_str, epfd, epfd);
rv = libc_close (epfd);
if (rv < 0)
func_str = "vppcom_session_close";
- if (LDP_DEBUG > 0)
- clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x)",
- getpid (), fd, fd, func_str, sid, sid);
+ LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x)",
+ getpid (), fd, fd, func_str, sid, sid);
rv = vppcom_session_close (sid);
if (rv != VPPCOM_OK)
{
func_str = "libc_close";
- if (LDP_DEBUG > 0)
- clib_warning ("LDP<%d>: fd %d (0x%x): calling %s()",
- getpid (), fd, fd, func_str);
+ LDBG (0, "LDP<%d>: fd %d (0x%x): calling %s()", getpid (), fd, fd,
+ func_str);
rv = libc_close (fd);
}
{
case F_SETFL:
func_str = "vppcom_session_attr[SET_FLAGS]";
- if (LDP_DEBUG > 2)
- clib_warning ("LDP<%d>: fd %d (0x%x): calling %s(): "
- "sid %u (0x%x) flags %d (0x%x), size %d",
- getpid (), fd, fd, func_str, sid, sid,
- flags, flags, size);
+ LDBG (2, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x) "
+ "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid,
+ sid, flags, flags, size);
- rv =
- vppcom_session_attr (sid, VPPCOM_ATTR_SET_FLAGS, &flags, &size);
+ rv = vppcom_session_attr (sid, VPPCOM_ATTR_SET_FLAGS, &flags,
+ &size);
break;
case F_GETFL:
func_str = "vppcom_session_attr[GET_FLAGS]";
- if (LDP_DEBUG > 2)
- clib_warning
- ("LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), "
- "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid,
- sid, flags, flags, size);
+ LDBG (2, "LDP<%d>: fd %d (0x%x): calling %s(): sid %u (0x%x), "
+ "flags %d (0x%x), size %d", getpid (), fd, fd, func_str, sid,
+ sid, flags, flags, size);
- rv =
- vppcom_session_attr (sid, VPPCOM_ATTR_GET_FLAGS, &flags, &size);
+ rv = vppcom_session_attr (sid, VPPCOM_ATTR_GET_FLAGS, &flags,
+ &size);
if (rv == VPPCOM_OK)
{
- if (LDP_DEBUG > 2)
- clib_warning ("LDP<%d>: fd %d (0x%x), cmd %d (F_GETFL): "
- "%s() returned flags %d (0x%x)",
- getpid (), fd, fd, cmd, func_str, flags, flags);
+ LDBG (2, "LDP<%d>: fd %d (0x%x), cmd %d (F_GETFL): %s() "
+ "returned flags %d (0x%x)", getpid (), fd, fd, cmd,
+ func_str, flags, flags);
rv = flags;
}
break;
-
+ case F_SETFD:
+ /* TODO handle this */
+ LDBG (0, "F_SETFD ignored flags %u", flags);
+ rv = 0;
+ break;
default:
rv = -EOPNOTSUPP;
break;
/* select as fine grained sleep */
if (!nfds)
{
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: sleeping for %.02f seconds",
- getpid (), time_out);
+ LDBG (3, "LDP<%d>: sleeping for %.02f seconds", getpid (),
+ time_out);
time_out += clib_time_now (&ldp->clib_time);
while (clib_time_now (&ldp->clib_time) < time_out)
{
func_str = "libc_pselect";
- if (LDP_DEBUG > 3)
- clib_warning
- ("LDP<%d>: calling %s(): nfds %d, readfds %p, writefds %p, "
- "exceptfds %p, timeout %p, sigmask %p", getpid (), func_str, nfds,
- readfds, writefds, exceptfds, timeout, sigmask);
+ LDBG (3, "LDP<%d>: calling %s(): nfds %d, readfds %p, writefds %p, "
+ "exceptfds %p, timeout %p, sigmask %p", getpid (), func_str, nfds,
+ readfds, writefds, exceptfds, timeout, sigmask);
rv = libc_pselect (nfds, readfds, writefds, exceptfds,
timeout, sigmask);
}
sid_bits = libc_bits = 0;
+ u32 n_bytes = nfds / 8 + ((nfds % 8) ? 1 : 0);
if (readfds)
{
clib_bitmap_validate (ldp->sid_rd_bitmap, minbits);
clib_bitmap_validate (ldp->libc_rd_bitmap, minbits);
clib_bitmap_validate (ldp->rd_bitmap, minbits);
- clib_memcpy (ldp->rd_bitmap, readfds,
- vec_len (ldp->rd_bitmap) * sizeof (clib_bitmap_t));
- FD_ZERO (readfds);
+ clib_memcpy_fast (ldp->rd_bitmap, readfds, n_bytes);
+ memset (readfds, 0, n_bytes);
/* *INDENT-OFF* */
- clib_bitmap_foreach (fd, ldp->rd_bitmap,
- ({
- sid = ldp_sid_from_fd (fd);
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: readfds: fd %d (0x%x), sid %u (0x%x)",
- getpid (), fd, fd, sid, sid);
- if (sid == INVALID_SESSION_ID)
- clib_bitmap_set_no_check (ldp->libc_rd_bitmap, fd, 1);
- else
- clib_bitmap_set_no_check (ldp->sid_rd_bitmap, sid, 1);
- }));
+ clib_bitmap_foreach (fd, ldp->rd_bitmap, ({
+ if (fd > nfds)
+ break;
+ sid = ldp_sid_from_fd (fd);
+ LDBG (3, "LDP<%d>: readfds: fd %d (0x%x), sid %u (0x%x)",
+ getpid (), fd, fd, sid, sid);
+ if (sid == INVALID_SESSION_ID)
+ clib_bitmap_set_no_check (ldp->libc_rd_bitmap, fd, 1);
+ else
+ clib_bitmap_set_no_check (ldp->sid_rd_bitmap, sid, 1);
+ }));
/* *INDENT-ON* */
sid_bits_set = clib_bitmap_last_set (ldp->sid_rd_bitmap) + 1;
libc_bits_set = clib_bitmap_last_set (ldp->libc_rd_bitmap) + 1;
libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits;
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: readfds: sid_bits_set %d, sid_bits %d, "
- "libc_bits_set %d, libc_bits %d", getpid (),
- sid_bits_set, sid_bits, libc_bits_set, libc_bits);
+ LDBG (3, "LDP<%d>: readfds: sid_bits_set %d, sid_bits %d, "
+ "libc_bits_set %d, libc_bits %d", getpid (), sid_bits_set,
+ sid_bits, libc_bits_set, libc_bits);
}
if (writefds)
{
clib_bitmap_validate (ldp->sid_wr_bitmap, minbits);
clib_bitmap_validate (ldp->libc_wr_bitmap, minbits);
clib_bitmap_validate (ldp->wr_bitmap, minbits);
- clib_memcpy (ldp->wr_bitmap, writefds,
- vec_len (ldp->wr_bitmap) * sizeof (clib_bitmap_t));
- FD_ZERO (writefds);
+ clib_memcpy_fast (ldp->wr_bitmap, writefds, n_bytes);
+ memset (writefds, 0, n_bytes);
/* *INDENT-OFF* */
- clib_bitmap_foreach (fd, ldp->wr_bitmap,
- ({
- sid = ldp_sid_from_fd (fd);
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: writefds: fd %d (0x%x), sid %u (0x%x)",
- getpid (), fd, fd, sid, sid);
- if (sid == INVALID_SESSION_ID)
- clib_bitmap_set_no_check (ldp->libc_wr_bitmap, fd, 1);
- else
- clib_bitmap_set_no_check (ldp->sid_wr_bitmap, sid, 1);
- }));
+ clib_bitmap_foreach (fd, ldp->wr_bitmap, ({
+ if (fd > nfds)
+ break;
+ sid = ldp_sid_from_fd (fd);
+ LDBG (3, "LDP<%d>: writefds: fd %d (0x%x), sid %u (0x%x)",
+ getpid (), fd, fd, sid, sid);
+ if (sid == INVALID_SESSION_ID)
+ clib_bitmap_set_no_check (ldp->libc_wr_bitmap, fd, 1);
+ else
+ clib_bitmap_set_no_check (ldp->sid_wr_bitmap, sid, 1);
+ }));
/* *INDENT-ON* */
sid_bits_set = clib_bitmap_last_set (ldp->sid_wr_bitmap) + 1;
libc_bits_set = clib_bitmap_last_set (ldp->libc_wr_bitmap) + 1;
libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits;
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: writefds: sid_bits_set %d, sid_bits %d, "
- "libc_bits_set %d, libc_bits %d", getpid (),
- sid_bits_set, sid_bits, libc_bits_set, libc_bits);
+ LDBG (3, "LDP<%d>: writefds: sid_bits_set %d, sid_bits %d, "
+ "libc_bits_set %d, libc_bits %d", getpid (),
+ sid_bits_set, sid_bits, libc_bits_set, libc_bits);
}
if (exceptfds)
{
clib_bitmap_validate (ldp->sid_ex_bitmap, minbits);
clib_bitmap_validate (ldp->libc_ex_bitmap, minbits);
clib_bitmap_validate (ldp->ex_bitmap, minbits);
- clib_memcpy (ldp->ex_bitmap, exceptfds,
- vec_len (ldp->ex_bitmap) * sizeof (clib_bitmap_t));
- FD_ZERO (exceptfds);
+ clib_memcpy_fast (ldp->ex_bitmap, exceptfds, n_bytes);
+ memset (exceptfds, 0, n_bytes);
/* *INDENT-OFF* */
- clib_bitmap_foreach (fd, ldp->ex_bitmap,
- ({
- sid = ldp_sid_from_fd (fd);
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: exceptfds: fd %d (0x%x), sid %u (0x%x)",
- getpid (), fd, fd, sid, sid);
- if (sid == INVALID_SESSION_ID)
- clib_bitmap_set_no_check (ldp->libc_ex_bitmap, fd, 1);
- else
- clib_bitmap_set_no_check (ldp->sid_ex_bitmap, sid, 1);
- }));
+ clib_bitmap_foreach (fd, ldp->ex_bitmap, ({
+ if (fd > nfds)
+ break;
+ sid = ldp_sid_from_fd (fd);
+ LDBG (3, "LDP<%d>: exceptfds: fd %d (0x%x), sid %u (0x%x)",
+ getpid (), fd, fd, sid, sid);
+ if (sid == INVALID_SESSION_ID)
+ clib_bitmap_set_no_check (ldp->libc_ex_bitmap, fd, 1);
+ else
+ clib_bitmap_set_no_check (ldp->sid_ex_bitmap, sid, 1);
+ }));
/* *INDENT-ON* */
sid_bits_set = clib_bitmap_last_set (ldp->sid_ex_bitmap) + 1;
libc_bits_set = clib_bitmap_last_set (ldp->libc_ex_bitmap) + 1;
libc_bits = (libc_bits_set > libc_bits) ? libc_bits_set : libc_bits;
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: exceptfds: sid_bits_set %d, sid_bits %d, "
- "libc_bits_set %d, libc_bits %d", getpid (),
- sid_bits_set, sid_bits, libc_bits_set, libc_bits);
+ LDBG (3, "LDP<%d>: exceptfds: sid_bits_set %d, sid_bits %d, "
+ "libc_bits_set %d, libc_bits %d", getpid (),
+ sid_bits_set, sid_bits, libc_bits_set, libc_bits);
}
if (PREDICT_FALSE (!sid_bits && !libc_bits))
func_str = "vppcom_select";
if (readfds)
- clib_memcpy (ldp->rd_bitmap, ldp->sid_rd_bitmap,
- vec_len (ldp->rd_bitmap) *
- sizeof (clib_bitmap_t));
+ clib_memcpy_fast (ldp->rd_bitmap, ldp->sid_rd_bitmap,
+ vec_len (ldp->rd_bitmap) *
+ sizeof (clib_bitmap_t));
if (writefds)
- clib_memcpy (ldp->wr_bitmap, ldp->sid_wr_bitmap,
- vec_len (ldp->wr_bitmap) *
- sizeof (clib_bitmap_t));
+ clib_memcpy_fast (ldp->wr_bitmap, ldp->sid_wr_bitmap,
+ vec_len (ldp->wr_bitmap) *
+ sizeof (clib_bitmap_t));
if (exceptfds)
- clib_memcpy (ldp->ex_bitmap, ldp->sid_ex_bitmap,
- vec_len (ldp->ex_bitmap) *
- sizeof (clib_bitmap_t));
+ clib_memcpy_fast (ldp->ex_bitmap, ldp->sid_ex_bitmap,
+ vec_len (ldp->ex_bitmap) *
+ sizeof (clib_bitmap_t));
rv = vppcom_select (sid_bits,
readfds ? ldp->rd_bitmap : NULL,
func_str = "libc_pselect";
if (readfds)
- clib_memcpy (readfds, ldp->libc_rd_bitmap,
- vec_len (ldp->rd_bitmap) * sizeof (clib_bitmap_t));
+ clib_memcpy_fast (readfds, ldp->libc_rd_bitmap,
+ vec_len (ldp->rd_bitmap) *
+ sizeof (clib_bitmap_t));
if (writefds)
- clib_memcpy (writefds, ldp->libc_wr_bitmap,
- vec_len (ldp->wr_bitmap) * sizeof (clib_bitmap_t));
+ clib_memcpy_fast (writefds, ldp->libc_wr_bitmap,
+ vec_len (ldp->wr_bitmap) *
+ sizeof (clib_bitmap_t));
if (exceptfds)
- clib_memcpy (exceptfds, ldp->libc_ex_bitmap,
- vec_len (ldp->ex_bitmap) * sizeof (clib_bitmap_t));
+ clib_memcpy_fast (exceptfds, ldp->libc_ex_bitmap,
+ vec_len (ldp->ex_bitmap) *
+ sizeof (clib_bitmap_t));
tspec.tv_sec = tspec.tv_nsec = 0;
rv = libc_pselect (libc_bits,
readfds ? readfds : NULL,
done:
/* TBD: set timeout to amount of time left */
- vec_reset_length (ldp->rd_bitmap);
- vec_reset_length (ldp->sid_rd_bitmap);
- vec_reset_length (ldp->libc_rd_bitmap);
- vec_reset_length (ldp->wr_bitmap);
- vec_reset_length (ldp->sid_wr_bitmap);
- vec_reset_length (ldp->libc_wr_bitmap);
- vec_reset_length (ldp->ex_bitmap);
- vec_reset_length (ldp->sid_ex_bitmap);
- vec_reset_length (ldp->libc_ex_bitmap);
+ clib_bitmap_zero (ldp->rd_bitmap);
+ clib_bitmap_zero (ldp->sid_rd_bitmap);
+ clib_bitmap_zero (ldp->libc_rd_bitmap);
+ clib_bitmap_zero (ldp->wr_bitmap);
+ clib_bitmap_zero (ldp->sid_wr_bitmap);
+ clib_bitmap_zero (ldp->libc_wr_bitmap);
+ clib_bitmap_zero (ldp->ex_bitmap);
+ clib_bitmap_zero (ldp->sid_ex_bitmap);
+ clib_bitmap_zero (ldp->libc_ex_bitmap);
if (LDP_DEBUG > 3)
{
{
func_str = "libc_socket";
- if (LDP_DEBUG > 1)
- clib_warning ("LDP<%d>: : calling %s()", getpid (), func_str);
+ LDBG (1, "LDP<%d>: : calling %s()", getpid (), func_str);
- rv = libc_socket (domain, type, protocol);
+ rv = libc_socketpair (domain, type, protocol, fds);
}
if (LDP_DEBUG > 1)
if (sid != INVALID_SESSION_ID)
{
- func_str = __func__;
-
- clib_warning ("LDP<%d>: LDP-TBD", getpid ());
- errno = ENOSYS;
- rv = -1;
+ func_str = "vppcom_session_close[TODO]";
+ rv = close (fd);
}
else
{
poll (struct pollfd *fds, nfds_t nfds, int timeout)
{
const char *func_str = __func__;
- int rv, i, n_libc_fds, n_revents;
+ int rv, i, n_revents = 0;
u32 sid;
vcl_poll_t *vp;
double wait_for_time;
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: fds %p, nfds %d, timeout %d",
- getpid (), fds, nfds, timeout);
+ LDBG (3, "LDP<%d>: fds %p, nfds %d, timeout %d", getpid (), fds, nfds,
+ timeout);
if (timeout >= 0)
wait_for_time = (f64) timeout / 1000;
else
wait_for_time = -1;
- n_libc_fds = 0;
for (i = 0; i < nfds; i++)
{
- if (fds[i].fd >= 0)
- {
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: fds[%d].fd %d (0x%0x), .events = 0x%x, "
- ".revents = 0x%x", getpid (), i, fds[i].fd,
- fds[i].fd, fds[i].events, fds[i].revents);
+ if (fds[i].fd < 0)
+ continue;
- sid = ldp_sid_from_fd (fds[i].fd);
- if (sid != INVALID_SESSION_ID)
- {
- fds[i].fd = -fds[i].fd;
- vec_add2 (ldp->vcl_poll, vp, 1);
- vp->fds_ndx = i;
- vp->sid = sid;
- vp->events = fds[i].events;
+ LDBG (3, "LDP<%d>: fds[%d] fd %d (0x%0x) events = 0x%x revents = 0x%x",
+ getpid (), i, fds[i].fd, fds[i].fd, fds[i].events,
+ fds[i].revents);
+
+ sid = ldp_sid_from_fd (fds[i].fd);
+ if (sid != INVALID_SESSION_ID)
+ {
+ fds[i].fd = -fds[i].fd;
+ vec_add2 (ldp->vcl_poll, vp, 1);
+ vp->fds_ndx = i;
+ vp->sid = sid;
+ vp->events = fds[i].events;
#ifdef __USE_XOPEN2K
- if (fds[i].events & POLLRDNORM)
- vp->events |= POLLIN;
- if (fds[i].events & POLLWRNORM)
- vp->events |= POLLOUT;
+ if (fds[i].events & POLLRDNORM)
+ vp->events |= POLLIN;
+ if (fds[i].events & POLLWRNORM)
+ vp->events |= POLLOUT;
#endif
- vp->revents = &fds[i].revents;
- }
- else
- n_libc_fds++;
+ vp->revents = fds[i].revents;
+ }
+ else
+ {
+ vec_add1 (ldp->libc_poll, fds[i]);
+ vec_add1 (ldp->libc_poll_idxs, i);
}
}
- n_revents = 0;
do
{
if (vec_len (ldp->vcl_poll))
{
func_str = "vppcom_poll";
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: calling %s(): "
- "vcl_poll %p, n_sids %u (0x%x): "
- "n_libc_fds %u",
- getpid (), func_str, ldp->vcl_poll,
- vec_len (ldp->vcl_poll), vec_len (ldp->vcl_poll),
- n_libc_fds);
+ LDBG (3, "LDP<%d>: calling %s(): vcl_poll %p, n_sids %u (0x%x): "
+ "n_libc_fds %u", getpid (), func_str, ldp->vcl_poll,
+ vec_len (ldp->vcl_poll), vec_len (ldp->vcl_poll),
+ vec_len (ldp->libc_poll));
rv = vppcom_poll (ldp->vcl_poll, vec_len (ldp->vcl_poll), 0);
if (rv < 0)
n_revents += rv;
}
- if (n_libc_fds)
+ if (vec_len (ldp->libc_poll))
{
func_str = "libc_poll";
- if (LDP_DEBUG > 3)
- clib_warning ("LDP<%d>: calling %s(): fds %p, nfds %u: n_sids %u",
- getpid (), fds, nfds, vec_len (ldp->vcl_poll));
+ LDBG (3, "LDP<%d>: calling %s(): fds %p, nfds %u: n_sids %u",
+ getpid (), fds, nfds, vec_len (ldp->vcl_poll));
- rv = libc_poll (fds, nfds, 0);
+ rv = libc_poll (ldp->libc_poll, vec_len (ldp->libc_poll), 0);
if (rv < 0)
goto done;
else
vec_foreach (vp, ldp->vcl_poll)
{
fds[vp->fds_ndx].fd = -fds[vp->fds_ndx].fd;
+ fds[vp->fds_ndx].revents = vp->revents;
#ifdef __USE_XOPEN2K
if ((fds[vp->fds_ndx].revents & POLLIN) &&
(fds[vp->fds_ndx].events & POLLRDNORM))
}
vec_reset_length (ldp->vcl_poll);
+ for (i = 0; i < vec_len (ldp->libc_poll); i++)
+ {
+ fds[ldp->libc_poll_idxs[i]].revents = ldp->libc_poll[i].revents;
+ }
+ vec_reset_length (ldp->libc_poll_idxs);
+ vec_reset_length (ldp->libc_poll);
+
if (LDP_DEBUG > 3)
{
if (rv < 0)
{
clib_warning ("LDP<%d>: returning %d (0x%x): n_sids %u, "
"n_libc_fds %d", getpid (), rv, rv,
- vec_len (ldp->vcl_poll), n_libc_fds);
+ vec_len (ldp->vcl_poll), vec_len (ldp->libc_poll));
for (i = 0; i < nfds; i++)
{