* malloc_wrapper.cc: Change 'use_internal_malloc' to 'use_internal' throughout.

(export_malloc_called): Delete.
(internal_malloc_determined): New variable.
(malloc_init): Control calculation of internal/external malloc based on
'internal_malloc_determined'.  Use import_address() to determine if malloc in
user_data is ours or not.
* miscfuncs.cc (thread_wrapper): Make static.
(__import_address): Define new function.
* miscfuncs.h (import_address): New define.
(__import_address): Declare new function.
This commit is contained in:
Christopher Faylor 2013-01-20 22:59:58 +00:00
parent 1471537a8f
commit 4713b1b294
4 changed files with 51 additions and 32 deletions

View File

@ -1,3 +1,17 @@
2013-01-20 Christopher Faylor <me.cygwin2013@cgf.cx>
* malloc_wrapper.cc: Change 'use_internal_malloc' to 'use_internal'
throughout.
(export_malloc_called): Delete.
(internal_malloc_determined): New variable.
(malloc_init): Control calculation of internal/external malloc based on
'internal_malloc_determined'. Use import_address() to determine if
malloc in user_data is ours or not.
* miscfuncs.cc (thread_wrapper): Make static.
(__import_address): Define new function.
* miscfuncs.h (import_address): New define.
(__import_address): Declare new function.
2013-01-20 Christopher Faylor <me.cygwin2013@cgf.cx> 2013-01-20 Christopher Faylor <me.cygwin2013@cgf.cx>
* sigproc.cc (sig_dispatch_pending): Add correct regparm attributes to * sigproc.cc (sig_dispatch_pending): Add correct regparm attributes to

View File

