summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--include/ruby/win32.h5
-rw-r--r--win32/Makefile.sub3
-rw-r--r--win32/win32.c41
4 files changed, 54 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 4c8e2194fd..1d6179623e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Aug 15 14:30:23 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * include/ruby/win32.h, win32/Makefile.sub, win32/win32.c
+ (clock_gettime): [experimental] emulates clock_gettime(2) of posix.
+
Thu Aug 15 02:32:40 2013 Zachary Scott <e@zzak.io>
* hash.c (rb_hash_aset): [DOC] Document key dup patch by @kachick
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index 809784d1c8..b8c99b2c3a 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -124,6 +124,10 @@ typedef unsigned int uintptr_t;
#define WNOHANG -1
+typedef int clockid_t;
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTINIC 1
+
#undef getc
#undef putc
#undef fgetc
@@ -312,6 +316,7 @@ extern int rb_w32_uchown(const char *, int, int);
extern int link(const char *, const char *);
extern int rb_w32_ulink(const char *, const char *);
extern int gettimeofday(struct timeval *, struct timezone *);
+extern int clock_gettime(clockid_t, struct timespec *);
extern rb_pid_t waitpid (rb_pid_t, int *, int);
extern rb_pid_t rb_w32_spawn(int, const char *, const char*);
extern rb_pid_t rb_w32_aspawn(int, const char *, char *const *);
diff --git a/win32/Makefile.sub b/win32/Makefile.sub
index 9926206708..cf0c743b8e 100644
--- a/win32/Makefile.sub
+++ b/win32/Makefile.sub
@@ -536,6 +536,8 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/Makefile.sub $(win_srcdir)/Makefile.sub
#define TIMET2NUM(v) LONG2NUM(v)
#define NUM2TIMET(v) NUM2LONG(v)
!endif
+#define CLOCKID2NUM(v) INT2NUM(v)
+#define NUM2CLOCKID(v) NUM2INT(v)
#define SIZEOF_RLIM_T 0
!if "$(ARCH)" == "x64" || "$(ARCH)" == "ia64"
#define SIZEOF_SIZE_T 8
@@ -638,6 +640,7 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/Makefile.sub $(win_srcdir)/Makefile.sub
#define HAVE_MEMCMP 1
#define HAVE_MEMMOVE 1
#define HAVE_MKDIR 1
+#define HAVE_CLOCK_GETTIME 1
#define HAVE_SPAWNV 1
#define HAVE_STRCASECMP 1
#define HAVE_STRNCASECMP 1
diff --git a/win32/win32.c b/win32/win32.c
index fda9e36af7..95e201092b 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4310,6 +4310,47 @@ gettimeofday(struct timeval *tv, struct timezone *tz)
}
/* License: Ruby's */
+typedef int clockid_t;
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 1
+int
+clock_gettime(clockid_t clock_id, struct timespec *sp)
+{
+ switch (clock_id) {
+ case CLOCK_REALTIME:
+ {
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ sp->tv_sec = tv.tv_sec;
+ sp->tv_nsec = tv.tv_usec * 1000;
+ return 0;
+ }
+ case CLOCK_MONOTONIC:
+ {
+ LARGE_INTEGER freq;
+ LARGE_INTEGER count;
+ if (!QueryPerformanceFrequency(&freq)) {
+ errno = map_errno(GetLastError());
+ return -1;
+ }
+ if (!QueryPerformanceCounter(&count)) {
+ errno = map_errno(GetLastError());
+ return -1;
+ }
+ sp->tv_sec = count.QuadPart / freq.QuadPart;
+ if (freq.QuadPart < 1000000000)
+ sp->tv_nsec = (count.QuadPart % freq.QuadPart) * (1000000000 / freq.QuadPart);
+ else
+ sp->tv_nsec = (long)((count.QuadPart % freq.QuadPart) * (1000000000.0 / freq.QuadPart));
+ return 0;
+ }
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+/* License: Ruby's */
char *
rb_w32_getcwd(char *buffer, int size)
{