Skip to content

Commit ae5c42c

Browse files
committed
Enable OS memory provider on Windows
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent faf6e7e commit ae5c42c

File tree

5 files changed

+99
-13
lines changed

5 files changed

+99
-13
lines changed

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,13 @@ install(
111111
TARGETS umf_headers
112112
EXPORT ${PROJECT_NAME}-targets)
113113

114+
if(UMF_BUILD_OS_MEMORY_PROVIDER AND (LINUX OR WINDOWS))
115+
# Do not use pkgconfig, because it sets wrong paths on Windows
116+
find_package(LIBHWLOC REQUIRED hwloc)
117+
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
118+
message(STATUS " LIBHWLOC_INCLUDE_DIRS = ${LIBHWLOC_INCLUDE_DIRS}")
119+
endif()
120+
114121
add_subdirectory(src)
115122

116123
if(UMF_BUILD_TESTS)

cmake/FindLIBHWLOC.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ message(STATUS "Checking for module 'libhwloc' using find_library()")
77
find_library(LIBHWLOC_LIBRARY NAMES libhwloc hwloc)
88
set(LIBHWLOC_LIBRARIES ${LIBHWLOC_LIBRARY})
99

10+
find_file(LIBHWLOC_HEADER NAMES hwloc.h HINTS /usr/include/ ${CMAKE_PREFIX_PATH}/include)
11+
get_filename_component(LIBHWLOC_INCLUDE_DIR ${LIBHWLOC_HEADER} DIRECTORY)
12+
set(LIBHWLOC_INCLUDE_DIRS ${LIBHWLOC_INCLUDE_DIR})
13+
1014
if(LIBHWLOC_LIBRARY)
1115
message(STATUS " Found libhwloc using find_library()")
1216
else()

src/CMakeLists.txt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ set(UMF_SOURCES_MACOSX
5353
)
5454

5555
# Compile definitions for UMF library
56-
# TODO: Cleanup the compile definitions across all the Cmake files
57-
set(UMF_COMPILE_DEFINITIONS "")
56+
# TODO: Cleanup the compile definitions across all the CMake files
57+
set(UMF_PUBLIC_COMPILE_DEFINITIONS "")
5858

5959
if(UMF_BUILD_OS_MEMORY_PROVIDER)
6060
set(UMF_SOURCES_LINUX ${UMF_SOURCES_LINUX}
@@ -64,16 +64,14 @@ if(UMF_BUILD_OS_MEMORY_PROVIDER)
6464
memspaces/memspace_numa.c
6565
memspaces/memspace_host_all.c)
6666

67-
if(LINUX)
68-
if(PkgConfig_FOUND)
69-
pkg_check_modules(LIBHWLOC hwloc)
70-
endif()
71-
if(NOT LIBHWLOC_FOUND)
72-
find_package(LIBHWLOC REQUIRED hwloc)
73-
endif()
67+
set(UMF_SOURCES_WINDOWS ${UMF_SOURCES_WINDOWS}
68+
provider/provider_os_memory.c
69+
provider/provider_os_memory_windows.c)
70+
71+
if(LINUX OR WINDOWS)
7472
set(UMF_LIBS ${UMF_LIBS} ${LIBHWLOC_LIBRARIES})
75-
# Currently, OS provider is only built for Linux
76-
set(UMF_COMPILE_DEFINITIONS ${UMF_COMPILE_DEFINITIONS} "UMF_BUILD_OS_MEMORY_PROVIDER=1")
73+
# Currently, OS provider is only built for Linux and Windows
74+
set(UMF_PUBLIC_COMPILE_DEFINITIONS ${UMF_PUBLIC_COMPILE_DEFINITIONS} "UMF_BUILD_OS_MEMORY_PROVIDER=1")
7775
endif()
7876
endif()
7977

@@ -92,7 +90,7 @@ if(UMF_BUILD_SHARED_LIBRARY)
9290
LIBS ${UMF_LIBS}
9391
LINUX_MAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.map
9492
WINDOWS_DEF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.def)
95-
set(UMF_COMPILE_DEFINITIONS ${UMF_COMPILE_DEFINITIONS} "UMF_SHARED_LIBRARY")
93+
set(UMF_PUBLIC_COMPILE_DEFINITIONS ${UMF_PUBLIC_COMPILE_DEFINITIONS} "UMF_SHARED_LIBRARY")
9694
set_target_properties(umf PROPERTIES
9795
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_UMF_OUTPUT_DIRECTORY})
9896
else()
@@ -102,7 +100,15 @@ else()
102100
LIBS ${UMF_LIBS})
103101
endif()
104102

