X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=os%2Fwindows%2Fposix.c;h=8a52a6849e4b4083b5d6ba0a6c787346714890a7;hb=01d269552bca14c90bdcc2288e64ba2426c045ea;hp=c4d738c7ecd57aa3bd963f9c3cff6ab551acd880;hpb=671b060056d176f646280f1fd0c29d72f76183e6;p=fio.git diff --git a/os/windows/posix.c b/os/windows/posix.c index c4d738c7..8a52a684 100755 --- a/os/windows/posix.c +++ b/os/windows/posix.c @@ -69,7 +69,7 @@ int GetNumLogicalProcessors(void) for (i = 0; i < len / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++) { if (processor_info[i].Relationship == RelationProcessorCore) - num_processors += hweight32(processor_info[i].ProcessorMask); + num_processors += hweight64(processor_info[i].ProcessorMask); } free(processor_info); @@ -79,6 +79,7 @@ int GetNumLogicalProcessors(void) long sysconf(int name) { long val = -1; + long val2 = -1; SYSTEM_INFO sysInfo; MEMORYSTATUSEX status; @@ -87,7 +88,7 @@ long sysconf(int name) case _SC_NPROCESSORS_ONLN: val = GetNumLogicalProcessors(); if (val == -1) - log_err("_SC_NPROCESSORS_ONLN failed\n"); + log_err("sysconf(_SC_NPROCESSORS_ONLN) failed\n"); break; @@ -98,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); @@ -408,53 +412,6 @@ char *basename(char *path) return name; } -int posix_fallocate(int fd, off_t offset, off_t len) -{ - const int BUFFER_SIZE = 256 * 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; - } - - /* Don't allow Windows to cache the write: flush it to disk */ - _commit(fd); - - bytes_remaining -= bytes_written; - } - - free(buf); - _lseeki64(fd, prev_pos, SEEK_SET); - return rc; -} - int ftruncate(int fildes, off_t length) { BOOL bSuccess; @@ -547,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 */ @@ -628,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; @@ -748,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)