Skip to content

Commit

Permalink
Apply Mark Pizzolato's full static linking changes; ignore .project
Browse files Browse the repository at this point in the history
file.

This removes the PIMAGE_TLS_CALLBACK method, which does not work for us.
errno just will not work when there are multiple CRT libs in use (static
pthreads lib and application dll). I.e. we are insisting on either full
DLL or full static linking exclusively.

Conflicts:
	_ptw32.h
	dll.c
	need_errno.h
	pthread.h
	pthread_detach.c
	tests/Makefile
  • Loading branch information
rocso committed Aug 6, 2018
1 parent c9c3e9b commit 2ccd905
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 132 deletions.
19 changes: 2 additions & 17 deletions _ptw32.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,23 +66,8 @@
# define __PTW32_END_C_DECLS
#endif

#if defined (__PTW32_STATIC_LIB) && _MSC_VER >= 1400
# undef __PTW32_STATIC_LIB
# define __PTW32_STATIC_TLSLIB
#endif

/* When building the library, you should define __PTW32_BUILD so that
* the variables/functions are exported correctly. When using the library,
* do NOT define __PTW32_BUILD, and then the variables/functions will
* be imported correctly.
*
* FIXME: Used defined feature test macros, such as __PTW32_STATIC_LIB, (and
* maybe even __PTW32_BUILD), should be renamed with one initial underscore;
* internally defined macros, such as __PTW32_DLLPORT, should be renamed with
* two initial underscores ... perhaps __PTW32_DECLSPEC is nicer anyway?
*/
#if defined __PTW32_STATIC_LIB || defined __PTW32_STATIC_TLSLIB
# define __PTW32_DLLPORT
#if defined __PTW32_STATIC_LIB
# define __PTW32_DLLPORT

#elif defined __PTW32_BUILD
# define __PTW32_DLLPORT __declspec (dllexport)
Expand Down
50 changes: 3 additions & 47 deletions dll.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@
# include <config.h>
#endif

#if defined (__PTW32_STATIC_LIB) && defined(_MSC_VER) && _MSC_VER >= 1400
# undef __PTW32_STATIC_LIB
# define __PTW32_STATIC_TLSLIB
#endif

#include "pthread.h"
#include "implement.h"

Expand All @@ -60,12 +55,7 @@
*/
extern "C"
#endif /* __cplusplus */
BOOL WINAPI
#if defined (__PTW32_STATIC_TLSLIB)
__PTW32_StaticLibMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
#else
DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
#endif
BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
BOOL result = __PTW32_TRUE;

Expand Down Expand Up @@ -109,34 +99,7 @@ DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
typedef int foo;
#endif

/* Visual Studio 8+ can leverage PIMAGE_TLS_CALLBACK CRT segments, which
* give a static lib its very own DllMain.
*/
#ifdef __PTW32_STATIC_TLSLIB

static void WINAPI
TlsMain(PVOID h, DWORD r, PVOID u)
{
(void)__PTW32_StaticLibMain((HINSTANCE)h, r, u);
}

#ifdef _M_X64
# pragma comment (linker, "/INCLUDE:_tls_used")
# pragma comment (linker, "/INCLUDE:_xl_b")
# pragma const_seg(".CRT$XLB")
EXTERN_C const PIMAGE_TLS_CALLBACK _xl_b = TlsMain;
# pragma const_seg()
#else
# pragma comment (linker, "/INCLUDE:__tls_used")
# pragma comment (linker, "/INCLUDE:__xl_b")
# pragma data_seg(".CRT$XLB")
EXTERN_C PIMAGE_TLS_CALLBACK _xl_b = TlsMain;
# pragma data_seg()
#endif /* _M_X64 */

#endif /* __PTW32_STATIC_TLSLIB */

#if defined (__PTW32_STATIC_LIB)
#if defined(__PTW32_STATIC_LIB)

