/* Ensures we have a valid write file descriptor.
Returns 1 if we have a valid write file descriptor,
- 0 if the write fd could not be opened. */
+ 0 if the write fd is not valid/cannot be opened. */
static
int ensure_write_remote_desc(void)
{
struct vki_pollfd write_remote_desc_ok;
- int ret;
+ SysRes ret;
if (write_remote_desc != INVALID_DESCRIPTOR) {
write_remote_desc_ok.fd = write_remote_desc;
write_remote_desc_ok.events = VKI_POLLOUT;
write_remote_desc_ok.revents = 0;
ret = VG_(poll)(&write_remote_desc_ok, 1, 0);
- if (ret && poll_cond(write_remote_desc_ok.revents)) {
- dlog(1, "POLLcond %d closing write_remote_desc %d\n",
- write_remote_desc_ok.revents, write_remote_desc);
- VG_(close) (write_remote_desc);
- write_remote_desc = INVALID_DESCRIPTOR;
+ if (sr_isError(ret)
+ || (sr_Res(ret) > 0 && poll_cond(write_remote_desc_ok.revents))) {
+ if (sr_isError(ret)) {
+ sr_perror(ret, "ensure_write_remote_desc: poll error\n");
+ } else {
+ dlog(0, "POLLcond %d closing write_remote_desc %d\n",
+ write_remote_desc_ok.revents, write_remote_desc);
+ }
+ VG_(close) (write_remote_desc);
+ write_remote_desc = INVALID_DESCRIPTOR;
}
}
if (write_remote_desc == INVALID_DESCRIPTOR) {
counter values maintained in shared memory by vgdb. */
int remote_desc_activity(const char *msg)
{
- int ret;
+ int retval;
+ SysRes ret;
const int looking_at = shared->written_by_vgdb;
if (shared->seen_by_valgrind == looking_at)
- // if (last_looked_cntr == looking_at)
return 0;
if (remote_desc == INVALID_DESCRIPTOR)
return 0;
/* poll the remote desc */
remote_desc_pollfdread_activity.revents = 0;
ret = VG_(poll) (&remote_desc_pollfdread_activity, 1, 0);
- if (ret && poll_cond(remote_desc_pollfdread_activity.revents)) {
- dlog(1, "POLLcond %d remote_desc_pollfdread %d\n",
- remote_desc_pollfdread_activity.revents, remote_desc);
- error_poll_cond();
- ret = 2;
+ if (sr_isError(ret)
+ || (sr_Res(ret) && poll_cond(remote_desc_pollfdread_activity.revents))) {
+ if (sr_isError(ret)) {
+ sr_perror(ret, "remote_desc_activity: poll error\n");
+ } else {
+ dlog(0, "POLLcond %d remote_desc_pollfdread %d\n",
+ remote_desc_pollfdread_activity.revents, remote_desc);
+ error_poll_cond();
+ }
+ retval = 2;
+ } else {
+ retval = sr_Res(ret);
}
dlog(1,
"remote_desc_activity %s %d last_looked_cntr %d looking_at %d"
" shared->written_by_vgdb %d shared->seen_by_valgrind %d"
- " ret %d\n",
+ " retval %d\n",
msg, remote_desc, last_looked_cntr, looking_at,
shared->written_by_vgdb, shared->seen_by_valgrind,
- ret);
+ retval);
/* if no error from poll, indicate we have "seen" up to looking_at */
- if (ret != 2)
+ if (retval == 1)
last_looked_cntr = looking_at;
- return ret;
+ return retval;
}
/* Convert hex digit A to a number. */
static unsigned char buf[PBUFSIZ];
static int bufcnt = 0;
static unsigned char *bufp;
- int ret;
+ SysRes ret;
if (bufcnt-- > 0)
return *bufp++;
wait for some characters to arrive */
remote_desc_pollfdread_activity.revents = 0;
ret = VG_(poll)(&remote_desc_pollfdread_activity, 1, -1);
- if (ret != 1) {
- dlog(0, "readchar: poll got %d\n", ret);
- return -1;
+ if (sr_isError(ret) || sr_Res(ret) != 1) {
+ if (sr_isError(ret)) {
+ sr_perror(ret, "readchar: poll error\n");
+ } else {
+ dlog(0, "readchar: poll got %d, expecting 1\n", (int)sr_Res(ret));
+ }
+ return -1;
}
if (single)
bufcnt = VG_(read) (remote_desc, buf, 1);