* cxx.cc (default_cygwin_cxx_malloc): Enhance commenting.
* dll_init.cc (dll_dllcrt0_1): Likewise. * dlfcn.cc (dlopen): Prevent dlopen()'d DLL from installing any cxx malloc overrides. * include/cygwin/cygwin_dll.h (__dynamically_loaded): New variable. * lib/_cygwin_crt0_common.cc (_cygwin_crt0_common): Check it and only install cxx malloc overrides when statically loaded. Extend comments.
This commit is contained in:
@ -40,6 +40,9 @@ extern WEAK void operator delete[](void *p, const std::nothrow_t &nt) throw()
|
||||
/* Avoid an info message from linker when linking applications. */
|
||||
extern __declspec(dllimport) struct _reent *_impure_ptr;
|
||||
|
||||
/* Initialised in _cygwin_dll_entry. */
|
||||
extern int __dynamically_loaded;
|
||||
|
||||
#undef environ
|
||||
|
||||
extern "C"
|
||||
@ -70,11 +73,13 @@ _cygwin_crt0_common (MainFunc f, per_process *u)
|
||||
per_process *newu = (per_process *) cygwin_internal (CW_USER_DATA);
|
||||
int uwasnull;
|
||||
|
||||
/* u is non-NULL if we are in a DLL, and NULL in the main exe.
|
||||
newu is the Cygwin DLL's internal per_process and never NULL. */
|
||||
if (u != NULL)
|
||||
uwasnull = 0; /* Caller allocated space for per_process structure. */
|
||||
else
|
||||
{
|
||||
u = newu; /* Using DLL built-in per_process. */
|
||||
u = newu; /* Using DLL built-in per_process. */
|
||||
uwasnull = 1; /* Remember for later. */
|
||||
}
|
||||
|
||||
@ -114,8 +119,10 @@ _cygwin_crt0_common (MainFunc f, per_process *u)
|
||||
u->realloc = &realloc;
|
||||
u->calloc = &calloc;
|
||||
|
||||
/* Likewise for the C++ memory operators - if any. */
|
||||
if (newu && newu->cxx_malloc)
|
||||
/* Likewise for the C++ memory operators, if any, but not if we
|
||||
were dlopen()'d, as we might get dlclose()'d and that would
|
||||
leave stale function pointers behind. */
|
||||
if (newu && newu->cxx_malloc && !__dynamically_loaded)
|
||||
{
|
||||
/* Inherit what we don't override. */
|
||||
#define CONDITIONALLY_OVERRIDE(MEMBER) \
|
||||
@ -129,12 +136,10 @@ _cygwin_crt0_common (MainFunc f, per_process *u)
|
||||
CONDITIONALLY_OVERRIDE(oper_new___nt);
|
||||
CONDITIONALLY_OVERRIDE(oper_delete_nt);
|
||||
CONDITIONALLY_OVERRIDE(oper_delete___nt);
|
||||
/* Now update the resulting set into the global redirectors. */
|
||||
*newu->cxx_malloc = __cygwin_cxx_malloc;
|
||||
}
|
||||
|
||||
/* Now update the resulting set into the global redirectors. */
|
||||
if (newu)
|
||||
newu->cxx_malloc = &__cygwin_cxx_malloc;
|
||||
|
||||
/* Setup the module handle so fork can get the path name. */
|
||||
u->hmodule = GetModuleHandle (0);
|
||||
|
||||
|
Reference in New Issue
Block a user