/*
* Note: MSVC 8 and higher use code in dll.c, which enables TLS cleanup
Expand All @@ -163,13 +126,6 @@ EXTERN_C PIMAGE_TLS_CALLBACK _xl_b = TlsMain;

static int on_process_init(void)
{
#if defined(_MSC_VER) && !defined(_DLL)
extern int __cdecl _heap_init (void);
extern int __cdecl _mtinit (void);

_heap_init();
_mtinit();
#endif
pthread_win32_process_attach_np ();
return 0;
}
Expand All @@ -185,7 +141,7 @@ static int on_process_exit(void)
__attribute__((section(".ctors"), used)) static int (*gcc_ctor)(void) = on_process_init;
__attribute__((section(".dtors"), used)) static int (*gcc_dtor)(void) = on_process_exit;
#elif defined(_MSC_VER)
# if _MSC_VER >= 1400 /* MSVC8 */
# if _MSC_VER >= 1400 /* MSVC8+ */
# pragma section(".CRT$XCU", long, read)
# pragma section(".CRT$XPU", long, read)
__declspec(allocate(".CRT$XCU")) static int (*msc_ctor)(void) = on_process_init;
Expand Down
5 changes: 2 additions & 3 deletions need_errno.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,8 @@ extern "C" {
#endif
#endif

#if defined (__PTW32_STATIC_LIB) && defined(_MSC_VER) && _MSC_VER >= 1400
# undef __PTW32_STATIC_LIB
# define __PTW32_STATIC_TLSLIB
#if defined(__PTW32_STATIC_LIB) && defined(_MSC_VER) && _MSC_VER >= 1400
# define __PTW32_STATIC_TLSLIB
#endif

#if defined (__PTW32_STATIC_LIB) || defined (__PTW32_STATIC_TLSLIB)
Expand Down
4 changes: 2 additions & 2 deletions pthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -1161,8 +1161,8 @@ __PTW32_DLLPORT int __PTW32_CDECL pthreadCancelableTimedWait (void *waitHandle,
*
* Note: "_DLL" implies the /MD compiler flag.
*/
#if defined(_MSC_VER) && !defined(_DLL) && !defined (__PTW32_STATIC_LIB) && !defined(__PTW32_STATIC_TLSLIB)
# define __PTW32_USES_SEPARATE_CRT
#if defined(_MSC_VER) && !defined(_DLL) && !defined(__PTW32_STATIC_LIB)
# define __PTW32_USES_SEPARATE_CRT
#endif

#if defined (__PTW32_USES_SEPARATE_CRT) && (defined(__PTW32_CLEANUP_CXX) || defined(__PTW32_CLEANUP_SEH))
Expand Down
8 changes: 6 additions & 2 deletions pthread_detach.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,14 @@ pthread_detach (pthread_t thread)
*/
result = 0;

__ptw32_mcs_lock_acquire (&tp->stateLock, &stateLock);
if (tp->state != PThreadStateLast)
ptw32_mcs_lock_acquire (&tp->stateLock, &stateLock);
if (tp->state < PThreadStateLast)
{
tp->detachState = PTHREAD_CREATE_DETACHED;
if (tp->state == PThreadStateExiting)
{
destroyIt = PTW32_TRUE;
}
}
else if (tp->detachState != PTHREAD_CREATE_DETACHED)
{
Expand Down
82 changes: 21 additions & 61 deletions tests/Makefile
Original file line number Diff line number Diff line change
@@ -1,33 +1,5 @@
# Makefile for the pthreads test suite.
# If all of the .pass files can be created, the test suite has passed.
#
# --------------------------------------------------------------------------
#
# Pthreads-win32 - POSIX Threads Library for Win32
# Copyright(C) 1998 John E. Bossom
# Copyright(C) 1999,2012 Pthreads-win32 contributors
#
# The current list of contributors is contained
# in the file CONTRIBUTORS included with the source
# code distribution. The list can also be seen at the
# following World Wide Web location:
# https://sourceforge.net/projects/pthreads4w/contributors.html
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library in the file COPYING.LIB;
# if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#

PTW32_VER = 2$(EXTRAVERSION)

Expand Down Expand Up @@ -75,15 +47,15 @@ VCXFLAGS = /EHs /TP /D__PTW32_CLEANUP_C
CPLIB = $(VCLIB)
CPDLL = $(VCDLL)

CFLAGS = $(OPTIM) /W3 /MD /Z7
CFLAGS_DEBUG = $(OPTIM) /W3 /MDd /Z7
CFLAGS_STATIC = $(OPTIM) /W3 /MT /Z7
CFLAGS_STATIC_DEBUG = $(OPTIM) /W3 /MTd /Z7
CFLAGS = $(OPTIM) /W3 /Z7
CFLAGS_DEBUG = $(OPTIM) /W3 /Z7
LFLAGS = /INCREMENTAL:NO
INCLUDES = -I.
BUILD_DIR = ..

EHFLAGS =
EHFLAGS_STATIC = /MT /D__PTW32_STATIC_LIB -I.. /DHAVE_CONFIG_H /D__PTW32_BUILD_INLINED ..\pthread.c
EHFLAGS_STATIC_DEBUG = /MTd /D__PTW32_STATIC_LIB -I.. /DHAVE_CONFIG_H /D__PTW32_BUILD_INLINED ..\pthread.c

# If a test case returns a non-zero exit code to the shell, make will
# stop.
Expand Down Expand Up @@ -160,64 +132,52 @@ VCX-bench:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCXFLAGS)" $(BENCHTESTS)

VC-static VC-small-static:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCFLAGS) $(EHFLAGS_STATIC)" allpassed

VCE-static VCE-small-static:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCELIB)" CPDLL="" EHFLAGS="$(VCEFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VCELIB)" CPDLL="" EHFLAGS="$(VCEFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCEFLAGS) $(EHFLAGS_STATIC)" allpassed

