* [sleepy.penguin] [PATCH] Add support for Mac OS X @ 2013-08-26 8:46 ` Lin Jen-Shin 2013-08-26 8:52 ` [sleepy.penguin] " Lin Jen-Shin (godfat) 2013-08-26 9:12 ` [sleepy.penguin] " Eric Wong 0 siblings, 2 replies; 4+ messages in thread From: Lin Jen-Shin @ 2013-08-26 8:46 UTC (permalink / raw) To: sleepy.penguin Since Mac OS X does not support clock_gettime, we need to wrap around clock_gettime to make kqueue work on Mac OS X. epoll.c does not need this wrapper as it's only on Linux, but I guess it's fine to use the wrapper as well. Maybe someday *BSD could also support epoll in someway? --- ext/sleepy_penguin/clock_gettime.c | 17 +++++++++++++++++ ext/sleepy_penguin/clock_gettime.h | 23 +++++++++++++++++++++++ ext/sleepy_penguin/epoll.c | 3 ++- ext/sleepy_penguin/kqueue.c | 5 +++-- 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 ext/sleepy_penguin/clock_gettime.c create mode 100644 ext/sleepy_penguin/clock_gettime.h diff --git a/ext/sleepy_penguin/clock_gettime.c b/ext/sleepy_penguin/clock_gettime.c new file mode 100644 index 0000000..1f42c10 --- /dev/null +++ b/ext/sleepy_penguin/clock_gettime.c @@ -0,0 +1,17 @@ +#ifdef __MACH__ +/* + * Mac OS X does not support clock_gettime + * ref: http://stackoverflow.com/questions/11680461/monotonic-clock-on-osx + */ +#include "clock_gettime.h" + +void clock_gettime_mach(struct timespec *now){ + clock_serv_t cclock; + mach_timespec_t mts; + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + now->tv_sec = mts.tv_sec; + now->tv_nsec = mts.tv_nsec; +} +#endif diff --git a/ext/sleepy_penguin/clock_gettime.h b/ext/sleepy_penguin/clock_gettime.h new file mode 100644 index 0000000..3294176 --- /dev/null +++ b/ext/sleepy_penguin/clock_gettime.h @@ -0,0 +1,23 @@ +#ifndef CLOCK_GETTIME_H +#define CLOCK_GETTIME_H + +#include <time.h> +#include <sys/time.h> + +#ifdef __MACH__ +#include <mach/clock.h> +#include <mach/mach.h> +#endif + +#ifdef __MACH__ +/* + * Mac OS X does not support clock_gettime + * ref: http://stackoverflow.com/questions/11680461/monotonic-clock-on-osx + */ +void clock_gettime_mach(struct timespec*); +#define CLOCK_GETTIME(now) clock_gettime_mach(now); +#else +#define CLOCK_GETTIME(now) clock_gettime(CLOCK_MONOTONIC, now); +#endif + +#endif /* CLOCK_GETTIME_H */ diff --git a/ext/sleepy_penguin/epoll.c b/ext/sleepy_penguin/epoll.c index 9010e2d..d4eedf7 100644 --- a/ext/sleepy_penguin/epoll.c +++ b/ext/sleepy_penguin/epoll.c @@ -1,4 +1,5 @@ #include "sleepy_penguin.h" +#include "clock_gettime.h" #ifdef HAVE_SYS_EPOLL_H #include <sys/epoll.h> #include <unistd.h> @@ -14,7 +15,7 @@ static uint64_t now_ms(void) { struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); + CLOCK_GETTIME(&now); return now.tv_sec * 1000 + (now.tv_nsec + 500000) / 1000000; } diff --git a/ext/sleepy_penguin/kqueue.c b/ext/sleepy_penguin/kqueue.c index 59c3dae..d9e3f16 100644 --- a/ext/sleepy_penguin/kqueue.c +++ b/ext/sleepy_penguin/kqueue.c @@ -1,4 +1,5 @@ #include "sleepy_penguin.h" +#include "clock_gettime.h" #ifdef HAVE_SYS_EVENT_H #include <sys/types.h> #include <sys/event.h> @@ -196,7 +197,7 @@ kevent_resume_p(struct timespec *expire_at, struct kq_per_thread *kpt) if (kpt->ts == NULL) return 1; - clock_gettime(CLOCK_MONOTONIC, &now); + CLOCK_GETTIME(&now); if (now.tv_sec > expire_at->tv_sec) return 0; if (now.tv_sec == expire_at->tv_sec && now.tv_nsec > expire_at->tv_nsec) @@ -221,7 +222,7 @@ static VALUE do_kevent(struct kq_per_thread *kpt) struct timespec expire_at; if (kpt->ts) { - clock_gettime(CLOCK_MONOTONIC, &expire_at); + CLOCK_GETTIME(&expire_at); expire_at.tv_sec += kpt->ts->tv_sec; expire_at.tv_nsec += kpt->ts->tv_nsec; -- 1.8.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [sleepy.penguin] Re: [PATCH] Add support for Mac OS X 2013-08-26 8:46 ` [sleepy.penguin] [PATCH] Add support for Mac OS X Lin Jen-Shin @ 2013-08-26 8:52 ` Lin Jen-Shin (godfat) 2013-08-26 9:12 ` [sleepy.penguin] " Eric Wong 1 sibling, 0 replies; 4+ messages in thread From: Lin Jen-Shin (godfat) @ 2013-08-26 8:52 UTC (permalink / raw) To: sleepy.penguin On Mon, Aug 26, 2013 at 4:46 PM, Lin Jen-Shin <godfat@godfat.org> wrote: > Since Mac OS X does not support clock_gettime, we need to wrap > around clock_gettime to make kqueue work on Mac OS X. > > epoll.c does not need this wrapper as it's only on Linux, > but I guess it's fine to use the wrapper as well. Maybe > someday *BSD could also support epoll in someway? [...] Unfortunately, this looks like an intrusive patch that makes calling clock_gettime not as straight as before (in terms of code readability). Feel free to not merge this then. I could totally understand it. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [sleepy.penguin] [PATCH] Add support for Mac OS X 2013-08-26 8:46 ` [sleepy.penguin] [PATCH] Add support for Mac OS X Lin Jen-Shin 2013-08-26 8:52 ` [sleepy.penguin] " Lin Jen-Shin (godfat) @ 2013-08-26 9:12 ` Eric Wong 2013-08-28 18:10 ` Lin Jen-Shin (godfat) 1 sibling, 1 reply; 4+ messages in thread From: Eric Wong @ 2013-08-26 9:12 UTC (permalink / raw) To: sleepy.penguin Lin Jen-Shin <godfat@godfat.org> wrote: > Since Mac OS X does not support clock_gettime, we need to wrap > around clock_gettime to make kqueue work on Mac OS X. > > epoll.c does not need this wrapper as it's only on Linux, > but I guess it's fine to use the wrapper as well. Maybe > someday *BSD could also support epoll in someway? I can accept something along these lines if it only uses generic/portable calls instead of system-specific code/ifdefs. This way it can be easier to test/review and reusable to other platforms which may not have proper clock_gettime > @@ -0,0 +1,17 @@ > +#ifdef __MACH__ Use have_func() checks instead. Actually, clogger already has a fallback for clock_gettime which works for all platforms (but is less "correct") git clone git://bogomips.org/clogger.git You can probably just copy code from that. I can't accept using interfaces which only work on rare/non-Free systems. > +void clock_gettime_mach(struct timespec *now){ > + clock_serv_t cclock; > + mach_timespec_t mts; > + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); > + clock_get_time(cclock, &mts); > + mach_port_deallocate(mach_task_self(), cclock); > + now->tv_sec = mts.tv_sec; > + now->tv_nsec = mts.tv_nsec; clogger just uses gettimeofday(), but that's usually good enough. Also, Ruby trunk recently got Process.clock_gettime; so someday we can just fall back to rb_funcall. Anyways thanks for bringing this to my attention. If you want, please send me a patch based on what's in clogger (and that fallback in clogger is probably buggy, too, so an extra set of eyes would be appreciated :) ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [sleepy.penguin] [PATCH] Add support for Mac OS X 2013-08-26 9:12 ` [sleepy.penguin] " Eric Wong @ 2013-08-28 18:10 ` Lin Jen-Shin (godfat) 0 siblings, 0 replies; 4+ messages in thread From: Lin Jen-Shin (godfat) @ 2013-08-28 18:10 UTC (permalink / raw) To: sleepy.penguin On Mon, Aug 26, 2013 at 5:12 PM, Eric Wong <normalperson@yhbt.net> wrote: > Lin Jen-Shin <godfat@godfat.org> wrote: [...] >> @@ -0,0 +1,17 @@ >> +#ifdef __MACH__ > > Use have_func() checks instead. > > Actually, clogger already has a fallback for clock_gettime which works > for all platforms (but is less "correct") > > git clone git://bogomips.org/clogger.git > > You can probably just copy code from that. > > I can't accept using interfaces which only work on rare/non-Free systems. I'll take a look later, thanks! >> +void clock_gettime_mach(struct timespec *now){ >> + clock_serv_t cclock; >> + mach_timespec_t mts; >> + host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); >> + clock_get_time(cclock, &mts); >> + mach_port_deallocate(mach_task_self(), cclock); >> + now->tv_sec = mts.tv_sec; >> + now->tv_nsec = mts.tv_nsec; > > clogger just uses gettimeofday(), but that's usually good enough. > > Also, Ruby trunk recently got Process.clock_gettime; so someday we can > just fall back to rb_funcall. > > Anyways thanks for bringing this to my attention. If you want, please > send me a patch based on what's in clogger (and that fallback in clogger > is probably buggy, too, so an extra set of eyes would be appreciated :) Thanks for reviewing and suggesting, too. I'll work on the patch, but only after the one for rainbows with eventmachine with threads :) Maybe this weekend, or next week... ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-08-28 18:11 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <godfat@godfat.org> 2013-08-26 8:46 ` [sleepy.penguin] [PATCH] Add support for Mac OS X Lin Jen-Shin 2013-08-26 8:52 ` [sleepy.penguin] " Lin Jen-Shin (godfat) 2013-08-26 9:12 ` [sleepy.penguin] " Eric Wong 2013-08-28 18:10 ` Lin Jen-Shin (godfat)
Code repositories for project(s) associated with this public inbox https://yhbt.net/sleepy_penguin.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).