@ -1,10 +1,7 @@
/* malloc_wrapper.cc /* malloc_wrapper.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007 Red Hat, Inc. 2006, 2007, 2013 Red Hat, Inc.
Originally written by Steve Chamberlain of Cygnus Support
sac@cygnus.com
This file is part of Cygwin. This file is part of Cygwin.
@ -19,6 +16,7 @@ details. */
#include "fhandler.h" #include "fhandler.h"
#include "dtable.h" #include "dtable.h"
#include "perprocess.h" #include "perprocess.h"
#include "miscfuncs.h"
#include "cygmalloc.h" #include "cygmalloc.h"
#ifndef MALLOC_DEBUG #ifndef MALLOC_DEBUG
#include <malloc.h> #include <malloc.h>
@ -31,8 +29,8 @@ extern "C" struct mallinfo dlmallinfo ();
problems if malloced on our heap and free'd on theirs. problems if malloced on our heap and free'd on theirs.
*/ */
static int export_malloc_called; static bool use_internal = true;
static int use_internal_malloc = 1; static bool internal_malloc_determined;
/* These routines are used by the application if it /* These routines are used by the application if it
doesn't provide its own malloc. */ doesn't provide its own malloc. */
@ -41,7 +39,7 @@ extern "C" void
free (void *p) free (void *p)
{ {
malloc_printf ("(%p), called by %p", p, __builtin_return_address (0)); malloc_printf ("(%p), called by %p", p, __builtin_return_address (0));
if (!use_internal_malloc) if (!use_internal)
user_data->free (p); user_data->free (p);
else else
{ {
@ -55,8 +53,7 @@ extern "C" void *
malloc (size_t size) malloc (size_t size)
{ {
void *res; void *res;
export_malloc_called = 1; if (!use_internal)
if (!use_internal_malloc)
res = user_data->malloc (size); res = user_data->malloc (size);
else else
{ {
@ -72,7 +69,7 @@ extern "C" void *
realloc (void *p, size_t size) realloc (void *p, size_t size)
{ {
void *res; void *res;
if (!use_internal_malloc) if (!use_internal)
res = user_data->realloc (p, size); res = user_data->realloc (p, size);
else else
{ {
@ -99,7 +96,7 @@ extern "C" void *
calloc (size_t nmemb, size_t size) calloc (size_t nmemb, size_t size)
{ {
void *res; void *res;
if (!use_internal_malloc) if (!use_internal)
res = user_data->calloc (nmemb, size); res = user_data->calloc (nmemb, size);
else else
{ {
@ -117,7 +114,7 @@ posix_memalign (void **memptr, size_t alignment, size_t bytes)
save_errno save; save_errno save;
void *res; void *res;
if (!use_internal_malloc) if (!use_internal)
return ENOSYS; return ENOSYS;
if ((alignment & (alignment - 1)) != 0) if ((alignment & (alignment - 1)) != 0)
return EINVAL; return EINVAL;
@ -135,7 +132,7 @@ extern "C" void *
memalign (size_t alignment, size_t bytes) memalign (size_t alignment, size_t bytes)
{ {
void *res; void *res;
if (!use_internal_malloc) if (!use_internal)
{ {
set_errno (ENOSYS); set_errno (ENOSYS);
res = NULL; res = NULL;
@ -154,7 +151,7 @@ extern "C" void *
valloc (size_t bytes) valloc (size_t bytes)
{ {
void *res; void *res;
if (!use_internal_malloc) if (!use_internal)
{ {
set_errno (ENOSYS); set_errno (ENOSYS);
res = NULL; res = NULL;
@ -173,7 +170,7 @@ extern "C" size_t
malloc_usable_size (void *p) malloc_usable_size (void *p)
{ {
size_t res; size_t res;
if (!use_internal_malloc) if (!use_internal)
{ {
set_errno (ENOSYS); set_errno (ENOSYS);
res = 0; res = 0;
@ -192,7 +189,7 @@ extern "C" int
malloc_trim (size_t pad) malloc_trim (size_t pad)
{ {
size_t res; size_t res;
if (!use_internal_malloc) if (!use_internal)
{ {
set_errno (ENOSYS); set_errno (ENOSYS);
res = 0; res = 0;
@ -211,7 +208,7 @@ extern "C" int
mallopt (int p, int v) mallopt (int p, int v)
{ {
int res; int res;
if (!use_internal_malloc) if (!use_internal)
{ {
set_errno (ENOSYS); set_errno (ENOSYS);
res = 0; res = 0;
@ -229,7 +226,7 @@ mallopt (int p, int v)
extern "C" void extern "C" void
malloc_stats () malloc_stats ()
{ {
if (!use_internal_malloc) if (!use_internal)
set_errno (ENOSYS); set_errno (ENOSYS);
else else
{ {
@ -243,7 +240,7 @@ extern "C" struct mallinfo
mallinfo () mallinfo ()
{ {
struct mallinfo m; struct mallinfo m;
if (!use_internal_malloc) if (!use_internal)
set_errno (ENOSYS); set_errno (ENOSYS);
else else
{ {
@ -284,16 +281,12 @@ malloc_init ()
calls to malloc/free/realloc to application provided. This may calls to malloc/free/realloc to application provided. This may
happen if some other dll calls cygwin's malloc, but main code provides happen if some other dll calls cygwin's malloc, but main code provides
its own malloc */ its own malloc */
if (!in_forkee) if (!internal_malloc_determined)
{ {
user_data->free (user_data->malloc (16)); extern void *_sigfe_malloc;
if (export_malloc_called) use_internal = import_address (user_data->malloc) == &_sigfe_malloc;
malloc_printf ("using internal malloc"); malloc_printf ("using %s malloc", use_internal ? "internal" : "external");
else internal_malloc_determined = true;
{
use_internal_malloc = 0;
malloc_printf ("using external malloc");
}
} }
#endif #endif
} }

View File

@ -1,7 +1,7 @@
/* miscfuncs.cc: misc funcs that don't belong anywhere else /* miscfuncs.cc: misc funcs that don't belong anywhere else
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -433,6 +433,15 @@ slashify (const char *src, char *dst, bool trailing_slash_p)
*dst++ = 0; *dst++ = 0;
} }
/* Return an address from the import jmp table of main program. */
void * __attribute__ ((regparm (1)))
__import_address (void *imp)
{
const char *ptr = (const char *) imp;
const uintptr_t *jmpto = (uintptr_t *) *((uintptr_t *) (ptr + 2));
return (void *) *jmpto;
}
/* CygwinCreateThread. /* CygwinCreateThread.
Replacement function for CreateThread. What we do here is to remove Replacement function for CreateThread. What we do here is to remove
@ -448,7 +457,7 @@ struct thread_wrapper_arg
PBYTE stacklimit; PBYTE stacklimit;
}; };
DWORD WINAPI static DWORD WINAPI
thread_wrapper (VOID *arg) thread_wrapper (VOID *arg)
{ {
/* Just plain paranoia. */ /* Just plain paranoia. */

View File

@ -1,7 +1,7 @@
/* miscfuncs.h: main Cygwin header file. /* miscfuncs.h: main Cygwin header file.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
This file is part of Cygwin. This file is part of Cygwin.
@ -26,6 +26,9 @@ BOOL WINAPI WritePipeOverlapped (HANDLE h, LPCVOID buf, DWORD len,
extern "C" void yield (); extern "C" void yield ();
#define import_address(x) __import_address ((void *)(x))
void * __stdcall __attribute__ ((regparm (1))) __import_address (void *);
void backslashify (const char *, char *, bool); void backslashify (const char *, char *, bool);
void slashify (const char *, char *, bool); void slashify (const char *, char *, bool);
#define isslash(c) ((c) == '/') #define isslash(c) ((c) == '/')