mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Keep up with lib/System changes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -12,6 +12,10 @@ | |||||||
| //===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||||
|  |  | ||||||
| #include "Win32.h" | #include "Win32.h" | ||||||
|  | #include <psapi.h> | ||||||
|  | #include <malloc.h> | ||||||
|  |  | ||||||
|  | #pragma comment(lib, "psapi.lib") | ||||||
|  |  | ||||||
| //===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||||
| //=== WARNING: Implementation here must contain only Win32 specific code  | //=== WARNING: Implementation here must contain only Win32 specific code  | ||||||
| @@ -41,28 +45,26 @@ Process::GetPageSize() { | |||||||
|   return PageSize; |   return PageSize; | ||||||
| } | } | ||||||
|  |  | ||||||
| void*  |  | ||||||
| uint64_t  | uint64_t  | ||||||
| Process::GetMallocUsage() | Process::GetMallocUsage() | ||||||
| { | { | ||||||
| #ifdef HAVE_MALLINFO |   _HEAPINFO hinfo; | ||||||
|   struct mallinfo mi = ::mallinfo(); |   hinfo._pentry = NULL; | ||||||
|   return mi.uordblks; |  | ||||||
| #warning Cannot get malloc info on this platform |   size_t size = 0; | ||||||
|   return 0; |  | ||||||
| #endif |   while (_heapwalk(&hinfo) == _HEAPOK) | ||||||
|  |     size += hinfo._size; | ||||||
|  |  | ||||||
|  |   return size; | ||||||
| } | } | ||||||
|  |  | ||||||
| uint64_t | uint64_t | ||||||
| Process::GetTotalMemoryUsage() | Process::GetTotalMemoryUsage() | ||||||
| { | { | ||||||
| #ifdef HAVE_MALLINFO |   PROCESS_MEMORY_COUNTERS pmc; | ||||||
|   struct mallinfo mi = ::mallinfo(); |   GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); | ||||||
|   return mi.uordblks + mi.hblkhd |   return pmc.PagefileUsage; | ||||||
| #else |  | ||||||
| #warning Cannot get total memory size on this platform |  | ||||||
|   return 0; |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -71,17 +73,16 @@ Process::GetTimeUsage( | |||||||
| { | { | ||||||
|   elapsed = TimeValue::now(); |   elapsed = TimeValue::now(); | ||||||
|  |  | ||||||
|   unsigned __int64 ProcCreate, ProcExit, KernelTime, UserTime; |   uint64_t ProcCreate, ProcExit, KernelTime, UserTime; | ||||||
|   GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate,  |   GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate,  | ||||||
|                   (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, |                   (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, | ||||||
|                   (FILETIME*)&UserTime |                   (FILETIME*)&UserTime); | ||||||
|   ); |  | ||||||
|  |  | ||||||
|   // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) |   // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) | ||||||
|   user_time.seconds( UserTime / 10000000 ); |   user_time.seconds( UserTime / 10000000 ); | ||||||
|   user_time.nanoseconds( (UserTime % 10000000) * 100 ); |   user_time.nanoseconds( unsigned(UserTime % 10000000) * 100 ); | ||||||
|   sys_time.seconds( KernelTime / 10000000 ); |   sys_time.seconds( KernelTime / 10000000 ); | ||||||
|   user_time.nanoseconds( (UserTime % 10000000) * 100 ); |   sys_time.nanoseconds( unsigned(KernelTime % 10000000) * 100 ); | ||||||
| } | } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,6 +12,10 @@ | |||||||
| //===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||||
|  |  | ||||||
| #include "Win32.h" | #include "Win32.h" | ||||||
|  | #include <psapi.h> | ||||||
|  | #include <malloc.h> | ||||||
|  |  | ||||||
|  | #pragma comment(lib, "psapi.lib") | ||||||
|  |  | ||||||
| //===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||||
| //=== WARNING: Implementation here must contain only Win32 specific code  | //=== WARNING: Implementation here must contain only Win32 specific code  | ||||||
| @@ -41,28 +45,26 @@ Process::GetPageSize() { | |||||||
|   return PageSize; |   return PageSize; | ||||||
| } | } | ||||||
|  |  | ||||||
| void*  |  | ||||||
| uint64_t  | uint64_t  | ||||||
| Process::GetMallocUsage() | Process::GetMallocUsage() | ||||||
| { | { | ||||||
| #ifdef HAVE_MALLINFO |   _HEAPINFO hinfo; | ||||||
|   struct mallinfo mi = ::mallinfo(); |   hinfo._pentry = NULL; | ||||||
|   return mi.uordblks; |  | ||||||
| #warning Cannot get malloc info on this platform |   size_t size = 0; | ||||||
|   return 0; |  | ||||||
| #endif |   while (_heapwalk(&hinfo) == _HEAPOK) | ||||||
|  |     size += hinfo._size; | ||||||
|  |  | ||||||
|  |   return size; | ||||||
| } | } | ||||||
|  |  | ||||||
| uint64_t | uint64_t | ||||||
| Process::GetTotalMemoryUsage() | Process::GetTotalMemoryUsage() | ||||||
| { | { | ||||||
| #ifdef HAVE_MALLINFO |   PROCESS_MEMORY_COUNTERS pmc; | ||||||
|   struct mallinfo mi = ::mallinfo(); |   GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); | ||||||
|   return mi.uordblks + mi.hblkhd |   return pmc.PagefileUsage; | ||||||
| #else |  | ||||||
| #warning Cannot get total memory size on this platform |  | ||||||
|   return 0; |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| @@ -71,17 +73,16 @@ Process::GetTimeUsage( | |||||||
| { | { | ||||||
|   elapsed = TimeValue::now(); |   elapsed = TimeValue::now(); | ||||||
|  |  | ||||||
|   unsigned __int64 ProcCreate, ProcExit, KernelTime, UserTime; |   uint64_t ProcCreate, ProcExit, KernelTime, UserTime; | ||||||
|   GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate,  |   GetProcessTimes(GetCurrentProcess(), (FILETIME*)&ProcCreate,  | ||||||
|                   (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, |                   (FILETIME*)&ProcExit, (FILETIME*)&KernelTime, | ||||||
|                   (FILETIME*)&UserTime |                   (FILETIME*)&UserTime); | ||||||
|   ); |  | ||||||
|  |  | ||||||
|   // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) |   // FILETIME's are # of 100 nanosecond ticks (1/10th of a microsecond) | ||||||
|   user_time.seconds( UserTime / 10000000 ); |   user_time.seconds( UserTime / 10000000 ); | ||||||
|   user_time.nanoseconds( (UserTime % 10000000) * 100 ); |   user_time.nanoseconds( unsigned(UserTime % 10000000) * 100 ); | ||||||
|   sys_time.seconds( KernelTime / 10000000 ); |   sys_time.seconds( KernelTime / 10000000 ); | ||||||
|   user_time.nanoseconds( (UserTime % 10000000) * 100 ); |   sys_time.nanoseconds( unsigned(KernelTime % 10000000) * 100 ); | ||||||
| } | } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -69,8 +69,10 @@ Program::FindProgramByName(const std::string& progName) { | |||||||
| // | // | ||||||
| int  | int  | ||||||
| Program::ExecuteAndWait(const Path& path,  | Program::ExecuteAndWait(const Path& path,  | ||||||
|                         const std::vector<std::string>& args, |                         const char** args, | ||||||
|                         const char** envp) { |                         const char** envp, | ||||||
|  |                         const Path** redirects, | ||||||
|  |                         unsigned secondsToWait) { | ||||||
|   if (!path.executable()) |   if (!path.executable()) | ||||||
|     throw path.toString() + " is not executable";  |     throw path.toString() + " is not executable";  | ||||||
|  |  | ||||||
| @@ -84,9 +86,9 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|   if (progname.find(' ') != std::string::npos) |   if (progname.find(' ') != std::string::npos) | ||||||
|     len += 2; |     len += 2; | ||||||
|  |  | ||||||
|   for (unsigned i = 0; i < args.size(); i++) { |   for (unsigned i = 0; args[i]; i++) { | ||||||
|     len += args[i].length() + 1; |     len += strlen(args[i]) + 1; | ||||||
|     if (args[i].find(' ') != std::string::npos) |     if (strchr(args[i], ' ')) | ||||||
|       len += 2; |       len += 2; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -103,13 +105,14 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|     *p++ = '"'; |     *p++ = '"'; | ||||||
|   *p++ = ' '; |   *p++ = ' '; | ||||||
|  |  | ||||||
|   for (unsigned i = 0; i < args.size(); i++) { |   for (unsigned i = 0; args[i]; i++) { | ||||||
|     const std::string& arg = args[i]; |     const char *arg = args[i]; | ||||||
|     needsQuoting = arg.find(' ') != std::string::npos; | 	size_t len = strlen(arg); | ||||||
|  |     needsQuoting = strchr(arg, ' ') != 0; | ||||||
|     if (needsQuoting) |     if (needsQuoting) | ||||||
|       *p++ = '"'; |       *p++ = '"'; | ||||||
|     memcpy(p, arg.c_str(), arg.length()); |     memcpy(p, arg, len); | ||||||
|     p += arg.length(); |     p += len; | ||||||
|     if (needsQuoting) |     if (needsQuoting) | ||||||
|       *p++ = '"'; |       *p++ = '"'; | ||||||
|     *p++ = ' '; |     *p++ = ' '; | ||||||
| @@ -122,6 +125,8 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|   memset(&si, 0, sizeof(si)); |   memset(&si, 0, sizeof(si)); | ||||||
|   si.cb = sizeof(si); |   si.cb = sizeof(si); | ||||||
|  |  | ||||||
|  |   // TODO: do replacement of standard input/output/error handles. | ||||||
|  |  | ||||||
|   PROCESS_INFORMATION pi; |   PROCESS_INFORMATION pi; | ||||||
|   memset(&pi, 0, sizeof(pi)); |   memset(&pi, 0, sizeof(pi)); | ||||||
|  |  | ||||||
| @@ -133,7 +138,17 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Wait for it to terminate. |   // Wait for it to terminate. | ||||||
|   WaitForSingleObject(pi.hProcess, INFINITE); |   DWORD millisecondsToWait = INFINITE; | ||||||
|  |   if (secondsToWait > 0) | ||||||
|  |     millisecondsToWait = secondsToWait * 1000; | ||||||
|  |  | ||||||
|  |   if (WaitForSingleObject(pi.hProcess, millisecondsToWait) == WAIT_TIMEOUT) { | ||||||
|  |     if (!TerminateProcess(pi.hProcess, 1)) { | ||||||
|  |       ThrowError(std::string("Failed to terminate timed-out program '") +  | ||||||
|  |                  path.toString() + "'"); | ||||||
|  |     } | ||||||
|  |     WaitForSingleObject(pi.hProcess, INFINITE); | ||||||
|  |   } | ||||||
|    |    | ||||||
|   // Get its exit status. |   // Get its exit status. | ||||||
|   DWORD status; |   DWORD status; | ||||||
|   | |||||||
| @@ -69,8 +69,10 @@ Program::FindProgramByName(const std::string& progName) { | |||||||
| // | // | ||||||
| int  | int  | ||||||
| Program::ExecuteAndWait(const Path& path,  | Program::ExecuteAndWait(const Path& path,  | ||||||
|                         const std::vector<std::string>& args, |                         const char** args, | ||||||
|                         const char** envp) { |                         const char** envp, | ||||||
|  |                         const Path** redirects, | ||||||
|  |                         unsigned secondsToWait) { | ||||||
|   if (!path.executable()) |   if (!path.executable()) | ||||||
|     throw path.toString() + " is not executable";  |     throw path.toString() + " is not executable";  | ||||||
|  |  | ||||||
| @@ -84,9 +86,9 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|   if (progname.find(' ') != std::string::npos) |   if (progname.find(' ') != std::string::npos) | ||||||
|     len += 2; |     len += 2; | ||||||
|  |  | ||||||
|   for (unsigned i = 0; i < args.size(); i++) { |   for (unsigned i = 0; args[i]; i++) { | ||||||
|     len += args[i].length() + 1; |     len += strlen(args[i]) + 1; | ||||||
|     if (args[i].find(' ') != std::string::npos) |     if (strchr(args[i], ' ')) | ||||||
|       len += 2; |       len += 2; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -103,13 +105,14 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|     *p++ = '"'; |     *p++ = '"'; | ||||||
|   *p++ = ' '; |   *p++ = ' '; | ||||||
|  |  | ||||||
|   for (unsigned i = 0; i < args.size(); i++) { |   for (unsigned i = 0; args[i]; i++) { | ||||||
|     const std::string& arg = args[i]; |     const char *arg = args[i]; | ||||||
|     needsQuoting = arg.find(' ') != std::string::npos; | 	size_t len = strlen(arg); | ||||||
|  |     needsQuoting = strchr(arg, ' ') != 0; | ||||||
|     if (needsQuoting) |     if (needsQuoting) | ||||||
|       *p++ = '"'; |       *p++ = '"'; | ||||||
|     memcpy(p, arg.c_str(), arg.length()); |     memcpy(p, arg, len); | ||||||
|     p += arg.length(); |     p += len; | ||||||
|     if (needsQuoting) |     if (needsQuoting) | ||||||
|       *p++ = '"'; |       *p++ = '"'; | ||||||
|     *p++ = ' '; |     *p++ = ' '; | ||||||
| @@ -122,6 +125,8 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|   memset(&si, 0, sizeof(si)); |   memset(&si, 0, sizeof(si)); | ||||||
|   si.cb = sizeof(si); |   si.cb = sizeof(si); | ||||||
|  |  | ||||||
|  |   // TODO: do replacement of standard input/output/error handles. | ||||||
|  |  | ||||||
|   PROCESS_INFORMATION pi; |   PROCESS_INFORMATION pi; | ||||||
|   memset(&pi, 0, sizeof(pi)); |   memset(&pi, 0, sizeof(pi)); | ||||||
|  |  | ||||||
| @@ -133,7 +138,17 @@ Program::ExecuteAndWait(const Path& path, | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Wait for it to terminate. |   // Wait for it to terminate. | ||||||
|   WaitForSingleObject(pi.hProcess, INFINITE); |   DWORD millisecondsToWait = INFINITE; | ||||||
|  |   if (secondsToWait > 0) | ||||||
|  |     millisecondsToWait = secondsToWait * 1000; | ||||||
|  |  | ||||||
|  |   if (WaitForSingleObject(pi.hProcess, millisecondsToWait) == WAIT_TIMEOUT) { | ||||||
|  |     if (!TerminateProcess(pi.hProcess, 1)) { | ||||||
|  |       ThrowError(std::string("Failed to terminate timed-out program '") +  | ||||||
|  |                  path.toString() + "'"); | ||||||
|  |     } | ||||||
|  |     WaitForSingleObject(pi.hProcess, INFINITE); | ||||||
|  |   } | ||||||
|    |    | ||||||
|   // Get its exit status. |   // Get its exit status. | ||||||
|   DWORD status; |   DWORD status; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user