X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fglib-unix.c;h=3e6cdbe73f3b4ef9bc508a573e85e1b048925ab7;hb=30ed5f53e205e6bfc35126a9d3c62dac8a9c5dad;hp=6b5495b0dcd1df6fb48d7015896deea3971f92d5;hpb=c0eb77bfc8be7c30c271f2415c08f8f3186113c3;p=platform%2Fupstream%2Fglib.git diff --git a/glib/glib-unix.c b/glib/glib-unix.c index 6b5495b..3e6cdbe 100644 --- a/glib/glib-unix.c +++ b/glib/glib-unix.c @@ -14,15 +14,18 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . * * Authors: Colin Walters */ #include "config.h" +/* To make bionic export pipe2() */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + #include "glib-unix.h" #include "gmain-internal.h" @@ -43,11 +46,7 @@ * "glib-unix.h" header. */ -GQuark -g_unix_error_quark (void) -{ - return g_quark_from_static_string ("g-unix-error-quark"); -} +G_DEFINE_QUARK (g-unix-error-quark, g_unix_error) static gboolean g_unix_set_error_from_errno (GError **error, @@ -64,18 +63,17 @@ g_unix_set_error_from_errno (GError **error, /** * g_unix_open_pipe: * @fds: Array of two integers - * @flags: Bitfield of file descriptor flags, see "man 2 fcntl" + * @flags: Bitfield of file descriptor flags, as for fcntl() * @error: a #GError * * Similar to the UNIX pipe() call, but on modern systems like Linux * uses the pipe2() system call, which atomically creates a pipe with - * the configured flags. The only supported flag currently is - * %FD_CLOEXEC. If for example you want to configure %O_NONBLOCK, - * that must still be done separately with fcntl(). + * the configured flags. The only supported flag currently is + * %FD_CLOEXEC. If for example you want to configure %O_NONBLOCK, that + * must still be done separately with fcntl(). * - * This function does *not* take %O_CLOEXEC, it takes - * %FD_CLOEXEC as if for fcntl(); these are different on - * Linux/glibc. + * This function does not take %O_CLOEXEC, it takes %FD_CLOEXEC as if + * for fcntl(); these are different on Linux/glibc. * * Returns: %TRUE on success, %FALSE if not (and errno will be set). * @@ -108,7 +106,11 @@ g_unix_open_pipe (int *fds, ecode = pipe (fds); if (ecode == -1) return g_unix_set_error_from_errno (error, errno); - ecode = fcntl (fds[0], flags); + + if (flags == 0) + return TRUE; + + ecode = fcntl (fds[0], F_SETFD, flags); if (ecode == -1) { int saved_errno = errno; @@ -116,7 +118,7 @@ g_unix_open_pipe (int *fds, close (fds[1]); return g_unix_set_error_from_errno (error, saved_errno); } - ecode = fcntl (fds[1], flags); + ecode = fcntl (fds[1], F_SETFD, flags); if (ecode == -1) { int saved_errno = errno; @@ -134,7 +136,7 @@ g_unix_open_pipe (int *fds, * @error: a #GError * * Control the non-blocking state of the given file descriptor, - * according to @nonblock. On most systems this uses %O_NONBLOCK, but + * according to @nonblock. On most systems this uses %O_NONBLOCK, but * on some older ones may use %O_NDELAY. * * Returns: %TRUE if successful @@ -178,18 +180,20 @@ g_unix_set_fd_nonblocking (gint fd, #endif } - /** * g_unix_signal_source_new: * @signum: A signal number * * Create a #GSource that will be dispatched upon delivery of the UNIX - * signal @signum. Currently only %SIGHUP, %SIGINT, and %SIGTERM can - * be monitored. Note that unlike the UNIX default, all sources which - * have created a watch will be dispatched, regardless of which - * underlying thread invoked g_unix_signal_source_new(). + * signal @signum. In GLib versions before 2.36, only `SIGHUP`, `SIGINT`, + * `SIGTERM` can be monitored. In GLib 2.36, `SIGUSR1` and `SIGUSR2` + * were added. * - * For example, an effective use of this function is to handle SIGTERM + * Note that unlike the UNIX default, all sources which have created a + * watch will be dispatched, regardless of which underlying thread + * invoked g_unix_signal_source_new(). + * + * For example, an effective use of this function is to handle `SIGTERM` * cleanly; flushing any outstanding files, and then calling * g_main_loop_quit (). It is not safe to do any of this a regular * UNIX signal handler; your handler may be invoked while malloc() or @@ -200,12 +204,6 @@ g_unix_set_fd_nonblocking (gint fd, * The interaction of this source when combined with native UNIX * functions like sigprocmask() is not defined. * - * For reliable behavior, if your program links to gthread - * (either directly or indirectly via GObject, GIO, or a higher level - * library), you should ensure g_thread_init() is called before using - * this function. For example, if your program uses GObject, call - * g_type_init(). - * * The source will not initially be associated with any #GMainContext * and must be added to one with g_source_attach() before it will be * executed. @@ -217,7 +215,8 @@ g_unix_set_fd_nonblocking (gint fd, GSource * g_unix_signal_source_new (int signum) { - g_return_val_if_fail (signum == SIGHUP || signum == SIGINT || signum == SIGTERM, NULL); + g_return_val_if_fail (signum == SIGHUP || signum == SIGINT || signum == SIGTERM || + signum == SIGUSR1 || signum == SIGUSR2, NULL); return _g_main_create_unix_signal_watch (signum); } @@ -237,6 +236,7 @@ g_unix_signal_source_new (int signum) * * Returns: An ID (greater than 0) for the event source * + * Rename to: g_unix_signal_add * Since: 2.30 */ guint @@ -262,7 +262,7 @@ g_unix_signal_add_full (int priority, } /** - * g_unix_signal_add_full: + * g_unix_signal_add: * @signum: Signal number * @handler: Callback * @user_data: Data for @handler @@ -282,3 +282,142 @@ g_unix_signal_add (int signum, { return g_unix_signal_add_full (G_PRIORITY_DEFAULT, signum, handler, user_data, NULL); } + +typedef struct +{ + GSource source; + + gint fd; + gpointer tag; +} GUnixFDSource; + +static gboolean +g_unix_fd_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GUnixFDSource *fd_source = (GUnixFDSource *) source; + GUnixFDSourceFunc func = (GUnixFDSourceFunc) callback; + + if (!callback) + { + g_warning ("GUnixFDSource dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + return (* func) (fd_source->fd, g_source_query_unix_fd (source, fd_source->tag), user_data); +} + +GSourceFuncs g_unix_fd_source_funcs = { + NULL, NULL, g_unix_fd_source_dispatch, NULL +}; + +/** + * g_unix_fd_source_new: + * @fd: a file descriptor + * @condition: IO conditions to watch for on @fd + * + * Creates a #GSource to watch for a particular IO condition on a file + * descriptor. + * + * The source will never close the fd -- you must do it yourself. + * + * Returns: the newly created #GSource + * + * Since: 2.36 + **/ +GSource * +g_unix_fd_source_new (gint fd, + GIOCondition condition) +{ + GUnixFDSource *fd_source; + GSource *source; + + source = g_source_new (&g_unix_fd_source_funcs, sizeof (GUnixFDSource)); + fd_source = (GUnixFDSource *) source; + + fd_source->fd = fd; + fd_source->tag = g_source_add_unix_fd (source, fd, condition); + + return source; +} + +/** + * g_unix_fd_add_full: + * @priority: the priority of the source + * @fd: a file descriptor + * @condition: IO conditions to watch for on @fd + * @function: a #GUnixFDSourceFunc + * @user_data: data to pass to @function + * @notify: function to call when the idle is removed, or %NULL + * + * Sets a function to be called when the IO condition, as specified by + * @condition becomes true for @fd. + * + * This is the same as g_unix_fd_add(), except that it allows you to + * specify a non-default priority and a provide a #GDestroyNotify for + * @user_data. + * + * Returns: the ID (greater than 0) of the event source + * + * Since: 2.36 + **/ +guint +g_unix_fd_add_full (gint priority, + gint fd, + GIOCondition condition, + GUnixFDSourceFunc function, + gpointer user_data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (function != NULL, 0); + + source = g_unix_fd_source_new (fd, condition); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + + g_source_set_callback (source, (GSourceFunc) function, user_data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_unix_fd_add: + * @fd: a file descriptor + * @condition: IO conditions to watch for on @fd + * @function: a #GPollFDFunc + * @user_data: data to pass to @function + * + * Sets a function to be called when the IO condition, as specified by + * @condition becomes true for @fd. + * + * @function will be called when the specified IO condition becomes + * %TRUE. The function is expected to clear whatever event caused the + * IO condition to become true and return %TRUE in order to be notified + * when it happens again. If @function returns %FALSE then the watch + * will be cancelled. + * + * The return value of this function can be passed to g_source_remove() + * to cancel the watch at any time that it exists. + * + * The source will never close the fd -- you must do it yourself. + * + * Returns: the ID (greater than 0) of the event source + * + * Since: 2.36 + **/ +guint +g_unix_fd_add (gint fd, + GIOCondition condition, + GUnixFDSourceFunc function, + gpointer user_data) +{ + return g_unix_fd_add_full (G_PRIORITY_DEFAULT, fd, condition, function, user_data, NULL); +}