@@ -385,16 +385,10 @@ threadCleanup ()
385
385
}
386
386
387
387
388
- } // namespace log4cplus
389
-
390
-
391
- #if defined (_WIN32) && defined (LOG4CPLUS_BUILD_DLL)
392
-
393
- extern " C"
394
- BOOL
395
- WINAPI
396
- DllMain (LOG4CPLUS_DLLMAIN_HINSTANCE /* hinstDLL*/ , DWORD fdwReason,
397
- LPVOID /* lpReserved*/ )
388
+ #if defined (_WIN32)
389
+ static
390
+ void NTAPI
391
+ thread_callback (LPVOID /* hinstDLL*/ , DWORD fdwReason, LPVOID /* lpReserved*/ )
398
392
{
399
393
// Perform actions based on the reason for calling.
400
394
switch ( fdwReason )
@@ -438,13 +432,60 @@ DllMain (LOG4CPLUS_DLLMAIN_HINSTANCE /*hinstDLL*/, DWORD fdwReason,
438
432
break ;
439
433
}
440
434
441
- }
435
+ } // switch
436
+ }
437
+
438
+ #endif
439
+
440
+
441
+ } // namespace log4cplus
442
+
443
+
444
+ #if defined (_WIN32) && defined (LOG4CPLUS_BUILD_DLL)
445
+
446
+ extern " C"
447
+ BOOL
448
+ WINAPI
449
+ DllMain (LOG4CPLUS_DLLMAIN_HINSTANCE hinstDLL, DWORD fdwReason,
450
+ LPVOID lpReserved)
451
+ {
452
+ log4cplus::thread_callback (hinstDLL, fdwReason, lpReserved);
442
453
443
454
return TRUE ; // Successful DLL_PROCESS_ATTACH.
444
455
}
445
456
446
457
#else
447
458
459
+ #if defined (_MSC_VER) && _MSC_VER >= 1400
460
+
461
+ extern " C"
462
+ {
463
+
464
+ // This magic has been pieced together from several sources:
465
+ // - <http://www.nynaeve.net/?p=183>
466
+ // - <http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-November/018818.html>
467
+
468
+ #pragma data_seg (push, old_seg)
469
+ #ifdef _WIN64
470
+ #pragma const_seg (".CRT$XLX")
471
+ extern const
472
+ #else
473
+ #pragma data_seg (".CRT$XLX")
474
+ #endif
475
+ PIMAGE_TLS_CALLBACK p_thread_callback = log4cplus::thread_callback;
476
+ #pragma data_seg (pop, old_seg)
477
+ #ifdef _WIN64
478
+ #pragma comment (linker, "/INCLUDE:_tls_used")
479
+ #pragma comment (linker, "/INCLUDE:p_thread_callback")
480
+ #else
481
+ #pragma comment (linker, "/INCLUDE:__tls_used")
482
+ #pragma comment (linker, "/INCLUDE:_p_thread_callback")
483
+ #endif
484
+
485
+ } // extern "C"
486
+
487
+ #else
488
+
448
489
namespace {
449
490
450
491
struct _static_log4cplus_initializer
@@ -462,5 +503,6 @@ namespace {
462
503
} static initializer;
463
504
}
464
505
506
+ #endif
465
507
466
508
#endif
0 commit comments