From 606f1ac3fbfa45ea050a693b71597b14f3759d15 Mon Sep 17 00:00:00 2001 From: mattn Date: Fri, 11 Jan 2013 21:14:45 +0900 Subject: [PATCH 1/6] support windows. --- src/process.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/src/process.c b/src/process.c index bbcce1c..88fdac6 100644 --- a/src/process.c +++ b/src/process.c @@ -14,8 +14,12 @@ #include #include +#ifndef _WIN32 #include #include +#else +#include +#endif #include #include #include @@ -23,6 +27,53 @@ #include #include +#ifdef _WIN32 +const char* +emsg(DWORD err) +{ + if (err == 0) return "succeeded"; + static char buf[256]; + FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + buf, + sizeof buf, + NULL); + return buf; +} + +#ifndef SIGKILL +#define SIGKILL 9 +#endif + +int +kill(int pid, int sig) +{ + HANDLE handle; + switch (sig) { + case SIGTERM: + case SIGKILL: + case SIGINT: + handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (!TerminateProcess(handle, 1)) + return -1; + default: + return -1; + } + return 0; +} + +unsigned int +sleep(unsigned int seconds) +{ + Sleep(seconds * 1000); + return seconds; +} + +#endif + mrb_value mrb_f_kill(mrb_state *mrb, mrb_value klass) { @@ -59,6 +110,7 @@ mrb_f_kill(mrb_state *mrb, mrb_value klass) static mrb_value mrb_f_fork(mrb_state *mrb, mrb_value klass) { +#ifndef _WIN32 mrb_value b, result; int pid; @@ -79,6 +131,10 @@ mrb_f_fork(mrb_state *mrb, mrb_value klass) default: return mrb_fixnum_value(pid); } +#else + mrb_raise(mrb, E_RUNTIME_ERROR, emsg(ERROR_CALL_NOT_IMPLEMENTED)); + return mrb_nil_value(); +#endif } static int @@ -86,6 +142,7 @@ mrb_waitpid(int pid, int flags, int *st) { int result; +#ifndef _WIN32 retry: result = waitpid(pid, st, flags); if (result < 0) { @@ -94,6 +151,10 @@ mrb_waitpid(int pid, int flags, int *st) } return -1; } +#else + HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + result = WaitForSingleObject(handle, INFINITE) == WAIT_OBJECT_0 ? 0 : -1; +#endif return result; } @@ -135,8 +196,12 @@ mrb_f_sleep(mrb_state *mrb, mrb_value klass) tv.tv_usec = (mrb_float(argv[0]) - tv.tv_sec) * 1000000.0; } - +#ifdef _WIN32 + n = tv.tv_sec * 1000 + tv.tv_usec / 1000; + Sleep(n); +#else n = select(0, 0, 0, 0, &tv); +#endif if (n < 0) mrb_sys_fail(mrb, "mrb_f_sleep failed"); } else { @@ -157,7 +222,9 @@ mrb_f_system(mrb_state *mrb, mrb_value klass) mrb_value *argv, pname; const char *path; int argc; +#ifdef SIGCHLD RETSIGTYPE (*chfunc)(int); +#endif fflush(stdout); fflush(stderr); @@ -174,9 +241,14 @@ mrb_f_system(mrb_state *mrb, mrb_value klass) path = mrb_string_value_cstr(mrb, &pname); ret = system(path); +#ifndef _WIN32 if (WIFEXITED(ret) && WEXITSTATUS(ret) == 0) { return mrb_true_value(); } +#else + if (ret != -1) + return mrb_true_value(); +#endif return mrb_false_value(); } @@ -210,7 +282,12 @@ mrb_f_pid(mrb_state *mrb, mrb_value klass) mrb_value mrb_f_ppid(mrb_state *mrb, mrb_value klass) { +#ifndef _WIN32 return mrb_fixnum_value((mrb_int)getppid()); +#else + mrb_raise(mrb, E_RUNTIME_ERROR, emsg(ERROR_CALL_NOT_IMPLEMENTED)); + return mrb_nil_value(); +#endif } void From a4177a63eda2c4b7f190dad68046d44b86b91dda Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 24 Jan 2013 09:56:02 +0900 Subject: [PATCH 2/6] Update gem's rakefile --- mrbgem.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrbgem.rake b/mrbgem.rake index 6226ab3..7a412aa 100644 --- a/mrbgem.rake +++ b/mrbgem.rake @@ -2,5 +2,5 @@ MRuby::Gem::Specification.new('mruby-process') do |spec| spec.license = 'MIT' spec.authors = 'mruby developers' - spec.mruby_includes = ["#{build.root}/src"] + spec.cc.include_paths << ["#{build.root}/src"] end From f8c2f47c29985791f9d743cf376189a60f0688ca Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 24 Jan 2013 09:57:49 +0900 Subject: [PATCH 3/6] Add finalizer --- src/process.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/process.c b/src/process.c index bbcce1c..b6c8873 100644 --- a/src/process.c +++ b/src/process.c @@ -231,3 +231,10 @@ mrb_mruby_process_gem_init(mrb_state *mrb) mrb_gv_set(mrb, mrb_intern(mrb, "$$"), mrb_fixnum_value((mrb_int)getpid())); } + +void +mrb_mruby_process_gem_final(mrb_state *mrb) +{ +} + +{ From 0f29eb8f871942bbe5644696cd9d9e99abcde272 Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 24 Jan 2013 16:24:36 +0900 Subject: [PATCH 4/6] Fix broken bracket. --- src/process.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/process.c b/src/process.c index d0eb486..13207d3 100644 --- a/src/process.c +++ b/src/process.c @@ -313,5 +313,3 @@ void mrb_mruby_process_gem_final(mrb_state *mrb) { } - -{ From ca915a485898fa0f460f2578b124c1de2e1ee3bb Mon Sep 17 00:00:00 2001 From: mattn Date: Wed, 30 Jan 2013 10:19:00 +0900 Subject: [PATCH 5/6] rename. --- mrbgem.rake | 3 ++- src/process.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mrbgem.rake b/mrbgem.rake index 26a8065..8125e47 100644 --- a/mrbgem.rake +++ b/mrbgem.rake @@ -1,4 +1,5 @@ -MRuby::Gem::Specification.new('mruby-process') do |spec| +MRuby::Gem::Specification.new('mruby-process-win32') do |spec| + # based on https://github.com/iij/mruby-process spec.license = 'MIT' spec.authors = 'mruby developers' diff --git a/src/process.c b/src/process.c index 13207d3..a9455f9 100644 --- a/src/process.c +++ b/src/process.c @@ -28,7 +28,7 @@ #include #ifdef _WIN32 -const char* +static const char* emsg(DWORD err) { if (err == 0) return "succeeded"; @@ -291,7 +291,7 @@ mrb_f_ppid(mrb_state *mrb, mrb_value klass) } void -mrb_mruby_process_gem_init(mrb_state *mrb) +mrb_mruby_process_win32_gem_init(mrb_state *mrb) { struct RClass *p; @@ -310,6 +310,6 @@ mrb_mruby_process_gem_init(mrb_state *mrb) } void -mrb_mruby_process_gem_final(mrb_state *mrb) +mrb_mruby_process_win32_gem_final(mrb_state *mrb) { } From 32bfe111478ce351507d792b1361a3029cea3739 Mon Sep 17 00:00:00 2001 From: mattn Date: Wed, 27 Mar 2013 21:58:19 +0900 Subject: [PATCH 6/6] Fix build on VC --- src/process.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/process.c b/src/process.c index a9455f9..a302be2 100644 --- a/src/process.c +++ b/src/process.c @@ -13,8 +13,8 @@ #include "error.h" #include -#include #ifndef _WIN32 +#include #include #include #else @@ -24,15 +24,17 @@ #include #include #include +#ifndef _MSC_VER #include +#endif #include #ifdef _WIN32 static const char* emsg(DWORD err) { - if (err == 0) return "succeeded"; static char buf[256]; + if (err == 0) return "succeeded"; FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,