1+ /*
2+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3+ * All rights reserved.
4+ *
5+ * This source code is licensed under the BSD-style license found in the
6+ * LICENSE file in the root directory of this source tree.
7+ */
8+
9+ /* *
10+ * @file
11+ * unistd.h related macros for POSIX/Windows compatibility.
12+ */
13+ #pragma once
14+
15+ #if defined(_WIN32) && !defined(_WIN64)
16+ #error \
17+ " You're trying to build ExecuTorch with a too old version of Windows. We need Windows 64-bit."
18+ #endif
19+
20+ #if !defined(_WIN64)
21+ #include < unistd.h>
22+ #else
23+ #include < io.h>
24+ #define O_RDONLY _O_RDONLY
25+ #define open _open
26+ #define close _close
27+ #define read _read
28+ #define write _write
29+ #define stat _stat64
30+ #define fstat _fstat64
31+ #define off_t _off_t
32+ #define lseek _lseeki64
33+
34+ #include < executorch/runtime/platform/compiler.h> // For ssize_t.
35+ #include < windows.h>
36+ // To avoid conflicts with std::numeric_limits<int32_t>::max() in
37+ // file_data_loader.cpp.
38+ #undef max
39+
40+ inline ssize_t pread (int fd, void * buf, size_t nbytes, size_t offset) {
41+ OVERLAPPED overlapped; /* The offset for ReadFile. */
42+ memset (&overlapped, 0 , sizeof (overlapped));
43+ overlapped.Offset = offset;
44+ overlapped.OffsetHigh = offset >> 32 ;
45+
46+ BOOL result; /* The result of ReadFile. */
47+ DWORD bytes_read; /* The number of bytes read. */
48+ HANDLE file = (HANDLE)_get_osfhandle (fd);
49+
50+ result = ReadFile (file, buf, nbytes, &bytes_read, &overlapped);
51+ DWORD error = GetLastError ();
52+ if (!result) {
53+ if (error == ERROR_IO_PENDING) {
54+ result = GetOverlappedResult (file, &overlapped, &bytes_read, TRUE );
55+ if (!result) {
56+ error = GetLastError ();
57+ }
58+ }
59+ }
60+ if (!result) {
61+ // Translate error into errno.
62+ switch (error) {
63+ case ERROR_HANDLE_EOF:
64+ errno = 0 ;
65+ break ;
66+ default :
67+ errno = EIO;
68+ break ;
69+ }
70+ return -1 ;
71+ }
72+ return bytes_read;
73+ }
74+
75+ #endif // !defined(_WIN64)
0 commit comments