From fbc3861e52837d30ae56697cbb0bec1dcbbb010e Mon Sep 17 00:00:00 2001 From: Homero Cardoso de Almeida Date: Fri, 29 Jan 2016 14:32:41 -0200 Subject: [PATCH 1/3] Adding windows compilation support --- include/ela/ela.h | 7 ++++++- include/ela/libevent.h | 1 + src/ela.c | 6 +++--- src/ela_libevent.c | 24 +++++++++++++++++++----- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/include/ela/ela.h b/include/ela/ela.h index d2b2f54..cc8902a 100644 --- a/include/ela/ela.h +++ b/include/ela/ela.h @@ -20,12 +20,17 @@ */ #include -#include + +#if !defined(_MSC_VER) +# include +#endif /* GCC visibility */ #if defined(__GNUC__) && __GNUC__ >= 4 /** mkdoc:skip */ /** @internal */ # define ELA_EXPORT __attribute__ ((visibility("default"))) +#elif defined(_MSC_VER) /** mkdoc:skip */ +# define ELA_EXPORT __declspec(dllexport) #else /** @internal */ # define ELA_EXPORT diff --git a/include/ela/libevent.h b/include/ela/libevent.h index 5a64555..832b489 100644 --- a/include/ela/libevent.h +++ b/include/ela/libevent.h @@ -27,6 +27,7 @@ struct event_base; @returns an event loop, or NULL if libevent support is unavailable. */ +ELA_EXPORT struct ela_el *ela_libevent(struct event_base *event); #endif diff --git a/src/ela.c b/src/ela.c index 78073d8..ace8b21 100644 --- a/src/ela.c +++ b/src/ela.c @@ -15,10 +15,10 @@ #include #include -#if 0 -# define DBG(a...) printf(a) +#if 1 +# define DBG(a, ...) printf(a, __VA_ARGS__) #else -# define DBG(a...) do{}while(0) +# define DBG(a, ...) do{}while(0) #endif ela_error_t ela_set_fd( diff --git a/src/ela_libevent.c b/src/ela_libevent.c index d16292e..6a5a239 100644 --- a/src/ela_libevent.c +++ b/src/ela_libevent.c @@ -23,6 +23,22 @@ #include +#ifdef _MSC_VER + +#pragma section(".CRT$XCU", read) +#define INITIALIZER(f) \ + static void __cdecl f(void); \ + __declspec(allocate(".CRT$XCU")) void(__cdecl* f##_)(void) = f; \ + static void __cdecl f(void) + +#elif defined(__GNUC__) + +#define INITIALIZER(f) \ + static void f(void) __attribute__((constructor)); \ + static void f(void) + +#endif + struct libevent_mainloop { struct ela_el base; @@ -79,6 +95,8 @@ ela_error_t _ela_event_set_fd( { struct libevent_mainloop *ctx = (struct libevent_mainloop *)ctx_; ela_error_t err = 0; + uint32_t fd_flags + = (ELA_EVENT_ONCE|ELA_EVENT_READABLE|ELA_EVENT_WRITABLE); (void)ctx; @@ -88,9 +106,6 @@ ela_error_t _ela_event_set_fd( if ( ela_flags & ELA_EVENT_READABLE ) ev_flags |= EV_READ; if ( ela_flags & ELA_EVENT_WRITABLE ) ev_flags |= EV_WRITE; - const uint32_t fd_flags - = (ELA_EVENT_ONCE|ELA_EVENT_READABLE|ELA_EVENT_WRITABLE); - src->flags = (src->flags & ~fd_flags) | (ela_flags & fd_flags); event_set(&src->event, fd, ev_flags, _ela_event_cb, src); @@ -241,8 +256,7 @@ struct ela_el *ela_libevent(struct event_base *event) return &m->base; } -__attribute__((constructor)) -static void _ela_event_register(void) +INITIALIZER(_ela_event_register) { ela_register(&event_backend); } From b4062c4a5666f51ba2ae2ca1298821fed36b635c Mon Sep 17 00:00:00 2001 From: Fernando Silveira Date: Fri, 29 Jan 2016 14:39:35 -0200 Subject: [PATCH 2/3] Unset the debug flag. --- src/ela.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ela.c b/src/ela.c index ace8b21..e59a3d0 100644 --- a/src/ela.c +++ b/src/ela.c @@ -15,7 +15,7 @@ #include #include -#if 1 +#if 0 # define DBG(a, ...) printf(a, __VA_ARGS__) #else # define DBG(a, ...) do{}while(0) From 447d6e55b507d92176ed9577059931da57587c5d Mon Sep 17 00:00:00 2001 From: Fernando Silveira Date: Mon, 22 Feb 2016 10:09:54 -0300 Subject: [PATCH 3/3] Avoid using .CRT$XCU section -- prefer DllMain(). --- src/ela_libevent.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/ela_libevent.c b/src/ela_libevent.c index 6a5a239..2cdb48a 100644 --- a/src/ela_libevent.c +++ b/src/ela_libevent.c @@ -23,20 +23,10 @@ #include -#ifdef _MSC_VER - -#pragma section(".CRT$XCU", read) -#define INITIALIZER(f) \ - static void __cdecl f(void); \ - __declspec(allocate(".CRT$XCU")) void(__cdecl* f##_)(void) = f; \ - static void __cdecl f(void) - -#elif defined(__GNUC__) - +#if defined(__GNUC__) #define INITIALIZER(f) \ static void f(void) __attribute__((constructor)); \ static void f(void) - #endif struct libevent_mainloop @@ -176,14 +166,14 @@ static void _ela_event_run(struct ela_el *ctx_) { struct libevent_mainloop *ctx = (struct libevent_mainloop *)ctx_; - event_base_dispatch(ctx->event); + event_base_dispatch(ctx->event); } static void _ela_event_exit(struct ela_el *ctx_) { struct libevent_mainloop *ctx = (struct libevent_mainloop *)ctx_; - event_base_loopbreak(ctx->event); + event_base_loopbreak(ctx->event); } static @@ -256,7 +246,26 @@ struct ela_el *ela_libevent(struct event_base *event) return &m->base; } +#if defined(_MSC_VER) +BOOLEAN WINAPI +DllMain(IN HINSTANCE hDllHandle, IN DWORD nReason, IN LPVOID Reserved) +{ + switch (nReason) { + case DLL_PROCESS_ATTACH: + //DisableThreadLibraryCalls(hDllHandle); + ela_register(&event_backend); + break; + case DLL_PROCESS_DETACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + + return TRUE; +} +#else INITIALIZER(_ela_event_register) { ela_register(&event_backend); } +#endif