Mercurial > hg > truffle
comparison src/os/aix/vm/os_aix.cpp @ 14421:3068270ba476
8026487: PPC64: Implement 'os::fork_and_exec' on AIX
Reviewed-by: kvn, twisti
author | simonis |
---|---|
date | Wed, 16 Oct 2013 10:52:41 +0200 |
parents | 666e6ce3976c |
children | b858620b0081 |
comparison
equal
deleted
inserted
replaced
14420:abe03600372a | 14421:3068270ba476 |
---|---|
225 julong os::available_memory() { | 225 julong os::available_memory() { |
226 return Aix::available_memory(); | 226 return Aix::available_memory(); |
227 } | 227 } |
228 | 228 |
229 julong os::Aix::available_memory() { | 229 julong os::Aix::available_memory() { |
230 Unimplemented(); | 230 os::Aix::meminfo_t mi; |
231 return 0; | 231 if (os::Aix::get_meminfo(&mi)) { |
232 return mi.real_free; | |
233 } else { | |
234 return 0xFFFFFFFFFFFFFFFFLL; | |
235 } | |
232 } | 236 } |
233 | 237 |
234 julong os::physical_memory() { | 238 julong os::physical_memory() { |
235 return Aix::physical_memory(); | 239 return Aix::physical_memory(); |
236 } | 240 } |
5058 // Run the specified command in a separate process. Return its exit value, | 5062 // Run the specified command in a separate process. Return its exit value, |
5059 // or -1 on failure (e.g. can't fork a new process). | 5063 // or -1 on failure (e.g. can't fork a new process). |
5060 // Unlike system(), this function can be called from signal handler. It | 5064 // Unlike system(), this function can be called from signal handler. It |
5061 // doesn't block SIGINT et al. | 5065 // doesn't block SIGINT et al. |
5062 int os::fork_and_exec(char* cmd) { | 5066 int os::fork_and_exec(char* cmd) { |
5063 Unimplemented(); | 5067 char * argv[4] = {"sh", "-c", cmd, NULL}; |
5064 return 0; | 5068 |
5069 pid_t pid = fork(); | |
5070 | |
5071 if (pid < 0) { | |
5072 // fork failed | |
5073 return -1; | |
5074 | |
5075 } else if (pid == 0) { | |
5076 // child process | |
5077 | |
5078 // try to be consistent with system(), which uses "/usr/bin/sh" on AIX | |
5079 execve("/usr/bin/sh", argv, environ); | |
5080 | |
5081 // execve failed | |
5082 _exit(-1); | |
5083 | |
5084 } else { | |
5085 // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't | |
5086 // care about the actual exit code, for now. | |
5087 | |
5088 int status; | |
5089 | |
5090 // Wait for the child process to exit. This returns immediately if | |
5091 // the child has already exited. */ | |
5092 while (waitpid(pid, &status, 0) < 0) { | |
5093 switch (errno) { | |
5094 case ECHILD: return 0; | |
5095 case EINTR: break; | |
5096 default: return -1; | |
5097 } | |
5098 } | |
5099 | |
5100 if (WIFEXITED(status)) { | |
5101 // The child exited normally; get its exit code. | |
5102 return WEXITSTATUS(status); | |
5103 } else if (WIFSIGNALED(status)) { | |
5104 // The child exited because of a signal | |
5105 // The best value to return is 0x80 + signal number, | |
5106 // because that is what all Unix shells do, and because | |
5107 // it allows callers to distinguish between process exit and | |
5108 // process death by signal. | |
5109 return 0x80 + WTERMSIG(status); | |
5110 } else { | |
5111 // Unknown exit code; pass it through | |
5112 return status; | |
5113 } | |
5114 } | |
5115 // Remove warning. | |
5116 return -1; | |
5065 } | 5117 } |
5066 | 5118 |
5067 // is_headless_jre() | 5119 // is_headless_jre() |
5068 // | 5120 // |
5069 // Test for the existence of xawt/libmawt.so or libawt_xawt.so | 5121 // Test for the existence of xawt/libmawt.so or libawt_xawt.so |