diff options
Diffstat (limited to 'third_party/git/compat/win32')
-rw-r--r-- | third_party/git/compat/win32/alloca.h | 1 | ||||
-rw-r--r-- | third_party/git/compat/win32/dirent.c | 92 | ||||
-rw-r--r-- | third_party/git/compat/win32/dirent.h | 20 | ||||
-rw-r--r-- | third_party/git/compat/win32/git.manifest | 25 | ||||
-rw-r--r-- | third_party/git/compat/win32/lazyload.h | 57 | ||||
-rw-r--r-- | third_party/git/compat/win32/path-utils.c | 52 | ||||
-rw-r--r-- | third_party/git/compat/win32/path-utils.h | 37 | ||||
-rw-r--r-- | third_party/git/compat/win32/pthread.c | 58 | ||||
-rw-r--r-- | third_party/git/compat/win32/pthread.h | 100 | ||||
-rw-r--r-- | third_party/git/compat/win32/syslog.c | 80 | ||||
-rw-r--r-- | third_party/git/compat/win32/syslog.h | 20 | ||||
-rw-r--r-- | third_party/git/compat/win32/trace2_win32_process_info.c | 191 |
12 files changed, 0 insertions, 733 deletions
diff --git a/third_party/git/compat/win32/alloca.h b/third_party/git/compat/win32/alloca.h deleted file mode 100644 index c0d7985b7edd..000000000000 --- a/third_party/git/compat/win32/alloca.h +++ /dev/null @@ -1 +0,0 @@ -#include <malloc.h> diff --git a/third_party/git/compat/win32/dirent.c b/third_party/git/compat/win32/dirent.c deleted file mode 100644 index 52420ec7d4da..000000000000 --- a/third_party/git/compat/win32/dirent.c +++ /dev/null @@ -1,92 +0,0 @@ -#include "../../git-compat-util.h" - -struct DIR { - struct dirent dd_dir; /* includes d_type */ - HANDLE dd_handle; /* FindFirstFile handle */ - int dd_stat; /* 0-based index */ -}; - -static inline void finddata2dirent(struct dirent *ent, WIN32_FIND_DATAW *fdata) -{ - /* convert UTF-16 name to UTF-8 */ - xwcstoutf(ent->d_name, fdata->cFileName, sizeof(ent->d_name)); - - /* Set file type, based on WIN32_FIND_DATA */ - if (fdata->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - ent->d_type = DT_DIR; - else - ent->d_type = DT_REG; -} - -DIR *opendir(const char *name) -{ - wchar_t pattern[MAX_PATH + 2]; /* + 2 for '/' '*' */ - WIN32_FIND_DATAW fdata; - HANDLE h; - int len; - DIR *dir; - - /* convert name to UTF-16 and check length < MAX_PATH */ - if ((len = xutftowcs_path(pattern, name)) < 0) - return NULL; - - /* append optional '/' and wildcard '*' */ - if (len && !is_dir_sep(pattern[len - 1])) - pattern[len++] = '/'; - pattern[len++] = '*'; - pattern[len] = 0; - - /* open find handle */ - h = FindFirstFileW(pattern, &fdata); - if (h == INVALID_HANDLE_VALUE) { - DWORD err = GetLastError(); - errno = (err == ERROR_DIRECTORY) ? ENOTDIR : err_win_to_posix(err); - return NULL; - } - - /* initialize DIR structure and copy first dir entry */ - dir = xmalloc(sizeof(DIR)); - dir->dd_handle = h; - dir->dd_stat = 0; - finddata2dirent(&dir->dd_dir, &fdata); - return dir; -} - -struct dirent *readdir(DIR *dir) -{ - if (!dir) { - errno = EBADF; /* No set_errno for mingw */ - return NULL; - } - - /* if first entry, dirent has already been set up by opendir */ - if (dir->dd_stat) { - /* get next entry and convert from WIN32_FIND_DATA to dirent */ - WIN32_FIND_DATAW fdata; - if (FindNextFileW(dir->dd_handle, &fdata)) { - finddata2dirent(&dir->dd_dir, &fdata); - } else { - DWORD lasterr = GetLastError(); - /* POSIX says you shouldn't set errno when readdir can't - find any more files; so, if another error we leave it set. */ - if (lasterr != ERROR_NO_MORE_FILES) - errno = err_win_to_posix(lasterr); - return NULL; - } - } - - ++dir->dd_stat; - return &dir->dd_dir; -} - -int closedir(DIR *dir) -{ - if (!dir) { - errno = EBADF; - return -1; - } - - FindClose(dir->dd_handle); - free(dir); - return 0; -} diff --git a/third_party/git/compat/win32/dirent.h b/third_party/git/compat/win32/dirent.h deleted file mode 100644 index 058207e4bfed..000000000000 --- a/third_party/git/compat/win32/dirent.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef DIRENT_H -#define DIRENT_H - -typedef struct DIR DIR; - -#define DT_UNKNOWN 0 -#define DT_DIR 1 -#define DT_REG 2 -#define DT_LNK 3 - -struct dirent { - unsigned char d_type; /* file type to prevent lstat after readdir */ - char d_name[MAX_PATH * 3]; /* file name (* 3 for UTF-8 conversion) */ -}; - -DIR *opendir(const char *dirname); -struct dirent *readdir(DIR *dir); -int closedir(DIR *dir); - -#endif /* DIRENT_H */ diff --git a/third_party/git/compat/win32/git.manifest b/third_party/git/compat/win32/git.manifest deleted file mode 100644 index 771e3cce4315..000000000000 --- a/third_party/git/compat/win32/git.manifest +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> - <assemblyIdentity type="win32" name="Git" version="0.0.0.1" /> - <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> - <security> - <requestedPrivileges> - <requestedExecutionLevel level="asInvoker" uiAccess="false" /> - </requestedPrivileges> - </security> - </trustInfo> - <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> - <application> - <!-- Windows Vista --> - <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> - <!-- Windows 7 --> - <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> - <!-- Windows 8 --> - <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> - <!-- Windows 8.1 --> - <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> - <!-- Windows 10 --> - <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> - </application> - </compatibility> -</assembly> diff --git a/third_party/git/compat/win32/lazyload.h b/third_party/git/compat/win32/lazyload.h deleted file mode 100644 index 9e631c8593ff..000000000000 --- a/third_party/git/compat/win32/lazyload.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef LAZYLOAD_H -#define LAZYLOAD_H - -/* - * A pair of macros to simplify loading of DLL functions. Example: - * - * DECLARE_PROC_ADDR(kernel32.dll, BOOL, CreateHardLinkW, - * LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES); - * - * if (!INIT_PROC_ADDR(CreateHardLinkW)) - * return error("Could not find CreateHardLinkW() function"; - * - * if (!CreateHardLinkW(source, target, NULL)) - * return error("could not create hardlink from %S to %S", - * source, target); - */ - -struct proc_addr { - const char *const dll; - const char *const function; - FARPROC pfunction; - unsigned initialized : 1; -}; - -/* Declares a function to be loaded dynamically from a DLL. */ -#define DECLARE_PROC_ADDR(dll, rettype, function, ...) \ - static struct proc_addr proc_addr_##function = \ - { #dll, #function, NULL, 0 }; \ - static rettype (WINAPI *function)(__VA_ARGS__) - -/* - * Loads a function from a DLL (once-only). - * Returns non-NULL function pointer on success. - * Returns NULL + errno == ENOSYS on failure. - * This function is not thread-safe. - */ -#define INIT_PROC_ADDR(function) \ - (function = get_proc_addr(&proc_addr_##function)) - -static inline void *get_proc_addr(struct proc_addr *proc) -{ - /* only do this once */ - if (!proc->initialized) { - HANDLE hnd; - proc->initialized = 1; - hnd = LoadLibraryExA(proc->dll, NULL, - LOAD_LIBRARY_SEARCH_SYSTEM32); - if (hnd) - proc->pfunction = GetProcAddress(hnd, proc->function); - } - /* set ENOSYS if DLL or function was not found */ - if (!proc->pfunction) - errno = ENOSYS; - return proc->pfunction; -} - -#endif diff --git a/third_party/git/compat/win32/path-utils.c b/third_party/git/compat/win32/path-utils.c deleted file mode 100644 index ebf2f12eb666..000000000000 --- a/third_party/git/compat/win32/path-utils.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "../../git-compat-util.h" - -int win32_has_dos_drive_prefix(const char *path) -{ - int i; - - /* - * Does it start with an ASCII letter (i.e. highest bit not set), - * followed by a colon? - */ - if (!(0x80 & (unsigned char)*path)) - return *path && path[1] == ':' ? 2 : 0; - - /* - * While drive letters must be letters of the English alphabet, it is - * possible to assign virtually _any_ Unicode character via `subst` as - * a drive letter to "virtual drives". Even `1`, or `ä`. Or fun stuff - * like this: - * - * subst ֍: %USERPROFILE%\Desktop - */ - for (i = 1; i < 4 && (0x80 & (unsigned char)path[i]); i++) - ; /* skip first UTF-8 character */ - return path[i] == ':' ? i + 1 : 0; -} - -int win32_skip_dos_drive_prefix(char **path) -{ - int ret = has_dos_drive_prefix(*path); - *path += ret; - return ret; -} - -int win32_offset_1st_component(const char *path) -{ - char *pos = (char *)path; - - /* unc paths */ - if (!skip_dos_drive_prefix(&pos) && - is_dir_sep(pos[0]) && is_dir_sep(pos[1])) { - /* skip server name */ - pos = strpbrk(pos + 2, "\\/"); - if (!pos) - return 0; /* Error: malformed unc path */ - - do { - pos++; - } while (*pos && !is_dir_sep(*pos)); - } - - return pos + is_dir_sep(*pos) - path; -} diff --git a/third_party/git/compat/win32/path-utils.h b/third_party/git/compat/win32/path-utils.h deleted file mode 100644 index bba2b644080f..000000000000 --- a/third_party/git/compat/win32/path-utils.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef WIN32_PATH_UTILS_H -#define WIN32_PATH_UTILS_H - -int win32_has_dos_drive_prefix(const char *path); -#define has_dos_drive_prefix win32_has_dos_drive_prefix - -int win32_skip_dos_drive_prefix(char **path); -#define skip_dos_drive_prefix win32_skip_dos_drive_prefix -static inline int win32_is_dir_sep(int c) -{ - return c == '/' || c == '\\'; -} -#define is_dir_sep win32_is_dir_sep -static inline char *win32_find_last_dir_sep(const char *path) -{ - char *ret = NULL; - for (; *path; ++path) - if (is_dir_sep(*path)) - ret = (char *)path; - return ret; -} -#define find_last_dir_sep win32_find_last_dir_sep -static inline int win32_has_dir_sep(const char *path) -{ - /* - * See how long the non-separator part of the given path is, and - * if and only if it covers the whole path (i.e. path[len] is NUL), - * there is no separator in the path---otherwise there is a separator. - */ - size_t len = strcspn(path, "/\\"); - return !!path[len]; -} -#define has_dir_sep(path) win32_has_dir_sep(path) -int win32_offset_1st_component(const char *path); -#define offset_1st_component win32_offset_1st_component - -#endif diff --git a/third_party/git/compat/win32/pthread.c b/third_party/git/compat/win32/pthread.c deleted file mode 100644 index 2e7eead42cb0..000000000000 --- a/third_party/git/compat/win32/pthread.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2009 Andrzej K. Haczewski <ahaczewski@gmail.com> - * - * DISCLAIMER: The implementation is Git-specific, it is subset of original - * Pthreads API, without lots of other features that Git doesn't use. - * Git also makes sure that the passed arguments are valid, so there's - * no need for double-checking. - */ - -#include "../../git-compat-util.h" -#include "pthread.h" - -#include <errno.h> -#include <limits.h> - -static unsigned __stdcall win32_start_routine(void *arg) -{ - pthread_t *thread = arg; - thread->tid = GetCurrentThreadId(); - thread->arg = thread->start_routine(thread->arg); - return 0; -} - -int pthread_create(pthread_t *thread, const void *unused, - void *(*start_routine)(void*), void *arg) -{ - thread->arg = arg; - thread->start_routine = start_routine; - thread->handle = (HANDLE) - _beginthreadex(NULL, 0, win32_start_routine, thread, 0, NULL); - - if (!thread->handle) - return errno; - else - return 0; -} - -int win32_pthread_join(pthread_t *thread, void **value_ptr) -{ - DWORD result = WaitForSingleObject(thread->handle, INFINITE); - switch (result) { - case WAIT_OBJECT_0: - if (value_ptr) - *value_ptr = thread->arg; - return 0; - case WAIT_ABANDONED: - return EINVAL; - default: - return err_win_to_posix(GetLastError()); - } -} - -pthread_t pthread_self(void) -{ - pthread_t t = { NULL }; - t.tid = GetCurrentThreadId(); - return t; -} diff --git a/third_party/git/compat/win32/pthread.h b/third_party/git/compat/win32/pthread.h deleted file mode 100644 index 737983d00bae..000000000000 --- a/third_party/git/compat/win32/pthread.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Header used to adapt pthread-based POSIX code to Windows API threads. - * - * Copyright (C) 2009 Andrzej K. Haczewski <ahaczewski@gmail.com> - */ - -#ifndef PTHREAD_H -#define PTHREAD_H - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#include <windows.h> - -/* - * Defines that adapt Windows API threads to pthreads API - */ -#define pthread_mutex_t CRITICAL_SECTION - -static inline int return_0(int i) { - return 0; -} -#define pthread_mutex_init(a,b) return_0((InitializeCriticalSection((a)), 0)) -#define pthread_mutex_destroy(a) DeleteCriticalSection((a)) -#define pthread_mutex_lock EnterCriticalSection -#define pthread_mutex_unlock LeaveCriticalSection - -typedef int pthread_mutexattr_t; -#define pthread_mutexattr_init(a) (*(a) = 0) -#define pthread_mutexattr_destroy(a) do {} while (0) -#define pthread_mutexattr_settype(a, t) 0 -#define PTHREAD_MUTEX_RECURSIVE 0 - -#define pthread_cond_t CONDITION_VARIABLE - -#define pthread_cond_init(a,b) InitializeConditionVariable((a)) -#define pthread_cond_destroy(a) do {} while (0) -#define pthread_cond_wait(a,b) return_0(SleepConditionVariableCS((a), (b), INFINITE)) -#define pthread_cond_signal WakeConditionVariable -#define pthread_cond_broadcast WakeAllConditionVariable - -/* - * Simple thread creation implementation using pthread API - */ -typedef struct { - HANDLE handle; - void *(*start_routine)(void*); - void *arg; - DWORD tid; -} pthread_t; - -int pthread_create(pthread_t *thread, const void *unused, - void *(*start_routine)(void*), void *arg); - -/* - * To avoid the need of copying a struct, we use small macro wrapper to pass - * pointer to win32_pthread_join instead. - */ -#define pthread_join(a, b) win32_pthread_join(&(a), (b)) - -int win32_pthread_join(pthread_t *thread, void **value_ptr); - -#define pthread_equal(t1, t2) ((t1).tid == (t2).tid) -pthread_t pthread_self(void); - -static inline void NORETURN pthread_exit(void *ret) -{ - ExitThread((DWORD)(intptr_t)ret); -} - -typedef DWORD pthread_key_t; -static inline int pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *value)) -{ - return (*keyp = TlsAlloc()) == TLS_OUT_OF_INDEXES ? EAGAIN : 0; -} - -static inline int pthread_key_delete(pthread_key_t key) -{ - return TlsFree(key) ? 0 : EINVAL; -} - -static inline int pthread_setspecific(pthread_key_t key, const void *value) -{ - return TlsSetValue(key, (void *)value) ? 0 : EINVAL; -} - -static inline void *pthread_getspecific(pthread_key_t key) -{ - return TlsGetValue(key); -} - -#ifndef __MINGW64_VERSION_MAJOR -static inline int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset) -{ - return 0; -} -#endif - -#endif /* PTHREAD_H */ diff --git a/third_party/git/compat/win32/syslog.c b/third_party/git/compat/win32/syslog.c deleted file mode 100644 index 161978d720ae..000000000000 --- a/third_party/git/compat/win32/syslog.c +++ /dev/null @@ -1,80 +0,0 @@ -#include "../../git-compat-util.h" - -static HANDLE ms_eventlog; - -void openlog(const char *ident, int logopt, int facility) -{ - if (ms_eventlog) - return; - - ms_eventlog = RegisterEventSourceA(NULL, ident); - - if (!ms_eventlog) - warning("RegisterEventSource() failed: %lu", GetLastError()); -} - -void syslog(int priority, const char *fmt, ...) -{ - WORD logtype; - char *str, *pos; - int str_len; - va_list ap; - - if (!ms_eventlog) - return; - - va_start(ap, fmt); - str_len = vsnprintf(NULL, 0, fmt, ap); - va_end(ap); - - if (str_len < 0) { - warning_errno("vsnprintf failed"); - return; - } - - str = malloc(st_add(str_len, 1)); - if (!str) { - warning_errno("malloc failed"); - return; - } - - va_start(ap, fmt); - vsnprintf(str, str_len + 1, fmt, ap); - va_end(ap); - - while ((pos = strstr(str, "%1")) != NULL) { - char *oldstr = str; - str = realloc(str, st_add(++str_len, 1)); - if (!str) { - free(oldstr); - warning_errno("realloc failed"); - return; - } - memmove(pos + 2, pos + 1, strlen(pos)); - pos[1] = ' '; - } - - switch (priority) { - case LOG_EMERG: - case LOG_ALERT: - case LOG_CRIT: - case LOG_ERR: - logtype = EVENTLOG_ERROR_TYPE; - break; - - case LOG_WARNING: - logtype = EVENTLOG_WARNING_TYPE; - break; - - case LOG_NOTICE: - case LOG_INFO: - case LOG_DEBUG: - default: - logtype = EVENTLOG_INFORMATION_TYPE; - break; - } - - ReportEventA(ms_eventlog, logtype, 0, 0, NULL, 1, 0, - (const char **)&str, NULL); - free(str); -} diff --git a/third_party/git/compat/win32/syslog.h b/third_party/git/compat/win32/syslog.h deleted file mode 100644 index 70daa7c08b8d..000000000000 --- a/third_party/git/compat/win32/syslog.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef SYSLOG_H -#define SYSLOG_H - -#define LOG_PID 0x01 - -#define LOG_EMERG 0 -#define LOG_ALERT 1 -#define LOG_CRIT 2 -#define LOG_ERR 3 -#define LOG_WARNING 4 -#define LOG_NOTICE 5 -#define LOG_INFO 6 -#define LOG_DEBUG 7 - -#define LOG_DAEMON (3<<3) - -void openlog(const char *ident, int logopt, int facility); -void syslog(int priority, const char *fmt, ...); - -#endif /* SYSLOG_H */ diff --git a/third_party/git/compat/win32/trace2_win32_process_info.c b/third_party/git/compat/win32/trace2_win32_process_info.c deleted file mode 100644 index 8ccbd1c2c6f8..000000000000 --- a/third_party/git/compat/win32/trace2_win32_process_info.c +++ /dev/null @@ -1,191 +0,0 @@ -#include "../../cache.h" -#include "../../json-writer.h" -#include "lazyload.h" -#include <Psapi.h> -#include <tlHelp32.h> - -/* - * An arbitrarily chosen value to limit the size of the ancestor - * array built in git_processes(). - */ -#define NR_PIDS_LIMIT 10 - -/* - * Find the process data for the given PID in the given snapshot - * and update the PROCESSENTRY32 data. - */ -static int find_pid(DWORD pid, HANDLE hSnapshot, PROCESSENTRY32 *pe32) -{ - pe32->dwSize = sizeof(PROCESSENTRY32); - - if (Process32First(hSnapshot, pe32)) { - do { - if (pe32->th32ProcessID == pid) - return 1; - } while (Process32Next(hSnapshot, pe32)); - } - return 0; -} - -/* - * Accumulate JSON array of our parent processes: - * [ - * exe-name-parent, - * exe-name-grand-parent, - * ... - * ] - * - * Note: we only report the filename of the process executable; the - * only way to get its full pathname is to use OpenProcess() - * and GetModuleFileNameEx() or QueryfullProcessImageName() - * and that seems rather expensive (on top of the cost of - * getting the snapshot). - * - * Note: we compute the set of parent processes by walking the PPID - * link in each visited PROCESSENTRY32 record. This search - * stops when an ancestor process is not found in the snapshot - * (because it exited before the current or intermediate parent - * process exited). - * - * This search may compute an incorrect result if the PPID link - * refers to the PID of an exited parent and that PID has been - * recycled and given to a new unrelated process. - * - * Worse, it is possible for a child or descendant of the - * current process to be given the recycled PID and cause a - * PPID-cycle. This would cause an infinite loop building our - * parent process array. - * - * Note: for completeness, the "System Idle" process has PID=0 and - * PPID=0 and could cause another PPID-cycle. We don't expect - * Git to be a descendant of the idle process, but because of - * PID recycling, it might be possible to get a PPID link value - * of 0. This too would cause an infinite loop. - * - * Therefore, we keep an array of the visited PPIDs to guard against - * cycles. - * - * We use a fixed-size array rather than ALLOC_GROW to keep things - * simple and avoid the alloc/realloc overhead. It is OK if we - * truncate the search and return a partial answer. - */ -static void get_processes(struct json_writer *jw, HANDLE hSnapshot) -{ - PROCESSENTRY32 pe32; - DWORD pid; - DWORD pid_list[NR_PIDS_LIMIT]; - int k, nr_pids = 0; - - pid = GetCurrentProcessId(); - while (find_pid(pid, hSnapshot, &pe32)) { - /* Only report parents. Omit self from the JSON output. */ - if (nr_pids) - jw_array_string(jw, pe32.szExeFile); - - /* Check for cycle in snapshot. (Yes, it happened.) */ - for (k = 0; k < nr_pids; k++) - if (pid == pid_list[k]) { - jw_array_string(jw, "(cycle)"); - return; - } - - if (nr_pids == NR_PIDS_LIMIT) { - jw_array_string(jw, "(truncated)"); - return; - } - - pid_list[nr_pids++] = pid; - - pid = pe32.th32ParentProcessID; - } -} - -/* - * Emit JSON data for the current and parent processes. Individual - * trace2 targets can decide how to actually print it. - */ -static void get_ancestry(void) -{ - HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - - if (hSnapshot != INVALID_HANDLE_VALUE) { - struct json_writer jw = JSON_WRITER_INIT; - - jw_array_begin(&jw, 0); - get_processes(&jw, hSnapshot); - jw_end(&jw); - - trace2_data_json("process", the_repository, "windows/ancestry", - &jw); - - jw_release(&jw); - CloseHandle(hSnapshot); - } -} - -/* - * Is a debugger attached to the current process? - * - * This will catch debug runs (where the debugger started the process). - * This is the normal case. Since this code is called during our startup, - * it will not report instances where a debugger is attached dynamically - * to a running git process, but that is relatively rare. - */ -static void get_is_being_debugged(void) -{ - if (IsDebuggerPresent()) - trace2_data_intmax("process", the_repository, - "windows/debugger_present", 1); -} - -/* - * Emit JSON data with the peak memory usage of the current process. - */ -static void get_peak_memory_info(void) -{ - DECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, HANDLE, - PPROCESS_MEMORY_COUNTERS, DWORD); - - if (INIT_PROC_ADDR(GetProcessMemoryInfo)) { - PROCESS_MEMORY_COUNTERS pmc; - - if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, - sizeof(pmc))) { - struct json_writer jw = JSON_WRITER_INIT; - - jw_object_begin(&jw, 0); - -#define KV(kv) #kv, (intmax_t)pmc.kv - - jw_object_intmax(&jw, KV(PageFaultCount)); - jw_object_intmax(&jw, KV(PeakWorkingSetSize)); - jw_object_intmax(&jw, KV(PeakPagefileUsage)); - - jw_end(&jw); - - trace2_data_json("process", the_repository, - "windows/memory", &jw); - jw_release(&jw); - } - } -} - -void trace2_collect_process_info(enum trace2_process_info_reason reason) -{ - if (!trace2_is_enabled()) - return; - - switch (reason) { - case TRACE2_PROCESS_INFO_STARTUP: - get_is_being_debugged(); - get_ancestry(); - return; - - case TRACE2_PROCESS_INFO_EXIT: - get_peak_memory_info(); - return; - - default: - BUG("trace2_collect_process_info: unknown reason '%d'", reason); - } -} |