g_unix_set_fd_nonblocking: New API to control file descriptor blocking state

And use it in relevant places in GLib.

https://bugzilla.gnome.org/show_bug.cgi?id=649225
This commit is contained in:
Colin Walters
2011-05-03 09:52:10 -04:00
parent e08e70e08d
commit ed37970a04
6 changed files with 69 additions and 32 deletions

View File

@@ -21,11 +21,10 @@
*/
#include "config.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#include "glib.h"
#ifdef G_OS_UNIX
#include "glib-unix.h"
#endif
#include <errno.h>
#include <fcntl.h>
#include <gioerror.h>
#ifdef G_OS_WIN32
#include <windows.h>
@@ -193,22 +192,6 @@ g_cancellable_class_init (GCancellableClass *klass)
}
#ifndef G_OS_WIN32
static void
set_fd_nonblocking (int fd)
{
#ifdef F_GETFL
glong fcntl_flags;
fcntl_flags = fcntl (fd, F_GETFL);
#ifdef O_NONBLOCK
fcntl_flags |= O_NONBLOCK;
#else
fcntl_flags |= O_NDELAY;
#endif
fcntl (fd, F_SETFL, fcntl_flags);
#endif
}
static void
set_fd_close_exec (int fd)
@@ -235,8 +218,8 @@ g_cancellable_open_pipe (GCancellable *cancellable)
/* Make them nonblocking, just to be sure we don't block
* on errors and stuff
*/
set_fd_nonblocking (priv->cancel_pipe[0]);
set_fd_nonblocking (priv->cancel_pipe[1]);
g_unix_set_fd_nonblocking (priv->cancel_pipe[0], TRUE, NULL);
g_unix_set_fd_nonblocking (priv->cancel_pipe[1], TRUE, NULL);
set_fd_close_exec (priv->cancel_pipe[0]);
set_fd_close_exec (priv->cancel_pipe[1]);

View File

@@ -29,6 +29,10 @@
#include "gsocket.h"
#ifdef G_OS_UNIX
#include "glib-unix.h"
#endif
#include <errno.h>
#include <signal.h>
#include <string.h>
@@ -240,22 +244,17 @@ static void
set_fd_nonblocking (int fd)
{
#ifndef G_OS_WIN32
glong arg;
GError *error = NULL;
#else
gulong arg;
#endif
#ifndef G_OS_WIN32
if ((arg = fcntl (fd, F_GETFL, NULL)) < 0)
if (!g_unix_set_fd_nonblocking (fd, TRUE, &error))
{
g_warning ("Error getting socket status flags: %s", socket_strerror (errno));
arg = 0;
g_warning ("Error setting socket nonblocking: %s", error->message);
g_clear_error (&error);
}
arg = arg | O_NONBLOCK;
if (fcntl (fd, F_SETFL, arg) < 0)
g_warning ("Error setting socket status flags: %s", socket_strerror (errno));
#else
arg = TRUE;