105-
target_compile_definitions(umf PUBLIC ${UMF_COMPILE_DEFINITIONS})
103+
target_compile_definitions(umf PUBLIC ${UMF_PUBLIC_COMPILE_DEFINITIONS})
104+
105+
if(UMF_BUILD_OS_MEMORY_PROVIDER AND WINDOWS)
106+
# Disable the warning:
107+
# hwloc-win64-build-2.10.0\include\hwloc/helper.h(1266):
108+
# warning C4996: 'sscanf': This function or variable may be unsafe.
109+
# Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
110+
target_compile_definitions(umf PRIVATE _CRT_SECURE_NO_WARNINGS)
111+
endif()
106112

107113
if (UMF_ENABLE_POOL_TRACKING)
108114
target_sources(umf PRIVATE memory_pool_tracking.c)
@@ -112,6 +118,10 @@ endif()
112118

113119
add_library(${PROJECT_NAME}::umf ALIAS umf)
114120

121+
if(LIBHWLOC_INCLUDE_DIRS)
122+
target_include_directories(umf PRIVATE ${LIBHWLOC_INCLUDE_DIRS})
123+
endif()
124+
115125
target_include_directories(umf PUBLIC
116126
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
117127
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>

src/libumf.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ EXPORTS
3939
umfPoolMallocUsableSize
4040
umfPoolRealloc
4141
umfProxyPoolOps
42+
umfOsMemoryProviderOps
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright (C) 2023 Intel Corporation
3+
*
4+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
5+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
*/
7+
8+
#include <Windows.h>
9+
10+
#include <assert.h>
11+
#include <stdio.h>
12+
13+
#include <umf/providers/provider_os_memory.h>
14+
15+
int os_translate_mem_protection_flags(unsigned protection) {
16+
switch (protection) {
17+
case UMF_PROTECTION_NONE:
18+
return PAGE_NOACCESS;
19+
case UMF_PROTECTION_EXEC:
20+
return PAGE_EXECUTE;
21+
case (UMF_PROTECTION_EXEC | UMF_PROTECTION_READ):
22+
return PAGE_EXECUTE_READ;
23+
case (UMF_PROTECTION_EXEC | UMF_PROTECTION_READ | UMF_PROTECTION_WRITE):
24+
return PAGE_EXECUTE_READWRITE;
25+
case (UMF_PROTECTION_EXEC | UMF_PROTECTION_WRITE):
26+
return PAGE_EXECUTE_WRITECOPY;
27+
case UMF_PROTECTION_READ:
28+
return PAGE_READONLY;
29+
case (UMF_PROTECTION_READ | UMF_PROTECTION_WRITE):
30+
return PAGE_READWRITE;
31+
case UMF_PROTECTION_WRITE:
32+
return PAGE_WRITECOPY;
33+
}
34+
fprintf(stderr,
35+
"os_translate_mem_protection_flags(): unsupported protection flag: "
36+
"%u\n",
37+
protection);
38+
assert(0);
39+
return -1;
40+
}
41+
42+
void *os_mmap(void *hint_addr, size_t length, int prot) {
43+
return VirtualAlloc(hint_addr, length, MEM_RESERVE | MEM_COMMIT, prot);
44+
}
45+
46+
int os_munmap(void *addr, size_t length) {
47+
// If VirtualFree() succeeds, the return value is nonzero.
48+
// If VirtualFree() fails, the return value is 0 (zero).
49+
(void)length; // unused
50+
return (VirtualFree(addr, 0, MEM_RELEASE) == 0);
51+
}
52+
53+
int os_purge(void *addr, size_t length, int advice) {
54+
fprintf(stderr, "os_purge() NOT IMPLEMENTED\n");
55+
// assert(0);
56+
return -1;
57+
}
58+
59+
size_t os_get_page_size(void) { return 4096; } // TODO fix this
60+
61+
void os_strerror(int errnum, char *buf, size_t buflen) {
62+
fprintf(stderr, "os_strerror() NOT IMPLEMENTED\n");
63+
// assert(0);
64+
}

0 commit comments

Comments
 (0)