rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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:
Msrc/CMakeLists.txt | 20++++++++++++++++----
Msrc/clock_time.c | 14+++++++-------
Msrc/library.c | 37+++++++++++++++++++++++++++++++++++++
Msrc/mem_allocator.c | 70+++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Msrc/rsys.h | 14+++++++++-----
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