commit 08e759751da0c8d901da0dbbf7278c02ed6fcda2
parent 90f0538814464a5b981e75f1fe1fd9cd37d066fd
Author: vaplv <vaplv@free.fr>
Date: Sun, 26 Jan 2014 00:31:29 +0100
Make the library compile on MinGW
Diffstat:
5 files changed, 116 insertions(+), 39 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -12,10 +12,15 @@ find_package(OpenMP)
################################################################################
# Setup compile flags/parameters
################################################################################
-set(C_FLAGS "-pedantic -std=c89 -fvisibility=hidden -fstrict-aliasing -fPIC")
+
+set(C_FLAGS "-pedantic -std=c89 -fvisibility=hidden -fstrict-aliasing")
set(C_FLAGS_WARN "-Wall -Wextra -Wcast-align -Wmissing-declarations -Wmissing-prototypes -Wconversion")
set(C_FLAGS_LINK "-Wl,--no-undefined")
-set(CMAKE_C_FLAGS "${C_FLAGS} ${C_FLAGS_WARN} ${C_FLAGS_LINK}")
+if(CMAKE_HOST_UNIX)
+ set(C_FLAGS_UNIX "-fPIC")
+endif(CMAKE_HOST_UNIX)
+
+set(CMAKE_C_FLAGS "${C_FLAGS} ${C_FLAGS_UNIX} ${C_FLAGS_WARN} ${C_FLAGS_LINK}")
set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG")
set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
@@ -58,12 +63,16 @@ set(RSYS_FILES_INC_INSTALL ${RSYS_FILES_INC_COMMON} rsys_version.h)
set(RSYS_FILES_INC_EDIT ${RSYS_FILES_INC_COMMON} rsys_version.h.in)
add_library(rsys SHARED ${RSYS_FILES_SRC} ${RSYS_FILES_INC})
-target_link_libraries(rsys dl ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(rsys ${CMAKE_THREAD_LIBS_INIT})
set_target_properties(rsys PROPERTIES
DEFINE_SYMBOL RSYS_SHARED_BUILD
VERSION ${RSYS_VERSION}
SOVERSION ${VERSION_MAJOR})
+if(CMAKE_HOST_UNIX)
+ target_link_libraries(rsys dl)
+endif(CMAKE_HOST_UNIX)
+
source_group(src FILES ${RSYS_FILES_SRC} ${RSYS_FILES_INC_EDIT})
################################################################################
@@ -101,6 +110,9 @@ endif()
################################################################################
# Define output & install directories
################################################################################
-install(TARGETS rsys LIBRARY DESTINATION lib)
+install(TARGETS rsys
+ ARCHIVE DESTINATION bin
+ LIBRARY DESTINATION lib
+ RUNTIME DESTINATION bin)
install(FILES ${RSYS_FILES_INC} DESTINATION include/rsys)
diff --git a/src/clock_time.c b/src/clock_time.c
@@ -5,12 +5,12 @@
#include <string.h>
#define TIME_TO_NSEC(Time) ((Time)->nsec + (Time)->sec * 1000000000L)
-#define NSEC_PER_USEC 1000L
-#define NSEC_PER_MSEC (1000L * NSEC_PER_USEC)
-#define NSEC_PER_SEC (1000L * NSEC_PER_MSEC)
-#define NSEC_PER_MIN (60L * NSEC_PER_SEC)
-#define NSEC_PER_HOUR (60L * NSEC_PER_MIN)
-#define NSEC_PER_DAY (24L * NSEC_PER_HOUR)
+#define NSEC_PER_USEC (int64_t)1000
+#define NSEC_PER_MSEC ((int64_t)1000 * NSEC_PER_USEC)
+#define NSEC_PER_SEC ((int64_t)1000 * NSEC_PER_MSEC)
+#define NSEC_PER_MIN ((int64_t)60 * NSEC_PER_SEC)
+#define NSEC_PER_HOUR ((int64_t)60 * NSEC_PER_MIN)
+#define NSEC_PER_DAY ((int64_t)24 * NSEC_PER_HOUR)
void
time_current(struct time* t)
@@ -147,7 +147,7 @@ time_dump
{ \
const int len = snprintf \
(dump, available_dump_space, \
- "%li %s", Time, Time > 1 ? Suffix "s ": Suffix " "); \
+ "%li %s", (long)Time, Time > 1 ? Suffix "s ": Suffix " "); \
ASSERT(len >= 0); \
if(real_dump_len) { \
real_dump_len += len; \
diff --git a/src/library.c b/src/library.c
@@ -1,4 +1,40 @@
#include "library.h"
+
+#if defined(OS_WINDOWS)
+#include <Windows.h>
+void*
+library_open(const char* filename)
+{
+ if(!filename)
+ return NULL;
+ return (void*)LoadLibraryA(filename);
+}
+
+int
+library_close(void* lib)
+{
+ BOOL b;
+
+ if(!lib)
+ return -1;
+
+ b = FreeLibrary((HMODULE)lib);
+ if(!b)
+ return -1;
+
+ return 0;
+}
+
+void*
+library_get_symbol(void* lib, const char* sym)
+{
+ union { FARPROC proc; void* ptr; } ucast;
+ STATIC_ASSERT(sizeof(FARPROC) == sizeof(void*), Unexpected_type_size);
+ ucast.proc = GetProcAddress((HMODULE)lib, sym);
+ return ucast.ptr;
+}
+
+#elif defined(OS_UNIX)
#include <dlfcn.h>
#include <stdio.h>
@@ -50,4 +86,5 @@ library_close(void* handle)
return 0;
}
+#endif /* OS_<XXX> */
diff --git a/src/mem_allocator.c b/src/mem_allocator.c
@@ -9,6 +9,16 @@
#define IS_POWER_OF_2(i) ((i) > 0 && ((i) & ((i)-1)) == 0)
+#ifdef OS_WINDOWS
+# ifdef MINGW
+ /* On MINGW the _aligned_msize function is not defined. THe size is thus
+ * stored into the memory block header */
+# define MEM_HEADER_SIZE (2 * sizeof(size_t))
+# else
+# define MEM_HEADER_SIZE (1 * sizeof(size_t))
+# endif
+#endif
+
struct alloc_counter {
atomic64_T nb_allocs;
atomic64_T allocated_size;
@@ -24,13 +34,17 @@ mem_alloc(const size_t size)
{
void* mem = NULL;
if(size) {
-#if defined(COMPILER_GCC)
+#if defined(OS_UNIX)
mem = malloc(size);
-#elif defined(COMPILER_MSVC)
+#elif defined(OS_WINDOWS)
const size_t DEFAULT_ALIGNMENT = 16;
mem = _aligned_offset_malloc
- (size + sizeof(size_t), DEFAULT_ALIGNMENT, sizeof(size_t));
- mem = ((char*)mem) + sizeof(size_t);
+ (size + MEM_HEADER_SIZE, DEFAULT_ALIGNMENT, MEM_HEADER_SIZE);
+# ifdef MINGW
+ ((size_t*)mem)[0] = DEFAULT_ALIGNMENT;
+ ((size_t*)mem)[1] = size + MEM_HEADER_SIZE;
+# endif
+ mem = ((char*)mem) + MEM_HEADER_SIZE;
#endif
}
if(mem) {
@@ -69,12 +83,15 @@ mem_realloc(void* mem, const size_t size)
&& g_alloc_counter.allocated_size >= (int64_t)old_size);
ATOMIC_SUB( &g_alloc_counter.allocated_size, old_size);
-#if defined(COMPILER_MSVC)
- mem = ((char*)mem) - sizeof(size_t);
+#if defined(OS_WINDOWS)
+ mem = ((char*)mem) - MEM_HEADER_SIZE;
new_mem = _aligned_offset_realloc
- (mem, size + sizeof(size_t), ((size_t*)mem)[0], sizeof(size_t));
- new_mem = ((char*)new_mem) + sizeof(size_t);
-#else
+ (mem, size + MEM_HEADER_SIZE, ((size_t*)mem)[0], MEM_HEADER_SIZE);
+# ifdef MINGW
+ ((size_t*)new_mem)[1] = size + MEM_HEADER_SIZE;
+# endif
+ new_mem = ((char*)new_mem) + MEM_HEADER_SIZE;
+#elif defined(OS_UNIX)
new_mem = realloc( mem, size );
#endif
ATOMIC_ADD(&g_alloc_counter.allocated_size, mem_size(new_mem));
@@ -90,12 +107,15 @@ mem_alloc_aligned(const size_t size, const size_t alignment)
if(size
&& IS_POWER_OF_2( alignment )
&& alignment <= 32768 /* 32 KB */) {
-#if defined(COMPILER_MSVC)
+#if defined(OS_WINDOWS)
mem = _aligned_offset_malloc
- (size + sizeof(size_t), alignment, sizeof(size_t));
+ (size + MEM_HEADER_SIZE, alignment, MEM_HEADER_SIZE);
((size_t*)mem)[0] = alignment;
- mem = ((char*)mem) + sizeof( size_t );
-#else
+# ifdef MINGW
+ ((size_t*)mem)[1] = size + MEM_HEADER_SIZE;
+# endif
+ mem = ((char*)mem) + MEM_HEADER_SIZE;
+#elif defined(OS_UNIX)
const int result = posix_memalign
(&mem, (alignment < sizeof(void*)) ? sizeof(void*) : alignment, size);
(void)result; /* avoid warning in Release */
@@ -121,10 +141,10 @@ mem_free(void* mem)
&& g_alloc_counter.allocated_size >= (int64_t)mem_size(mem));
ATOMIC_SUB(&g_alloc_counter.allocated_size, mem_size(mem));
ATOMIC_DECR(&g_alloc_counter.nb_allocs);
-#if defined(COMPILER_MSVC)
- mem = ((char*)mem) - sizeof(size_t);
+#if defined(OS_WINDOWS)
+ mem = ((char*)mem) - MEM_HEADER_SIZE;
_aligned_free( mem );
-#else
+#elif defined(OS_UNIX)
free( mem );
#endif
}
@@ -135,10 +155,14 @@ mem_size(void* mem)
{
size_t mem_size = 0;
if(mem) {
-#if defined(COMPILER_MSVC)
- void* raw_mem = ((char*)mem) - sizeof(size_t);
+#if defined(OS_WINDOWS)
+ void* raw_mem = ((char*)mem) - MEM_HEADER_SIZE;
+# ifdef MINGW
+ mem_size = ((size_t*)raw_mem)[1];
+# else
mem_size = _aligned_msize(raw_mem, ((size_t*)raw_mem)[0], sizeof(size_t));
-#else
+# endif
+#elif defined(OS_UNIX)
mem_size = malloc_usable_size(mem);
#endif
}
@@ -336,8 +360,8 @@ default_dump
(dump,
max_dump_len,
"%lu bytes allocated in %lu allocations.",
- counter->allocated_size,
- counter->nb_allocs);
+ (unsigned long)counter->allocated_size,
+ (unsigned long)counter->nb_allocs);
ASSERT(len >= 0);
dump_len = (size_t)len;
@@ -528,7 +552,7 @@ proxy_allocated_size(const void* data)
ASSERT(data);
proxy_data = data;
for(node = proxy_data->node_list; node != NULL; node = node->next) {
- allocated_size += malloc_usable_size(node);
+ allocated_size += mem_size(node);
}
return allocated_size;
}
@@ -554,7 +578,7 @@ proxy_dump
avaible_dump_space,
"%s: %lu bytes allocated at %s:%u%s",
proxy_data->name,
- (long unsigned)malloc_usable_size(node),
+ (long unsigned)mem_size(node),
node->filename ? node->filename : "none",
node->fileline,
node->next ? ".\n" : ".");
diff --git a/src/rsys.h b/src/rsys.h
@@ -1,10 +1,6 @@
#ifndef RSYS_H
#define RSYS_H
-#define RSYS_VERSION_MAJOR 0
-#define RSYS_VERSION_MINOR 0
-#define RSYS_VERSION_PATCH 0
-
#ifndef __GNUC__
#error "Unsupported compiler"
#endif
@@ -25,6 +21,10 @@
#error "Unsupported OS"
#endif
+#if defined(__MINGW32__)
+ #define MINGW
+#endif
+
/*******************************************************************************
* Compiler
******************************************************************************/
@@ -53,7 +53,11 @@
#define SHARED_LIBRARY_PREFIX "lib"
#define SHARED_LIBRARY_SUFFIX ".so"
#elif defined(OS_WINDOWS)
- #define SHARED_LIBRARY_PREFIX
+ #if defined(MINGW)
+ #define SHARED_LIBRARY_PREFIX "lib"
+ #else
+ #define SHARED_LIBRARY_PREFIX
+ #endif
#define SHARED_LIBRARY_SUFFIX ".dll"
#endif