From: Mike Frysinger via Gdb-patches <gdb-patches@sourceware.org>
To: gdb-patches@sourceware.org
Subject: [PATCH 2/2] sim: use gnulib to set nonblocking mode
Date: Thu, 9 Sep 2021 02:38:36 -0400 [thread overview]
Message-ID: <20210909063836.16875-2-vapier@gentoo.org> (raw)
In-Reply-To: <20210909063836.16875-1-vapier@gentoo.org>
Replace various custom ad-hoc fcntl/O_NONBLOCK implementations with
the gnulib nonblocking module. This makes our code much tidier and
portable to other systems (e.g. Windows).
---
sim/bfin/dv-bfin_emac.c | 5 +++--
sim/common/dv-sockser.c | 11 +++--------
sim/common/sim-io.c | 22 +++++++---------------
sim/ppc/main.c | 20 ++++++--------------
4 files changed, 19 insertions(+), 39 deletions(-)
diff --git a/sim/bfin/dv-bfin_emac.c b/sim/bfin/dv-bfin_emac.c
index e5ceedbef514..b53191d3838a 100644
--- a/sim/bfin/dv-bfin_emac.c
+++ b/sim/bfin/dv-bfin_emac.c
@@ -35,6 +35,8 @@
#include <linux/if_tun.h>
#endif
+#include "nonblocking.h"
+
#ifdef HAVE_LINUX_IF_TUN_H
# define WITH_TUN 1
#else
@@ -570,8 +572,7 @@ bfin_emac_tap_init (struct hw *me)
return;
}
- flags = fcntl (emac->tap, F_GETFL);
- fcntl (emac->tap, F_SETFL, flags | O_NONBLOCK);
+ set_nonblocking_flag (emac->tap, true);
#endif
}
diff --git a/sim/common/dv-sockser.c b/sim/common/dv-sockser.c
index 477e8f681af7..5423765c66a3 100644
--- a/sim/common/dv-sockser.c
+++ b/sim/common/dv-sockser.c
@@ -24,9 +24,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <string.h>
#include <signal.h>
#include <stdlib.h>
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@@ -40,6 +37,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <sys/select.h>
#include <sys/socket.h>
+#include "nonblocking.h"
+
#include "sim-main.h"
#include "sim-assert.h"
#include "sim-options.h"
@@ -256,17 +255,13 @@ connected_p (SIM_DESC sd)
return 0;
/* Set non-blocking i/o. */
-#if defined(F_GETFL) && defined(O_NONBLOCK)
- flags = fcntl (sockser_fd, F_GETFL);
- flags |= O_NONBLOCK;
- if (fcntl (sockser_fd, F_SETFL, flags) == -1)
+ if (set_nonblocking_flag (sockser_fd, true))
{
sim_io_eprintf (sd, "unable to set nonblocking i/o");
close (sockser_fd);
sockser_fd = -1;
return 0;
}
-#endif
return 1;
}
diff --git a/sim/common/sim-io.c b/sim/common/sim-io.c
index a5a7ff17b067..9398cba57233 100644
--- a/sim/common/sim-io.c
+++ b/sim/common/sim-io.c
@@ -22,15 +22,14 @@
/* This must come before any other includes. */
#include "defs.h"
+#include "nonblocking.h"
+
#include "sim-main.h"
#include "sim-io.h"
#include "sim/callback.h"
#include "targ-vals.h"
#include <errno.h>
-#if HAVE_FCNTL_H
-#include <fcntl.h>
-#endif
#if HAVE_UNISTD_H
#include <unistd.h>
@@ -350,23 +349,20 @@ sim_io_poll_read (SIM_DESC sd,
char *buf,
int sizeof_buf)
{
-#if defined(O_NONBLOCK) && defined(F_GETFL) && defined(F_SETFL)
int fd = STATE_CALLBACK (sd)->fdmap[sim_io_fd];
- int flags;
int status;
int nr_read;
int result;
STATE_CALLBACK (sd)->last_errno = 0;
/* get the old status */
- flags = fcntl (fd, F_GETFL, 0);
- if (flags == -1)
+ status = get_nonblocking_flag (fd);
+ if (status == -1)
{
- perror ("sim_io_poll_read");
+ perror ("sim_io_read_stdin");
return 0;
}
/* temp, disable blocking IO */
- status = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
- if (status == -1)
+ if (status == 0 && set_nonblocking_flag (fd, true) == -1)
{
perror ("sim_io_read_stdin");
return 0;
@@ -384,16 +380,12 @@ sim_io_poll_read (SIM_DESC sd,
STATE_CALLBACK (sd)->last_errno = errno;
}
/* return to regular vewing */
- status = fcntl (fd, F_SETFL, flags);
- if (status == -1)
+ if (status == 0 && set_nonblocking_flag (fd, false) == -1)
{
perror ("sim_io_read_stdin");
/* return 0; */
}
return result;
-#else
- return sim_io_read (sd, sim_io_fd, buf, sizeof_buf);
-#endif
}
int
diff --git a/sim/ppc/main.c b/sim/ppc/main.c
index d9a40700973d..f64b163afea7 100644
--- a/sim/ppc/main.c
+++ b/sim/ppc/main.c
@@ -26,6 +26,8 @@
#include <signal.h>
+#include "nonblocking.h"
+
#include "psim.h"
#include "options.h"
#include "device.h" /* FIXME: psim should provide the interface */
@@ -42,11 +44,6 @@
#include <string.h>
#include <errno.h>
-#if !defined(O_NONBLOCK) || !defined(F_GETFL) || !defined(F_SETFL)
-#undef WITH_STDIO
-#define WITH_STDIO DO_USE_STDIO
-#endif
-
extern char **environ;
@@ -152,22 +149,19 @@ sim_io_read_stdin(char *buf,
return sim_io_eof;
break;
case DONT_USE_STDIO:
-#if defined(O_NONBLOCK) && defined(F_GETFL) && defined(F_SETFL)
{
/* check for input */
- int flags;
int status;
int nr_read;
int result;
/* get the old status */
- flags = fcntl(0, F_GETFL, 0);
- if (flags == -1) {
+ status = get_nonblocking_flag (0);
+ if (status == -1) {
perror("sim_io_read_stdin");
return sim_io_eof;
}
/* temp, disable blocking IO */
- status = fcntl(0, F_SETFL, flags | O_NONBLOCK);
- if (status == -1) {
+ if (status == 0 && set_nonblocking_flag (0, true) == -1) {
perror("sim_io_read_stdin");
return sim_io_eof;
}
@@ -185,15 +179,13 @@ sim_io_read_stdin(char *buf,
result = sim_io_eof;
}
/* return to regular vewing */
- status = fcntl(0, F_SETFL, flags);
- if (status == -1) {
+ if (status == 0 && set_nonblocking_flag (0, false) == -1) {
perror("sim_io_read_stdin");
return sim_io_eof;
}
return result;
}
break;
-#endif
default:
error("sim_io_read_stdin: invalid switch\n");
break;
--
2.33.0
next prev parent reply other threads:[~2021-09-09 6:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-09 6:38 [PATCH 1/2] gnulib: import nonblocking module Mike Frysinger via Gdb-patches
2021-09-09 6:38 ` Mike Frysinger via Gdb-patches [this message]
2021-09-09 7:24 ` [PATCH 2/2] sim: use gnulib to set nonblocking mode Eli Zaretskii via Gdb-patches
2021-09-09 7:33 ` Mike Frysinger via Gdb-patches
2021-09-09 7:44 ` Eli Zaretskii via Gdb-patches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210909063836.16875-2-vapier@gentoo.org \
--to=gdb-patches@sourceware.org \
--cc=vapier@gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox