1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* include/ruby/win32.h, win32/win32.c (rb_w32_getppid): now support

getppid() on win32 (but only Win2k or later).

	* process.c (get_ppid): remove win32 special logic.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17553 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2008-06-24 02:14:00 +00:00
parent b6cab6e8f1
commit d3a0ef8198
4 changed files with 43 additions and 4 deletions

View file

@ -1,3 +1,10 @@
Tue Jun 24 11:12:33 2008 NAKAMURA Usaku <usa@ruby-lang.org>
* include/ruby/win32.h, win32/win32.c (rb_w32_getppid): now support
getppid() on win32 (but only Win2k or later).
* process.c (get_ppid): remove win32 special logic.
Tue Jun 24 09:40:47 2008 NAKAMURA Usaku <usa@ruby-lang.org> Tue Jun 24 09:40:47 2008 NAKAMURA Usaku <usa@ruby-lang.org>
* ext/socket/socket.c (init_sock): socket is binmode on platforms * ext/socket/socket.c (init_sock): socket is binmode on platforms

View file

@ -140,6 +140,7 @@ extern DWORD rb_w32_osid(void);
#define read(f, b, s) rb_w32_read(f, b, s) #define read(f, b, s) rb_w32_read(f, b, s)
#define write(f, b, s) rb_w32_write(f, b, s) #define write(f, b, s) rb_w32_write(f, b, s)
#define getpid() rb_w32_getpid() #define getpid() rb_w32_getpid()
#define getppid() rb_w32_getppid()
#define sleep(x) rb_w32_Sleep((x)*1000) #define sleep(x) rb_w32_Sleep((x)*1000)
#define Sleep(msec) (void)rb_w32_Sleep(msec) #define Sleep(msec) (void)rb_w32_Sleep(msec)
#define fstat(fd,st) _fstati64(fd,st) #define fstat(fd,st) _fstati64(fd,st)
@ -262,6 +263,7 @@ extern rb_pid_t rb_w32_aspawn(int, const char *, char *const *);
extern int kill(int, int); extern int kill(int, int);
extern int fcntl(int, int, ...); extern int fcntl(int, int, ...);
extern rb_pid_t rb_w32_getpid(void); extern rb_pid_t rb_w32_getpid(void);
extern rb_pid_t rb_w32_getppid(void);
#if !defined(__BORLANDC__) && !defined(_WIN32_WCE) #if !defined(__BORLANDC__) && !defined(_WIN32_WCE)
extern int rb_w32_isatty(int); extern int rb_w32_isatty(int);
#endif #endif

View file

@ -179,11 +179,7 @@ static VALUE
get_ppid(void) get_ppid(void)
{ {
rb_secure(2); rb_secure(2);
#ifdef _WIN32
return INT2FIX(0);
#else
return PIDT2NUM(getppid()); return PIDT2NUM(getppid());
#endif
} }

View file

@ -3829,6 +3829,40 @@ rb_w32_getpid(void)
return pid; return pid;
} }
rb_pid_t
rb_w32_getppid(void)
{
static long (WINAPI *pNtQueryInformationProcess)(HANDLE, int, void *, ULONG, ULONG *) = NULL;
rb_pid_t ppid = 0;
if (!IsWin95() && rb_w32_osver() >= 5) {
if (!pNtQueryInformationProcess) {
HANDLE hNtDll = GetModuleHandle("ntdll.dll");
if (hNtDll) {
pNtQueryInformationProcess = (long (WINAPI *)(HANDLE, int, void *, ULONG, ULONG *))GetProcAddress(hNtDll, "NtQueryInformationProcess");
if (pNtQueryInformationProcess) {
struct {
long ExitStatus;
void* PebBaseAddress;
ULONG AffinityMask;
ULONG BasePriority;
ULONG UniqueProcessId;
ULONG ParentProcessId;
} pbi;
ULONG len;
long ret = pNtQueryInformationProcess(GetCurrentProcess(), 0, &pbi, sizeof(pbi), &len);
if (!ret) {
ppid = pbi.ParentProcessId;
}
}
}
}
}
return ppid;
}
int int
rb_w32_fclose(FILE *fp) rb_w32_fclose(FILE *fp)
{ {