X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=os%2Fwindows%2Fposix.c;h=8a52a6849e4b4083b5d6ba0a6c787346714890a7;hb=01d269552bca14c90bdcc2288e64ba2426c045ea;hp=29ed2c57172735b6bf73abed670d543a772badc5;hpb=ad9c0fbc7ce6d1bba089f543036c997cbad84d7b;p=fio.git diff --git a/os/windows/posix.c b/os/windows/posix.c index 29ed2c57..8a52a684 100755 --- a/os/windows/posix.c +++ b/os/windows/posix.c @@ -20,6 +20,7 @@ #include #include "../os-windows.h" +#include "../../lib/hweight.h" extern unsigned long mtime_since_now(struct timeval *); extern void fio_gettime(struct timeval *, void *); @@ -42,20 +43,53 @@ int vsprintf_s( const char *format, va_list argptr); +int GetNumLogicalProcessors(void) +{ + SYSTEM_LOGICAL_PROCESSOR_INFORMATION *processor_info = NULL; + DWORD len = 0; + DWORD num_processors = 0; + DWORD error = 0; + DWORD i; + + while (!GetLogicalProcessorInformation(processor_info, &len)) { + error = GetLastError(); + if (error == ERROR_INSUFFICIENT_BUFFER) + processor_info = malloc(len); + else { + log_err("Error: GetLogicalProcessorInformation failed: %d\n", error); + return -1; + } + + if (processor_info == NULL) { + log_err("Error: failed to allocate memory for GetLogicalProcessorInformation"); + return -1; + } + } + + for (i = 0; i < len / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++) + { + if (processor_info[i].Relationship == RelationProcessorCore) + num_processors += hweight64(processor_info[i].ProcessorMask); + } + + free(processor_info); + return num_processors; +} + long sysconf(int name) { - long long val = -1; - DWORD len; - SYSTEM_LOGICAL_PROCESSOR_INFORMATION processorInfo; + long val = -1; + long val2 = -1; SYSTEM_INFO sysInfo; MEMORYSTATUSEX status; switch (name) { case _SC_NPROCESSORS_ONLN: - len = sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); - GetLogicalProcessorInformation(&processorInfo, &len); - val = len / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); + val = GetNumLogicalProcessors(); + if (val == -1) + log_err("sysconf(_SC_NPROCESSORS_ONLN) failed\n"); + break; case _SC_PAGESIZE: @@ -65,8 +99,11 @@ long sysconf(int name) case _SC_PHYS_PAGES: status.dwLength = sizeof(status); - GlobalMemoryStatusEx(&status); - val = status.ullTotalPhys; + val2 = sysconf(_SC_PAGESIZE); + if (GlobalMemoryStatusEx(&status) && val2 != -1) + val = status.ullTotalPhys / val2; + else + log_err("sysconf(_SC_PHYS_PAGES) failed\n"); break; default: log_err("sysconf(%d) is not implemented\n", name); @@ -234,10 +271,10 @@ void syslog(int priority, const char *message, ... /* argument */) va_start(v, message); len = _vscprintf(message, v); output = malloc(len + sizeof(char)); - vsprintf_s(output, len + sizeof(char), message, v); + vsprintf(output, message, v); WriteFile(log_file, output, len, &bytes_written, NULL); va_end(v); - free(output); + free(output); } int kill(pid_t pid, int sig) @@ -375,50 +412,6 @@ char *basename(char *path) return name; } -int posix_fallocate(int fd, off_t offset, off_t len) -{ - const int BUFFER_SIZE = 64 * 1024 * 1024; - int rc = 0; - char *buf; - unsigned int write_len; - unsigned int bytes_written; - off_t bytes_remaining = len; - - if (len == 0 || offset < 0) - return EINVAL; - - buf = malloc(BUFFER_SIZE); - - if (buf == NULL) - return ENOMEM; - - memset(buf, 0, BUFFER_SIZE); - - int64_t prev_pos = _telli64(fd); - - if (_lseeki64(fd, offset, SEEK_SET) == -1) - return errno; - - while (bytes_remaining > 0) { - if (bytes_remaining < BUFFER_SIZE) - write_len = (unsigned int)bytes_remaining; - else - write_len = BUFFER_SIZE; - - bytes_written = _write(fd, buf, write_len); - if (bytes_written == -1) { - rc = errno; - break; - } - - bytes_remaining -= bytes_written; - } - - free(buf); - _lseeki64(fd, prev_pos, SEEK_SET); - return rc; -} - int ftruncate(int fildes, off_t length) { BOOL bSuccess; @@ -511,11 +504,21 @@ int getrusage(int who, struct rusage *r_usage) const uint64_t SECONDS_BETWEEN_1601_AND_1970 = 11644473600; FILETIME cTime, eTime, kTime, uTime; time_t time; + HANDLE h; memset(r_usage, 0, sizeof(*r_usage)); - HANDLE hProcess = GetCurrentProcess(); - GetProcessTimes(hProcess, &cTime, &eTime, &kTime, &uTime); + if (who == RUSAGE_SELF) { + h = GetCurrentProcess(); + GetProcessTimes(h, &cTime, &eTime, &kTime, &uTime); + } else if (who == RUSAGE_THREAD) { + h = GetCurrentThread(); + GetThreadTimes(h, &cTime, &eTime, &kTime, &uTime); + } else { + log_err("fio: getrusage %d is not implemented\n", who); + return -1; + } + time = ((uint64_t)uTime.dwHighDateTime << 32) + uTime.dwLowDateTime; /* Divide by 10,000,000 to get the number of seconds and move the epoch from * 1601 to 1970 */ @@ -532,6 +535,11 @@ int getrusage(int who, struct rusage *r_usage) return 0; } +int posix_fadvise(int fd, off_t offset, off_t len, int advice) +{ + return 0; +} + int posix_madvise(void *addr, size_t len, int advice) { log_err("%s is not implemented\n", __func__); @@ -587,39 +595,6 @@ long long strtoll(const char *restrict str, char **restrict endptr, return _strtoi64(str, endptr, base); } -char *strsep(char **stringp, const char *delim) -{ - char *orig = *stringp; - BOOL gotMatch = FALSE; - int i = 0; - int j = 0; - - if (*stringp == NULL) - return NULL; - - while ((*stringp)[i] != '\0') { - j = 0; - while (delim[j] != '\0') { - if ((*stringp)[i] == delim[j]) { - gotMatch = TRUE; - (*stringp)[i] = '\0'; - *stringp = *stringp + i + 1; - break; - } - j++; - } - if (gotMatch) - break; - - i++; - } - - if (!gotMatch) - *stringp = NULL; - - return orig; -} - int poll(struct pollfd fds[], nfds_t nfds, int timeout) { struct timeval tv; @@ -628,11 +603,11 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout) int i; int rc; - if (timeout != -1) + if (timeout != -1) { to = &tv; - - to->tv_sec = timeout / 1000; - to->tv_usec = (timeout % 1000) * 1000; + to->tv_sec = timeout / 1000; + to->tv_usec = (timeout % 1000) * 1000; + } FD_ZERO(&readfds); FD_ZERO(&writefds); @@ -707,40 +682,40 @@ int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) DIR *opendir(const char *dirname) { - struct dirent_ctx *dc = NULL; - - /* See if we can open it. If not, we'll return an error here */ - HANDLE file = CreateFileA(dirname, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); - if (file != INVALID_HANDLE_VALUE) { - CloseHandle(file); - dc = (struct dirent_ctx*)malloc(sizeof(struct dirent_ctx)); - StringCchCopyA(dc->dirname, MAX_PATH, dirname); - dc->find_handle = INVALID_HANDLE_VALUE; - } else { - DWORD error = GetLastError(); - if (error == ERROR_FILE_NOT_FOUND) - errno = ENOENT; - - else if (error == ERROR_PATH_NOT_FOUND) - errno = ENOTDIR; - else if (error == ERROR_TOO_MANY_OPEN_FILES) - errno = ENFILE; - else if (error == ERROR_ACCESS_DENIED) - errno = EACCES; - else - errno = error; - } - - return dc; + struct dirent_ctx *dc = NULL; + + /* See if we can open it. If not, we'll return an error here */ + HANDLE file = CreateFileA(dirname, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); + if (file != INVALID_HANDLE_VALUE) { + CloseHandle(file); + dc = (struct dirent_ctx*)malloc(sizeof(struct dirent_ctx)); + StringCchCopyA(dc->dirname, MAX_PATH, dirname); + dc->find_handle = INVALID_HANDLE_VALUE; + } else { + DWORD error = GetLastError(); + if (error == ERROR_FILE_NOT_FOUND) + errno = ENOENT; + + else if (error == ERROR_PATH_NOT_FOUND) + errno = ENOTDIR; + else if (error == ERROR_TOO_MANY_OPEN_FILES) + errno = ENFILE; + else if (error == ERROR_ACCESS_DENIED) + errno = EACCES; + else + errno = error; + } + + return dc; } int closedir(DIR *dirp) { - if (dirp != NULL && dirp->find_handle != INVALID_HANDLE_VALUE) - FindClose(dirp->find_handle); + if (dirp != NULL && dirp->find_handle != INVALID_HANDLE_VALUE) + FindClose(dirp->find_handle); - free(dirp); - return 0; + free(dirp); + return 0; } struct dirent *readdir(DIR *dirp) @@ -811,6 +786,7 @@ const char* inet_ntop(int af, const void *restrict src, errno = ENOSPC; WSACleanup(); + return ret; }