From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS47066 71.19.144.0/20 X-Spam-Status: No, score=-1.9 required=3.0 tests=AWL,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: normalperson@yhbt.net Received: from zedshaw2.xen.prgmr.com (zedshaw2.xen.prgmr.com [71.19.156.177]) by dcvr.yhbt.net (Postfix) with ESMTP id 4EBB91F6F9 for ; Tue, 24 Sep 2013 08:56:05 +0000 (UTC) Received: from zedshaw2.xen.prgmr.com (unknown [IPv6:::1]) by zedshaw2.xen.prgmr.com (Postfix) with ESMTP id C4A1F750DD for ; Tue, 24 Sep 2013 09:06:35 +0000 (UTC) MIME-Version: 1.0 Date: Tue, 24 Sep 2013 16:55:47 +0800 From: Lin Jen-Shin In-Reply-To: <1380012947-91938-1-git-send-email-godfat@godfat.org> List-Archive: List-Help: List-Id: List-Post: List-Subscribe: List-Unsubscribe: Message-Id: <1380012947-91938-1-git-send-email-godfat@godfat.org> Precedence: list References: <1380012947-91938-1-git-send-email-godfat@godfat.org> Sender: sleepy.penguin@librelist.org Subject: [sleepy.penguin] [PATCH] Support for broken system without clock_gettime. To: sleepy.penguin@librelist.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Status: A Fallback mechanism was copied from clogger: http://clogger.rubyforge.org/ This would also make sleepy_penguin compiles on Mac OS X, which is lacking clock_gettime. All tests passed for me. --- ext/sleepy_penguin/epoll.c | 1 + ext/sleepy_penguin/extconf.rb | 5 +++++ ext/sleepy_penguin/kqueue.c | 1 + ext/sleepy_penguin/missing_clock_gettime.h | 36 ++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 ext/sleepy_penguin/missing_clock_gettime.h diff --git a/ext/sleepy_penguin/epoll.c b/ext/sleepy_penguin/epoll.c index 9010e2d..5e5cb20 100644 --- a/ext/sleepy_penguin/epoll.c +++ b/ext/sleepy_penguin/epoll.c @@ -3,6 +3,7 @@ #include #include #include +#include "missing_clock_gettime.h" #include "missing_epoll.h" #include "missing_rb_thread_fd_close.h" #include "missing_rb_update_max_fd.h" diff --git a/ext/sleepy_penguin/extconf.rb b/ext/sleepy_penguin/extconf.rb index 2ed9b21..0e6977a 100644 --- a/ext/sleepy_penguin/extconf.rb +++ b/ext/sleepy_penguin/extconf.rb @@ -13,6 +13,11 @@ have_header('sys/eventfd.h') have_header('sys/timerfd.h') have_header('sys/inotify.h') have_header('ruby/io.h') and have_struct_member('rb_io_t', 'fd', 'ruby/io.h') +unless have_macro('CLOCK_MONOTONIC', 'time.h') + have_func('CLOCK_MONOTONIC', 'time.h') +end +have_type('clockid_t', 'time.h') +have_func('clock_gettime', 'time.h') have_func('epoll_create1', %w(sys/epoll.h)) have_func('rb_thread_call_without_gvl') have_func('rb_thread_blocking_region') diff --git a/ext/sleepy_penguin/kqueue.c b/ext/sleepy_penguin/kqueue.c index 59c3dae..83f3623 100644 --- a/ext/sleepy_penguin/kqueue.c +++ b/ext/sleepy_penguin/kqueue.c @@ -5,6 +5,7 @@ #include #include #include +#include "missing_clock_gettime.h" #include "missing_rb_thread_fd_close.h" #include "missing_rb_update_max_fd.h" #include "value2timespec.h" diff --git a/ext/sleepy_penguin/missing_clock_gettime.h b/ext/sleepy_penguin/missing_clock_gettime.h new file mode 100644 index 0000000..de36fb2 --- /dev/null +++ b/ext/sleepy_penguin/missing_clock_gettime.h @@ -0,0 +1,36 @@ +/* + * this header includes functions to support broken systems + * without clock_gettime() or CLOCK_MONOTONIC + */ + +#ifndef HAVE_TYPE_CLOCKID_T +typedef int clockid_t; +#endif + +#ifndef HAVE_CLOCK_GETTIME +# ifndef CLOCK_REALTIME +# define CLOCK_REALTIME 0 /* whatever */ +# endif +static int fake_clock_gettime(clockid_t clk_id, struct timespec *res) +{ + struct timeval tv; + int r = gettimeofday(&tv, NULL); + + assert(0 == r && "gettimeofday() broke!?"); + res->tv_sec = tv.tv_sec; + res->tv_nsec = tv.tv_usec * 1000; + + return r; +} +# define clock_gettime fake_clock_gettime +#endif /* broken systems w/o clock_gettime() */ + +/* + * UGH + * CLOCK_MONOTONIC is not guaranteed to be a macro, either + */ +#ifndef CLOCK_MONOTONIC +# if (!defined(_POSIX_MONOTONIC_CLOCK) || !defined(HAVE_CLOCK_MONOTONIC)) +# define CLOCK_MONOTONIC CLOCK_REALTIME +# endif +#endif -- 1.8.4