2007-10-31 14:44:14 +00:00
|
|
|
/*
|
2007-11-01 13:11:11 +00:00
|
|
|
* libev event processing core, watcher management
|
|
|
|
*
|
2011-01-10 01:58:54 +00:00
|
|
|
* Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>
|
2007-10-31 14:44:14 +00:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
2007-12-25 07:05:45 +00:00
|
|
|
* Redistribution and use in source and binary forms, with or without modifica-
|
|
|
|
* tion, are permitted provided that the following conditions are met:
|
2011-02-16 08:02:49 +00:00
|
|
|
*
|
2007-12-25 07:05:45 +00:00
|
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
2011-02-16 08:02:49 +00:00
|
|
|
*
|
2007-12-25 07:05:45 +00:00
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
2011-02-16 08:02:49 +00:00
|
|
|
*
|
2007-12-25 07:05:45 +00:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
|
|
|
|
* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
|
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
|
|
|
|
* CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
|
|
|
|
* ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
|
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
2007-10-31 14:44:14 +00:00
|
|
|
*
|
2007-12-25 07:05:45 +00:00
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* the GNU General Public License ("GPL") version 2 or any later version,
|
|
|
|
* in which case the provisions of the GPL are applicable instead of
|
|
|
|
* the above. If you wish to allow the use of your version of this file
|
|
|
|
* only under the terms of the GPL and not to allow others to use your
|
|
|
|
* version of this file under the BSD license, indicate your decision
|
|
|
|
* by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL. If you do not delete the
|
|
|
|
* provisions above, a recipient may use your version of this file under
|
|
|
|
* either the BSD or the GPL.
|
2007-10-31 14:44:14 +00:00
|
|
|
*/
|
2007-11-10 03:36:15 +00:00
|
|
|
|
2008-04-06 09:53:16 +00:00
|
|
|
/* this big block deduces configuration from config.h */
|
2007-11-04 18:15:16 +00:00
|
|
|
#ifndef EV_STANDALONE
|
2007-11-23 11:32:21 +00:00
|
|
|
# ifdef EV_CONFIG_H
|
|
|
|
# include EV_CONFIG_H
|
|
|
|
# else
|
|
|
|
# include "config.h"
|
|
|
|
# endif
|
2007-11-04 18:29:44 +00:00
|
|
|
|
2011-02-20 02:56:23 +00:00
|
|
|
#if HAVE_FLOOR
|
|
|
|
# ifndef EV_USE_FLOOR
|
|
|
|
# define EV_USE_FLOOR 1
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2008-11-20 00:35:10 +00:00
|
|
|
# if HAVE_CLOCK_SYSCALL
|
|
|
|
# ifndef EV_USE_CLOCK_SYSCALL
|
|
|
|
# define EV_USE_CLOCK_SYSCALL 1
|
|
|
|
# ifndef EV_USE_REALTIME
|
|
|
|
# define EV_USE_REALTIME 0
|
|
|
|
# endif
|
|
|
|
# ifndef EV_USE_MONOTONIC
|
|
|
|
# define EV_USE_MONOTONIC 1
|
|
|
|
# endif
|
|
|
|
# endif
|
2009-06-29 04:41:34 +00:00
|
|
|
# elif !defined(EV_USE_CLOCK_SYSCALL)
|
|
|
|
# define EV_USE_CLOCK_SYSCALL 0
|
2008-11-20 00:35:10 +00:00
|
|
|
# endif
|
|
|
|
|
2007-11-04 18:29:44 +00:00
|
|
|
# if HAVE_CLOCK_GETTIME
|
2007-11-11 01:53:07 +00:00
|
|
|
# ifndef EV_USE_MONOTONIC
|
|
|
|
# define EV_USE_MONOTONIC 1
|
|
|
|
# endif
|
|
|
|
# ifndef EV_USE_REALTIME
|
2009-02-06 20:17:43 +00:00
|
|
|
# define EV_USE_REALTIME 0
|
2007-11-11 01:53:07 +00:00
|
|
|
# endif
|
2007-11-18 01:25:23 +00:00
|
|
|
# else
|
|
|
|
# ifndef EV_USE_MONOTONIC
|
|
|
|
# define EV_USE_MONOTONIC 0
|
|
|
|
# endif
|
|
|
|
# ifndef EV_USE_REALTIME
|
|
|
|
# define EV_USE_REALTIME 0
|
|
|
|
# endif
|
2007-11-04 18:29:44 +00:00
|
|
|
# endif
|
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_NANOSLEEP
|
|
|
|
# ifndef EV_USE_NANOSLEEP
|
|
|
|
# define EV_USE_NANOSLEEP EV_FEATURE_OS
|
2007-12-22 05:47:56 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_NANOSLEEP
|
|
|
|
# define EV_USE_NANOSLEEP 0
|
2007-12-22 05:47:56 +00:00
|
|
|
# endif
|
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_SELECT && HAVE_SYS_SELECT_H
|
|
|
|
# ifndef EV_USE_SELECT
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_SELECT EV_FEATURE_BACKENDS
|
2007-11-18 02:17:57 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_SELECT
|
|
|
|
# define EV_USE_SELECT 0
|
2007-11-04 18:29:44 +00:00
|
|
|
# endif
|
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_POLL && HAVE_POLL_H
|
|
|
|
# ifndef EV_USE_POLL
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_POLL EV_FEATURE_BACKENDS
|
2007-11-18 02:17:57 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_POLL
|
|
|
|
# define EV_USE_POLL 0
|
2007-11-04 18:29:44 +00:00
|
|
|
# endif
|
2007-11-18 02:17:57 +00:00
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H
|
|
|
|
# ifndef EV_USE_EPOLL
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_EPOLL EV_FEATURE_BACKENDS
|
2007-11-18 02:17:57 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_EPOLL
|
|
|
|
# define EV_USE_EPOLL 0
|
2007-11-04 18:29:44 +00:00
|
|
|
# endif
|
2007-11-18 02:17:57 +00:00
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_KQUEUE && HAVE_SYS_EVENT_H
|
|
|
|
# ifndef EV_USE_KQUEUE
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_KQUEUE EV_FEATURE_BACKENDS
|
2007-11-18 02:17:57 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_KQUEUE
|
|
|
|
# define EV_USE_KQUEUE 0
|
2007-11-04 18:29:44 +00:00
|
|
|
# endif
|
2007-11-18 02:17:57 +00:00
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_PORT_H && HAVE_PORT_CREATE
|
|
|
|
# ifndef EV_USE_PORT
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_PORT EV_FEATURE_BACKENDS
|
2007-11-18 02:17:57 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_PORT
|
|
|
|
# define EV_USE_PORT 0
|
2007-11-16 01:33:53 +00:00
|
|
|
# endif
|
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H
|
|
|
|
# ifndef EV_USE_INOTIFY
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_INOTIFY EV_FEATURE_OS
|
2007-11-28 11:15:55 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_INOTIFY
|
|
|
|
# define EV_USE_INOTIFY 0
|
2007-11-28 11:15:55 +00:00
|
|
|
# endif
|
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H
|
|
|
|
# ifndef EV_USE_SIGNALFD
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_SIGNALFD EV_FEATURE_OS
|
2009-07-19 01:36:34 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_SIGNALFD
|
|
|
|
# define EV_USE_SIGNALFD 0
|
2009-07-19 01:36:34 +00:00
|
|
|
# endif
|
|
|
|
|
2010-04-02 21:03:45 +00:00
|
|
|
# if HAVE_EVENTFD
|
|
|
|
# ifndef EV_USE_EVENTFD
|
2010-03-16 00:43:22 +00:00
|
|
|
# define EV_USE_EVENTFD EV_FEATURE_OS
|
2008-04-06 09:53:16 +00:00
|
|
|
# endif
|
2010-04-02 21:03:45 +00:00
|
|
|
# else
|
|
|
|
# undef EV_USE_EVENTFD
|
|
|
|
# define EV_USE_EVENTFD 0
|
2008-04-06 09:53:16 +00:00
|
|
|
# endif
|
2008-05-22 02:44:57 +00:00
|
|
|
|
2007-11-01 08:10:03 +00:00
|
|
|
#endif
|
2007-10-31 14:44:14 +00:00
|
|
|
|
2007-10-30 20:59:31 +00:00
|
|
|
#include <stdlib.h>
|
2009-11-18 10:25:22 +00:00
|
|
|
#include <string.h>
|
2007-10-31 00:24:16 +00:00
|
|
|
#include <fcntl.h>
|
2007-10-31 13:57:34 +00:00
|
|
|
#include <stddef.h>
|
2007-10-30 20:59:31 +00:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2007-10-30 23:10:33 +00:00
|
|
|
#include <assert.h>
|
2007-10-30 20:59:31 +00:00
|
|
|
#include <errno.h>
|
2007-10-31 19:07:43 +00:00
|
|
|
#include <sys/types.h>
|
2007-11-06 13:17:55 +00:00
|
|
|
#include <time.h>
|
2010-01-26 04:19:37 +00:00
|
|
|
#include <limits.h>
|
2007-11-06 13:17:55 +00:00
|
|
|
|
2007-11-06 16:09:37 +00:00
|
|
|
#include <signal.h>
|
2007-11-06 13:17:55 +00:00
|
|
|
|
2007-11-28 11:15:55 +00:00
|
|
|
#ifdef EV_H
|
|
|
|
# include EV_H
|
|
|
|
#else
|
|
|
|
# include "ev.h"
|
|
|
|
#endif
|
|
|
|
|
2010-10-22 09:24:11 +00:00
|
|
|
EV_CPP(extern "C" {)
|
|
|
|
|
2007-11-12 00:31:08 +00:00
|
|
|
#ifndef _WIN32
|
2007-11-06 13:17:55 +00:00
|
|
|
# include <sys/time.h>
|
2007-11-03 09:19:58 +00:00
|
|
|
# include <sys/wait.h>
|
2007-11-26 19:49:36 +00:00
|
|
|
# include <unistd.h>
|
2007-11-12 00:31:08 +00:00
|
|
|
#else
|
2008-06-19 06:53:49 +00:00
|
|
|
# include <io.h>
|
2007-11-12 00:31:08 +00:00
|
|
|
# define WIN32_LEAN_AND_MEAN
|
|
|
|
# include <windows.h>
|
|
|
|
# ifndef EV_SELECT_IS_WINSOCKET
|
|
|
|
# define EV_SELECT_IS_WINSOCKET 1
|
|
|
|
# endif
|
2010-03-09 08:55:03 +00:00
|
|
|
# undef EV_AVOID_STDIO
|
2007-11-03 09:19:58 +00:00
|
|
|
#endif
|
2007-11-12 00:31:08 +00:00
|
|
|
|
2010-07-09 20:55:14 +00:00
|
|
|
/* OS X, in its infinite idiocy, actually HARDCODES
|
|
|
|
* a limit of 1024 into their select. Where people have brains,
|
|
|
|
* OS X engineers apparently have a vacuum. Or maybe they were
|
|
|
|
* ordered to have a vacuum, or they do anything for money.
|
|
|
|
* This might help. Or not.
|
|
|
|
*/
|
|
|
|
#define _DARWIN_UNLIMITED_SELECT 1
|
|
|
|
|
2008-04-06 09:53:16 +00:00
|
|
|
/* this block tries to deduce configuration from header-defined symbols and defaults */
|
2007-11-02 11:02:23 +00:00
|
|
|
|
2009-07-19 03:49:04 +00:00
|
|
|
/* try to deduce the maximum number of signals on this platform */
|
|
|
|
#if defined (EV_NSIG)
|
|
|
|
/* use what's provided */
|
|
|
|
#elif defined (NSIG)
|
|
|
|
# define EV_NSIG (NSIG)
|
|
|
|
#elif defined(_NSIG)
|
|
|
|
# define EV_NSIG (_NSIG)
|
|
|
|
#elif defined (SIGMAX)
|
|
|
|
# define EV_NSIG (SIGMAX+1)
|
|
|
|
#elif defined (SIG_MAX)
|
|
|
|
# define EV_NSIG (SIG_MAX+1)
|
|
|
|
#elif defined (_SIG_MAX)
|
|
|
|
# define EV_NSIG (_SIG_MAX+1)
|
|
|
|
#elif defined (MAXSIG)
|
|
|
|
# define EV_NSIG (MAXSIG+1)
|
|
|
|
#elif defined (MAX_SIG)
|
|
|
|
# define EV_NSIG (MAX_SIG+1)
|
|
|
|
#elif defined (SIGARRAYSIZE)
|
2010-03-10 08:19:38 +00:00
|
|
|
# define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */
|
2009-07-19 03:49:04 +00:00
|
|
|
#elif defined (_sys_nsig)
|
|
|
|
# define EV_NSIG (_sys_nsig) /* Solaris 2.5 */
|
|
|
|
#else
|
|
|
|
# error "unable to find value for NSIG, please report"
|
2010-03-10 08:19:38 +00:00
|
|
|
/* to make it compile regardless, just remove the above line, */
|
|
|
|
/* but consider reporting it, too! :) */
|
2009-07-19 06:35:25 +00:00
|
|
|
# define EV_NSIG 65
|
2009-07-19 03:49:04 +00:00
|
|
|
#endif
|
|
|
|
|
2011-02-20 02:56:23 +00:00
|
|
|
#ifndef EV_USE_FLOOR
|
|
|
|
# define EV_USE_FLOOR 0
|
|
|
|
#endif
|
|
|
|
|
2008-11-20 00:35:10 +00:00
|
|
|
#ifndef EV_USE_CLOCK_SYSCALL
|
|
|
|
# if __linux && __GLIBC__ >= 2
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_CLOCK_SYSCALL EV_FEATURE_OS
|
2008-11-20 00:35:10 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_CLOCK_SYSCALL 0
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2007-11-01 08:10:03 +00:00
|
|
|
#ifndef EV_USE_MONOTONIC
|
2008-05-31 03:13:26 +00:00
|
|
|
# if defined (_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_MONOTONIC EV_FEATURE_OS
|
2008-05-31 03:13:26 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_MONOTONIC 0
|
|
|
|
# endif
|
2007-11-01 13:33:12 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-16 01:33:53 +00:00
|
|
|
#ifndef EV_USE_REALTIME
|
2009-02-06 20:17:43 +00:00
|
|
|
# define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL
|
2007-11-16 01:33:53 +00:00
|
|
|
#endif
|
|
|
|
|
2007-12-22 05:47:56 +00:00
|
|
|
#ifndef EV_USE_NANOSLEEP
|
2008-05-31 03:13:26 +00:00
|
|
|
# if _POSIX_C_SOURCE >= 199309L
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_NANOSLEEP EV_FEATURE_OS
|
2008-05-31 03:13:26 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_NANOSLEEP 0
|
|
|
|
# endif
|
2007-12-22 05:47:56 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-01 08:10:03 +00:00
|
|
|
#ifndef EV_USE_SELECT
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_SELECT EV_FEATURE_BACKENDS
|
2007-10-31 07:36:03 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-04 18:15:16 +00:00
|
|
|
#ifndef EV_USE_POLL
|
2007-11-12 00:39:45 +00:00
|
|
|
# ifdef _WIN32
|
|
|
|
# define EV_USE_POLL 0
|
|
|
|
# else
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_POLL EV_FEATURE_BACKENDS
|
2007-11-12 00:39:45 +00:00
|
|
|
# endif
|
2007-11-02 16:54:34 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-01 08:10:03 +00:00
|
|
|
#ifndef EV_USE_EPOLL
|
2008-04-06 09:53:16 +00:00
|
|
|
# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_EPOLL EV_FEATURE_BACKENDS
|
2008-04-06 09:53:16 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_EPOLL 0
|
|
|
|
# endif
|
2007-10-31 07:36:03 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-02 20:59:14 +00:00
|
|
|
#ifndef EV_USE_KQUEUE
|
|
|
|
# define EV_USE_KQUEUE 0
|
|
|
|
#endif
|
|
|
|
|
2007-11-16 01:33:53 +00:00
|
|
|
#ifndef EV_USE_PORT
|
|
|
|
# define EV_USE_PORT 0
|
2007-11-02 11:02:23 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-28 11:15:55 +00:00
|
|
|
#ifndef EV_USE_INOTIFY
|
2008-04-06 09:53:16 +00:00
|
|
|
# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_INOTIFY EV_FEATURE_OS
|
2008-04-06 09:53:16 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_INOTIFY 0
|
|
|
|
# endif
|
2007-11-28 11:15:55 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-27 19:23:31 +00:00
|
|
|
#ifndef EV_PID_HASHSIZE
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_PID_HASHSIZE EV_FEATURE_DATA ? 16 : 1
|
2007-11-27 19:23:31 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-28 11:15:55 +00:00
|
|
|
#ifndef EV_INOTIFY_HASHSIZE
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_INOTIFY_HASHSIZE EV_FEATURE_DATA ? 16 : 1
|
2007-11-28 11:15:55 +00:00
|
|
|
#endif
|
|
|
|
|
2008-04-06 09:53:16 +00:00
|
|
|
#ifndef EV_USE_EVENTFD
|
|
|
|
# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_EVENTFD EV_FEATURE_OS
|
2008-04-06 09:53:16 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_EVENTFD 0
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2009-07-19 01:36:34 +00:00
|
|
|
#ifndef EV_USE_SIGNALFD
|
2009-08-26 17:31:20 +00:00
|
|
|
# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_SIGNALFD EV_FEATURE_OS
|
2009-07-19 01:36:34 +00:00
|
|
|
# else
|
|
|
|
# define EV_USE_SIGNALFD 0
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2008-05-21 23:30:52 +00:00
|
|
|
#if 0 /* debugging */
|
2008-05-22 02:44:57 +00:00
|
|
|
# define EV_VERIFY 3
|
2008-05-21 23:30:52 +00:00
|
|
|
# define EV_USE_4HEAP 1
|
|
|
|
# define EV_HEAP_CACHE_AT 1
|
|
|
|
#endif
|
|
|
|
|
2008-05-22 02:44:57 +00:00
|
|
|
#ifndef EV_VERIFY
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_VERIFY (EV_FEATURE_API ? 1 : 0)
|
2008-05-22 02:44:57 +00:00
|
|
|
#endif
|
|
|
|
|
2008-05-09 15:52:13 +00:00
|
|
|
#ifndef EV_USE_4HEAP
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_USE_4HEAP EV_FEATURE_DATA
|
2008-05-09 15:52:13 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef EV_HEAP_CACHE_AT
|
2010-03-16 00:20:16 +00:00
|
|
|
# define EV_HEAP_CACHE_AT EV_FEATURE_DATA
|
2008-05-09 15:52:13 +00:00
|
|
|
#endif
|
|
|
|
|
2009-06-29 04:41:34 +00:00
|
|
|
/* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */
|
|
|
|
/* which makes programs even slower. might work on other unices, too. */
|
|
|
|
#if EV_USE_CLOCK_SYSCALL
|
|
|
|
# include <syscall.h>
|
|
|
|
# ifdef SYS_clock_gettime
|
|
|
|
# define clock_gettime(id, ts) syscall (SYS_clock_gettime, (id), (ts))
|
|
|
|
# undef EV_USE_MONOTONIC
|
|
|
|
# define EV_USE_MONOTONIC 1
|
|
|
|
# else
|
|
|
|
# undef EV_USE_CLOCK_SYSCALL
|
|
|
|
# define EV_USE_CLOCK_SYSCALL 0
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2008-04-06 09:53:16 +00:00
|
|
|
/* this block fixes any misconfiguration where we know we run into trouble otherwise */
|
2007-11-02 11:02:23 +00:00
|
|
|
|
2010-01-24 12:31:55 +00:00
|
|
|
#ifdef _AIX
|
|
|
|
/* AIX has a completely broken poll.h header */
|
|
|
|
# undef EV_USE_POLL
|
|
|
|
# define EV_USE_POLL 0
|
|
|
|
#endif
|
|
|
|
|
2007-11-02 11:02:23 +00:00
|
|
|
#ifndef CLOCK_MONOTONIC
|
|
|
|
# undef EV_USE_MONOTONIC
|
|
|
|
# define EV_USE_MONOTONIC 0
|
|
|
|
#endif
|
|
|
|
|
2007-11-01 09:05:33 +00:00
|
|
|
#ifndef CLOCK_REALTIME
|
2007-11-02 11:02:23 +00:00
|
|
|
# undef EV_USE_REALTIME
|
2007-11-01 09:05:33 +00:00
|
|
|
# define EV_USE_REALTIME 0
|
|
|
|
#endif
|
2007-11-02 11:02:23 +00:00
|
|
|
|
2007-11-28 11:15:55 +00:00
|
|
|
#if !EV_STAT_ENABLE
|
2007-12-14 18:22:30 +00:00
|
|
|
# undef EV_USE_INOTIFY
|
2007-11-28 11:15:55 +00:00
|
|
|
# define EV_USE_INOTIFY 0
|
|
|
|
#endif
|
|
|
|
|
2007-12-22 05:47:56 +00:00
|
|
|
#if !EV_USE_NANOSLEEP
|
2011-01-30 19:05:40 +00:00
|
|
|
/* hp-ux has it in sys/time.h, which we unconditionally include above */
|
|
|
|
# if !defined(_WIN32) && !defined(__hpux)
|
2007-12-22 05:47:56 +00:00
|
|
|
# include <sys/select.h>
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2007-11-28 11:15:55 +00:00
|
|
|
#if EV_USE_INOTIFY
|
2008-11-03 14:27:06 +00:00
|
|
|
# include <sys/statfs.h>
|
2007-11-28 11:15:55 +00:00
|
|
|
# include <sys/inotify.h>
|
2008-10-01 18:50:03 +00:00
|
|
|
/* some very old inotify.h headers don't have IN_DONT_FOLLOW */
|
|
|
|
# ifndef IN_DONT_FOLLOW
|
|
|
|
# undef EV_USE_INOTIFY
|
|
|
|
# define EV_USE_INOTIFY 0
|
|
|
|
# endif
|
2007-11-28 11:15:55 +00:00
|
|
|
#endif
|
|
|
|
|
2007-12-14 18:22:30 +00:00
|
|
|
#if EV_SELECT_IS_WINSOCKET
|
|
|
|
# include <winsock.h>
|
|
|
|
#endif
|
|
|
|
|
2008-04-06 09:53:16 +00:00
|
|
|
#if EV_USE_EVENTFD
|
|
|
|
/* our minimum requirement is glibc 2.7 which has the stub, but not the header */
|
2008-04-06 12:44:49 +00:00
|
|
|
# include <stdint.h>
|
2009-07-19 01:36:34 +00:00
|
|
|
# ifndef EFD_NONBLOCK
|
|
|
|
# define EFD_NONBLOCK O_NONBLOCK
|
|
|
|
# endif
|
|
|
|
# ifndef EFD_CLOEXEC
|
2009-07-29 09:36:05 +00:00
|
|
|
# ifdef O_CLOEXEC
|
|
|
|
# define EFD_CLOEXEC O_CLOEXEC
|
|
|
|
# else
|
|
|
|
# define EFD_CLOEXEC 02000000
|
|
|
|
# endif
|
2009-07-19 01:36:34 +00:00
|
|
|
# endif
|
2010-10-22 09:24:11 +00:00
|
|
|
EV_CPP(extern "C") int (eventfd) (unsigned int initval, int flags);
|
2008-04-06 09:53:16 +00:00
|
|
|
#endif
|
|
|
|
|
2009-07-19 01:36:34 +00:00
|
|
|
#if EV_USE_SIGNALFD
|
2009-08-26 17:31:20 +00:00
|
|
|
/* our minimum requirement is glibc 2.7 which has the stub, but not the header */
|
|
|
|
# include <stdint.h>
|
|
|
|
# ifndef SFD_NONBLOCK
|
|
|
|
# define SFD_NONBLOCK O_NONBLOCK
|
|
|
|
# endif
|
|
|
|
# ifndef SFD_CLOEXEC
|
|
|
|
# ifdef O_CLOEXEC
|
|
|
|
# define SFD_CLOEXEC O_CLOEXEC
|
|
|
|
# else
|
|
|
|
# define SFD_CLOEXEC 02000000
|
|
|
|
# endif
|
|
|
|
# endif
|
2010-10-22 09:24:11 +00:00
|
|
|
EV_CPP (extern "C") int signalfd (int fd, const sigset_t *mask, int flags);
|
2009-08-26 17:31:20 +00:00
|
|
|
|
|
|
|
struct signalfd_siginfo
|
|
|
|
{
|
|
|
|
uint32_t ssi_signo;
|
|
|
|
char pad[128 - sizeof (uint32_t)];
|
|
|
|
};
|
2009-07-19 01:36:34 +00:00
|
|
|
#endif
|
|
|
|
|
2007-11-02 11:02:23 +00:00
|
|
|
/**/
|
2007-10-30 20:59:31 +00:00
|
|
|
|
2008-05-22 02:44:57 +00:00
|
|
|
#if EV_VERIFY >= 3
|
2010-03-16 20:39:29 +00:00
|
|
|
# define EV_FREQUENT_CHECK ev_verify (EV_A)
|
2008-05-21 23:25:21 +00:00
|
|
|
#else
|
|
|
|
# define EV_FREQUENT_CHECK do { } while (0)
|
|
|
|
#endif
|
|
|
|
|
2007-12-11 04:31:55 +00:00
|
|
|
/*
|
2011-02-20 02:56:23 +00:00
|
|
|
* This is used to work around floating point rounding problems.
|
2007-12-11 15:06:50 +00:00
|
|
|
* This value is good at least till the year 4000.
|
2007-12-11 04:31:55 +00:00
|
|
|
*/
|
2011-02-20 02:56:23 +00:00
|
|
|
#define MIN_INTERVAL 0.0001220703125 /* 1/2**13, good till 4000 */
|
|
|
|
/*#define MIN_INTERVAL 0.00000095367431640625 /* 1/2**20, good till 2200 */
|
2007-12-11 04:31:55 +00:00
|
|
|
|
2007-10-30 23:10:33 +00:00
|
|
|
#define MIN_TIMEJUMP 1. /* minimum timejump that gets detected (if monotonic clock available) */
|
2007-11-16 01:54:25 +00:00
|
|
|
#define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */
|
2007-10-30 20:59:31 +00:00
|
|
|
|
2010-10-15 22:44:41 +00:00
|
|
|
#define EV_TV_SET(tv,t) do { tv.tv_sec = (long)t; tv.tv_usec = (long)((t - tv.tv_sec) * 1e6); } while (0)
|
2010-10-15 22:48:25 +00:00
|
|
|
#define EV_TS_SET(ts,t) do { ts.tv_sec = (long)t; ts.tv_nsec = (long)((t - ts.tv_sec) * 1e9); } while (0)
|
2010-10-15 22:44:41 +00:00
|
|
|
|
2011-06-19 17:55:13 +00:00
|
|
|
/* the following are taken from libecb */
|
|
|
|
/* ecb.h start */
|
|
|
|
|
|
|
|
/* many compilers define _GNUC_ to some versions but then only implement
|
|
|
|
* what their idiot authors think are the "more important" extensions,
|
|
|
|
* causing enourmous grief in return for some better fake benchmark numbers.
|
|
|
|
* or so.
|
|
|
|
* we try to detect these and simply assume they are not gcc - if they have
|
|
|
|
* an issue with that they should have done it right in the first place.
|
|
|
|
*/
|
|
|
|
#ifndef ECB_GCC_VERSION
|
|
|
|
#if !defined(__GNUC_MINOR__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__llvm__) || defined(__clang__)
|
|
|
|
#define ECB_GCC_VERSION(major,minor) 0
|
|
|
|
#else
|
|
|
|
#define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if __cplusplus
|
|
|
|
#define ecb_inline static inline
|
|
|
|
#elif ECB_GCC_VERSION(2,5)
|
|
|
|
#define ecb_inline static __inline__
|
|
|
|
#elif ECB_C99
|
|
|
|
#define ecb_inline static inline
|
2007-11-02 11:02:23 +00:00
|
|
|
#else
|
2011-06-19 17:55:13 +00:00
|
|
|
#define ecb_inline static
|
2007-11-02 11:02:23 +00:00
|
|
|
#endif
|
|
|
|
|
2011-07-20 00:40:14 +00:00
|
|
|
#ifndef ECB_MEMORY_FENCE
|
|
|
|
#if ECB_GCC_VERSION(2,5)
|
|
|
|
#if __x86
|
|
|
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("lock; orb $0, -1(%%esp)" : : : "memory")
|
|
|
|
#define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
|
2011-07-29 12:17:26 +00:00
|
|
|
#define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE /* better be safe than sorry */
|
2011-07-20 00:40:14 +00:00
|
|
|
#elif __amd64
|
|
|
|
#define ECB_MEMORY_FENCE __asm__ __volatile__ ("mfence" : : : "memory")
|
|
|
|
#define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("lfence" : : : "memory")
|
|
|
|
#define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("sfence")
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef ECB_MEMORY_FENCE
|
|
|
|
#if ECB_GCC_VERSION(4,4)
|
|
|
|
#define ECB_MEMORY_FENCE __sync_synchronize ()
|
|
|
|
#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); })
|
|
|
|
#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); })
|
2011-08-03 15:31:23 +00:00
|
|
|
#elif _MSC_VER >= 1400 /* VC++ 2005 */
|
|
|
|
#pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)
|
|
|
|
#define ECB_MEMORY_FENCE _ReadWriteBarrier ()
|
|
|
|
#define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */
|
|
|
|
#define ECB_MEMORY_FENCE_RELEASE _WriteBarrier ()
|
2011-07-29 12:17:26 +00:00
|
|
|
#elif defined(_WIN32)
|
|
|
|
#include <WinNT.h>
|
2011-07-20 00:40:14 +00:00
|
|
|
#define ECB_MEMORY_FENCE MemoryBarrier ()
|
|
|
|
#define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
|
|
|
|
#define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef ECB_MEMORY_FENCE
|
|
|
|
#include <pthread.h>
|
|
|
|
|
|
|
|
static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
#define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0)
|
|
|
|
#define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE
|
|
|
|
#define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE
|
|
|
|
#endif
|
|
|
|
|
2011-06-19 17:55:13 +00:00
|
|
|
#if ECB_GCC_VERSION(3,1)
|
|
|
|
#define ecb_attribute(attrlist) __attribute__(attrlist)
|
|
|
|
#define ecb_is_constant(expr) __builtin_constant_p (expr)
|
|
|
|
#define ecb_expect(expr,value) __builtin_expect ((expr),(value))
|
|
|
|
#define ecb_prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality)
|
|
|
|
#else
|
|
|
|
#define ecb_attribute(attrlist)
|
|
|
|
#define ecb_is_constant(expr) 0
|
|
|
|
#define ecb_expect(expr,value) (expr)
|
|
|
|
#define ecb_prefetch(addr,rw,locality)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define ecb_noinline ecb_attribute ((__noinline__))
|
|
|
|
#define ecb_noreturn ecb_attribute ((__noreturn__))
|
|
|
|
#define ecb_unused ecb_attribute ((__unused__))
|
|
|
|
#define ecb_const ecb_attribute ((__const__))
|
|
|
|
#define ecb_pure ecb_attribute ((__pure__))
|
|
|
|
|
|
|
|
#if ECB_GCC_VERSION(4,3)
|
|
|
|
#define ecb_artificial ecb_attribute ((__artificial__))
|
|
|
|
#define ecb_hot ecb_attribute ((__hot__))
|
|
|
|
#define ecb_cold ecb_attribute ((__cold__))
|
|
|
|
#else
|
|
|
|
#define ecb_artificial
|
|
|
|
#define ecb_hot
|
|
|
|
#define ecb_cold
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* put around conditional expressions if you are very sure that the */
|
|
|
|
/* expression is mostly true or mostly false. note that these return */
|
|
|
|
/* booleans, not the expression. */
|
|
|
|
#define ecb_expect_false(expr) ecb_expect (!!(expr), 0)
|
|
|
|
#define ecb_expect_true(expr) ecb_expect (!!(expr), 1)
|
|
|
|
/* ecb.h end */
|
|
|
|
|
|
|
|
#define expect_false(cond) ecb_expect_false (cond)
|
|
|
|
#define expect_true(cond) ecb_expect_true (cond)
|
|
|
|
#define noinline ecb_noinline
|
|
|
|
|
|
|
|
#define inline_size ecb_inline
|
2007-12-08 14:27:38 +00:00
|
|
|
|
2010-03-16 00:20:16 +00:00
|
|
|
#if EV_FEATURE_CODE
|
2011-06-19 17:55:13 +00:00
|
|
|
# define inline_speed ecb_inline
|
2010-03-16 00:20:16 +00:00
|
|
|
#else
|
|
|
|
# define inline_speed static noinline
|
2007-12-08 14:27:38 +00:00
|
|
|
#endif
|
2007-11-02 11:02:23 +00:00
|
|
|
|
2009-07-08 04:29:31 +00:00
|
|
|
#define NUMPRI (EV_MAXPRI - EV_MINPRI + 1)
|
|
|
|
|
|
|
|
#if EV_MINPRI == EV_MAXPRI
|
|
|
|
# define ABSPRI(w) (((W)w), 0)
|
|
|
|
#else
|
|
|
|
# define ABSPRI(w) (((W)w)->priority - EV_MINPRI)
|
|
|
|
#endif
|
2007-11-02 20:05:05 +00:00
|
|
|
|
2007-12-07 16:44:10 +00:00
|
|
|
#define EMPTY /* required for microsofts broken pseudo-c compiler */
|
2007-11-12 20:03:39 +00:00
|
|
|
#define EMPTY2(a,b) /* used to suppress some warnings */
|
2007-11-12 00:31:08 +00:00
|
|
|
|
2007-11-24 07:14:26 +00:00
|
|
|
typedef ev_watcher *W;
|
|
|
|
typedef ev_watcher_list *WL;
|
|
|
|
typedef ev_watcher_time *WT;
|
2007-10-31 07:36:03 +00:00
|
|
|
|
2008-05-02 08:08:45 +00:00
|
|
|
#define ev_active(w) ((W)(w))->active
|
2008-05-02 08:07:37 +00:00
|
|
|
#define ev_at(w) ((WT)(w))->at
|
|
|
|
|
2009-02-06 20:17:43 +00:00
|
|
|
#if EV_USE_REALTIME
|
2007-12-22 07:03:31 +00:00
|
|
|
/* sig_atomic_t is used to avoid per-thread variables or locking but still */
|
2010-07-31 22:33:26 +00:00
|
|
|
/* giving it a reasonably high chance of working on typical architectures */
|
2009-02-06 20:17:43 +00:00
|
|
|
static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if EV_USE_MONOTONIC
|
2008-01-31 13:10:56 +00:00
|
|
|
static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */
|
2007-12-23 04:45:51 +00:00
|
|
|
#endif
|
2007-11-04 00:24:16 +00:00
|
|
|
|
2009-08-19 23:44:51 +00:00
|
|
|
#ifndef EV_FD_TO_WIN32_HANDLE
|
|
|
|
# define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd)
|
|
|
|
#endif
|
|
|
|
#ifndef EV_WIN32_HANDLE_TO_FD
|
2010-01-07 06:49:31 +00:00
|
|
|
# define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (handle, 0)
|
2009-08-19 23:44:51 +00:00
|
|
|
#endif
|
|
|
|
#ifndef EV_WIN32_CLOSE_FD
|
|
|
|
# define EV_WIN32_CLOSE_FD(fd) close (fd)
|
|
|
|
#endif
|
|
|
|
|
2007-11-12 00:31:08 +00:00
|
|
|
#ifdef _WIN32
|
2007-11-11 02:05:20 +00:00
|
|
|
# include "ev_win32.c"
|
|
|
|
#endif
|
2007-11-05 16:42:15 +00:00
|
|
|
|
2007-11-03 22:31:11 +00:00
|
|
|
/*****************************************************************************/
|
2007-11-03 21:58:51 +00:00
|
|
|
|
2011-02-20 02:56:23 +00:00
|
|
|
/* define a suitable floor function (only used by periodics atm) */
|
|
|
|
|
|
|
|
#if EV_USE_FLOOR
|
|
|
|
# include <math.h>
|
|
|
|
# define ev_floor(v) floor (v)
|
|
|
|
#else
|
|
|
|
|
|
|
|
#include <float.h>
|
|
|
|
|
|
|
|
/* a floor() replacement function, should be independent of ev_tstamp type */
|
|
|
|
static ev_tstamp noinline
|
|
|
|
ev_floor (ev_tstamp v)
|
|
|
|
{
|
|
|
|
/* the choice of shift factor is not terribly important */
|
|
|
|
#if FLT_RADIX != 2 /* assume FLT_RADIX == 10 */
|
|
|
|
const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 10000000000000000000. : 1000000000.;
|
|
|
|
#else
|
|
|
|
const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 18446744073709551616. : 4294967296.;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* argument too large for an unsigned long? */
|
|
|
|
if (expect_false (v >= shift))
|
|
|
|
{
|
|
|
|
ev_tstamp f;
|
|
|
|
|
|
|
|
if (v == v - 1.)
|
|
|
|
return v; /* very large number */
|
|
|
|
|
|
|
|
f = shift * ev_floor (v * (1. / shift));
|
|
|
|
return f + ev_floor (v - f);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* special treatment for negative args? */
|
|
|
|
if (expect_false (v < 0.))
|
|
|
|
{
|
|
|
|
ev_tstamp f = -ev_floor (-v);
|
|
|
|
|
|
|
|
return f - (f == v ? 0 : 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* fits into an unsigned long */
|
|
|
|
return (unsigned long)v;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
2010-10-22 11:21:52 +00:00
|
|
|
#ifdef __linux
|
|
|
|
# include <sys/utsname.h>
|
|
|
|
#endif
|
|
|
|
|
2011-06-19 17:55:13 +00:00
|
|
|
static unsigned int noinline ecb_cold
|
2010-10-22 10:09:12 +00:00
|
|
|
ev_linux_version (void)
|
|
|
|
{
|
|
|
|
#ifdef __linux
|
2010-10-24 17:58:41 +00:00
|
|
|
unsigned int v = 0;
|
2010-10-22 10:09:12 +00:00
|
|
|
struct utsname buf;
|
|
|
|
int i;
|
|
|
|
char *p = buf.release;
|
|
|
|
|
|
|
|
if (uname (&buf))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (i = 3+1; --i; )
|
|
|
|
{
|
|
|
|
unsigned int c = 0;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
if (*p >= '0' && *p <= '9')
|
|
|
|
c = c * 10 + *p++ - '0';
|
|
|
|
else
|
|
|
|
{
|
|
|
|
p += *p == '.';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
v = (v << 8) | c;
|
|
|
|
}
|
|
|
|
|
|
|
|
return v;
|
|
|
|
#else
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
2010-03-09 08:55:03 +00:00
|
|
|
#if EV_AVOID_STDIO
|
2011-06-19 17:55:13 +00:00
|
|
|
static void noinline ecb_cold
|
2010-03-09 08:55:03 +00:00
|
|
|
ev_printerr (const char *msg)
|
|
|
|
{
|
|
|
|
write (STDERR_FILENO, msg, strlen (msg));
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2007-11-06 00:52:32 +00:00
|
|
|
static void (*syserr_cb)(const char *msg);
|
2007-11-06 00:10:04 +00:00
|
|
|
|
2011-06-19 17:55:13 +00:00
|
|
|
void ecb_cold
|
2007-11-26 20:33:58 +00:00
|
|
|
ev_set_syserr_cb (void (*cb)(const char *msg))
|
2007-11-06 00:10:04 +00:00
|
|
|
{
|
|
|
|
syserr_cb = cb;
|
|
|
|
}
|
|
|
|
|
2011-06-19 17:55:13 +00:00
|
|
|
static void noinline ecb_cold
|
2008-10-29 06:32:48 +00:00
|
|
|
ev_syserr (const char *msg)
|
2007-11-06 00:10:04 +00:00
|
|
|
{
|
2007-11-06 00:52:32 +00:00
|
|
|
if (!msg)
|
|
|
|
msg = "(libev) system error";
|
|
|
|
|
2007-11-06 00:10:04 +00:00
|
|
|
if (syserr_cb)
|
2007-11-06 00:52:32 +00:00
|
|
|
syserr_cb (msg);
|
2007-11-06 00:10:04 +00:00
|
|
|
else
|
|
|
|
{
|
2010-03-09 08:46:16 +00:00
|
|
|
#if EV_AVOID_STDIO
|
2010-03-09 08:55:03 +00:00
|
|
|
ev_printerr (msg);
|
|
|
|
ev_printerr (": ");
|
2010-10-31 22:01:20 +00:00
|
|
|
ev_printerr (strerror (errno));
|
2010-03-09 08:55:03 +00:00
|
|
|
ev_printerr ("\n");
|
2010-03-09 08:46:16 +00:00
|
|
|
#else
|
2007-11-06 00:52:32 +00:00
|
|
|
perror (msg);
|
2010-03-09 08:46:16 +00:00
|
|
|
#endif
|
2007-11-06 00:10:04 +00:00
|
|
|
abort ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-04-09 22:07:50 +00:00
|
|
|
static void *
|
|
|
|
ev_realloc_emul (void *ptr, long size)
|
|
|
|
{
|
2010-03-09 09:00:59 +00:00
|
|
|
#if __GLIBC__
|
|
|
|
return realloc (ptr, size);
|
|
|
|
#else
|
2008-04-09 22:07:50 +00:00
|
|
|
/* some systems, notably openbsd and darwin, fail to properly
|
2010-03-09 09:02:03 +00:00
|
|
|
* implement realloc (x, 0) (as required by both ansi c-89 and
|
2008-04-09 22:07:50 +00:00
|
|
|
* the single unix specification, so work around them here.
|
|
|
|
*/
|
2010-03-09 08:58:22 +00:00
|
|
|
|
2008-04-09 22:07:50 +00:00
|
|
|
if (size)
|
|
|
|
return realloc (ptr, size);
|
|
|
|
|
|
|
|
free (ptr);
|
|