VSE-static VSE-small-static:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VSELIB)" CPDLL="" EHFLAGS="$(VSEFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VSELIB)" CPDLL="" EHFLAGS="$(VSEFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VSEFLAGS) $(EHFLAGS_STATIC)" allpassed

VCX-static VCX-small-static:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCXFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCXFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCXFLAGS) $(EHFLAGS_STATIC)" allpassed

VC-static-bench:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCFLAGS) /D__PTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCFLAGS) /DPTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCFLAGS) $(EHFLAGS_STATIC)" $(BENCHTESTS)

VCE-static-bench:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCELIB)" CPDLL="" EHFLAGS="$(VCEFLAGS) /D__PTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VCELIB)" CPDLL="" EHFLAGS="$(VCEFLAGS) /DPTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCEFLAGS) $(EHFLAGS_STATIC)" $(BENCHTESTS)

VSE-static-bench:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VSELIB)" CPDLL="" EHFLAGS="$(VSEFLAGS) /D__PTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VSELIB)" CPDLL="" EHFLAGS="$(VSEFLAGS) /DPTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VSEFLAGS) $(EHFLAGS_STATIC)" $(BENCHTESTS)

VCX-static-bench:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCXFLAGS) /D__PTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC)" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCXFLAGS) /DPTW32_STATIC_LIB" $(BENCHTESTS)
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCXFLAGS) $(EHFLAGS_STATIC)" $(BENCHTESTS)

VC-debug:
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_DEBUG)" CPLIB="$(VCLIBD)" CPDLL="$(VCDLLD)" EHFLAGS="$(VCFLAGS)" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIBD)" CPDLL="$(VCDLLD)" EHFLAGS="$(VCFLAGS)" allpassed

VC-static-debug VC-small-static-debug:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIBD)" CPDLL="" EHFLAGS="$(VCFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC_DEBUG)" CPLIB="$(VCLIBD)" CPDLL="" EHFLAGS="$(VCFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIBD)" CPDLL="" EHFLAGS="$(VCFLAGS) $(EHFLAGS_STATIC_DEBUG)" allpassed

VCE-debug:
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_DEBUG)" CPLIB="$(VCELIBD)" CPDLL="$(VCEDLLD)" EHFLAGS="$(VCEFLAGS)" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCELIBD)" CPDLL="$(VCEDLLD)" EHFLAGS="$(VCEFLAGS)" allpassed

VCE-static-debug VCE-small-static-debug:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCELIBD)" CPDLL="" EHFLAGS="$(VCEFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC_DEBUG)" CPLIB="$(VCELIBD)" CPDLL="" EHFLAGS="$(VCEFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCELIBD)" CPDLL="" EHFLAGS="$(VCEFLAGS) $(EHFLAGS_STATIC_DEBUG)" allpassed

VSE-debug:
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_DEBUG)" CPLIB="$(VSELIBD)" CPDLL="$(VSEDLLD)" EHFLAGS="$(VSEFLAGS)" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VSELIBD)" CPDLL="$(VSEDLLD)" EHFLAGS="$(VSEFLAGS)" allpassed

VSE-static-debug VSE-small-static-debug:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VSELIBD)" CPDLL="" EHFLAGS="$(VSEFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC_DEBUG)" CPLIB="$(VSELIBD)" CPDLL="" EHFLAGS="$(VSEFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VSEFLAGS) $(EHFLAGS_STATIC_DEBUG)" allpassed

VCX-debug:
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_DEBUG)" CPLIB="$(VCLIBD)" CPDLL="$(VCDLLD)" EHFLAGS="$(VCXFLAGS)" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIBD)" CPDLL="$(VCDLLD)" EHFLAGS="$(VCXFLAGS)" allpassed

VCX-static-debug VCX-small-static-debug:
@ $(MAKE) /E /nologo TEST="$@" CPLIB="$(VCLIBD)" CPDLL="" EHFLAGS="$(VCXFLAGS) /D__PTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CFLAGS="$(CFLAGS_STATIC_DEBUG)" CPLIB="$(VCLIBD)" CPDLL="" EHFLAGS="$(VCXFLAGS) /DPTW32_STATIC_LIB" allpassed
@ $(MAKE) /E /nologo TEST="$@" CPLIB="" CPDLL="" EHFLAGS="$(VCXFLAGS) $(EHFLAGS_STATIC_DEBUG)" allpassed

clean:
if exist *.dll $(RM) *.dll
Expand All @@ -241,7 +201,7 @@ realclean: clean
if exist *.log $(RM) *.log

.c.pass:
$(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $*.c /Fe$*.exe /link $(LFLAGS) $(CPLIB) $(XXLIBS)
$(CC) $(CFLAGS) $(INCLUDES) $(EHFLAGS) $*.c /Fe$*.exe /link $(LFLAGS) $(CPLIB) $(XXLIBS)
@ $(ECHO) ... Running $(TEST) test: $*.exe
@ .\$*.exe
@ $(ECHO) ...... Passed
Expand Down

0 comments on commit 2ccd905

Please sign in to comment.