* dcrt0.cc (__cygwin_user_data): Initialize.
(dll_crt0_1): Eliminate user_data initialization. (dll_crt0): Set up impure_ptr_ptr for older executables. (cygwin_dll_init): Eliminate user_data initializations. (__api_fatal): Don't check for user_data initialization. * dll_init.cc (struct dll): Store entire contents of per_process rather than just a pointer. (add): Ditto. (initOneDll): Don't check for user_data initialization. (DllList::recordDll): Store contents of per_process argument. (DllList::detachDll): Pass address of per_process field. (DllList::initAll): Ditto. (DllList::doGlobalDestructorsOfDlls): Ditto. (DllListIterator::operator *): Ditto. (dll_dllcrt0): Default to __cygwin_user_data if arg is NULL. * include/sys/cygwin.h: Reorganize per_process to eliminate obsolete fields and accomodate new way of initializing. * lib/_cygwin_crt0_common: Initialize _impure_ptr from __cygwin_user_data.impure_ptr.
This commit is contained in:
parent
4e734b208b
commit
737a86d32f
|
@ -1,3 +1,25 @@
|
||||||
|
Wed Jul 5 18:56:58 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* dcrt0.cc (__cygwin_user_data): Initialize.
|
||||||
|
(dll_crt0_1): Eliminate user_data initialization.
|
||||||
|
(dll_crt0): Set up impure_ptr_ptr for older executables.
|
||||||
|
(cygwin_dll_init): Eliminate user_data initializations.
|
||||||
|
(__api_fatal): Don't check for user_data initialization.
|
||||||
|
* dll_init.cc (struct dll): Store entire contents of per_process rather
|
||||||
|
than just a pointer.
|
||||||
|
(add): Ditto.
|
||||||
|
(initOneDll): Don't check for user_data initialization.
|
||||||
|
(DllList::recordDll): Store contents of per_process argument.
|
||||||
|
(DllList::detachDll): Pass address of per_process field.
|
||||||
|
(DllList::initAll): Ditto.
|
||||||
|
(DllList::doGlobalDestructorsOfDlls): Ditto.
|
||||||
|
(DllListIterator::operator *): Ditto.
|
||||||
|
(dll_dllcrt0): Default to __cygwin_user_data if arg is NULL.
|
||||||
|
* include/sys/cygwin.h: Reorganize per_process to eliminate obsolete
|
||||||
|
fields and accomodate new way of initializing.
|
||||||
|
* lib/_cygwin_crt0_common: Initialize _impure_ptr from
|
||||||
|
__cygwin_user_data.impure_ptr.
|
||||||
|
|
||||||
2000-07-04 Vadim Egorov <egorovv@mailandnews.com>
|
2000-07-04 Vadim Egorov <egorovv@mailandnews.com>
|
||||||
|
|
||||||
* exceptions.cc (try_to_debug): Prevent recursive spawning of JIT
|
* exceptions.cc (try_to_debug): Prevent recursive spawning of JIT
|
||||||
|
|
|
@ -49,15 +49,46 @@ HANDLE NO_COPY parent_alive = NULL;
|
||||||
measure to allow an orderly transfer to the new, correct sigmask method. */
|
measure to allow an orderly transfer to the new, correct sigmask method. */
|
||||||
unsigned int signal_shift_subtract = 1;
|
unsigned int signal_shift_subtract = 1;
|
||||||
|
|
||||||
|
#ifdef _MT_SAFE
|
||||||
|
ResourceLocks _reslock NO_COPY;
|
||||||
|
MTinterface _mtinterf NO_COPY;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
|
void *export_malloc (unsigned int);
|
||||||
|
void export_free (void *);
|
||||||
|
void *export_realloc (void *, unsigned int);
|
||||||
|
void *export_calloc (unsigned int, unsigned int);
|
||||||
|
|
||||||
/* This is an exported copy of environ which can be used by DLLs
|
/* This is an exported copy of environ which can be used by DLLs
|
||||||
which use cygwin.dll. */
|
which use cygwin.dll. */
|
||||||
char **__cygwin_environ;
|
char **__cygwin_environ;
|
||||||
/* __progname used in getopt error message */
|
/* __progname used in getopt error message */
|
||||||
char *__progname = NULL;
|
char *__progname = NULL;
|
||||||
struct _reent reent_data;
|
struct _reent reent_data;
|
||||||
struct per_process __cygwin_user_data;
|
struct per_process __cygwin_user_data =
|
||||||
|
{/* initial_sp */ 0, /* magic_biscuit */ 0,
|
||||||
|
/* dll_major */ CYGWIN_VERSION_DLL_MAJOR,
|
||||||
|
/* dll_major */ CYGWIN_VERSION_DLL_MINOR,
|
||||||
|
/* impure_ptr_ptr */ NULL, /*envptr */ NULL,
|
||||||
|
/* malloc */ export_malloc, /* free */ export_free,
|
||||||
|
/* realloc */ export_realloc,
|
||||||
|
/* fmode_ptr */ NULL, /* main */ NULL, /* ctors */ NULL,
|
||||||
|
/* dtors */ NULL, /* data_start */ NULL, /* data_end */ NULL,
|
||||||
|
/* bss_start */ NULL, /* bss_end */ NULL,
|
||||||
|
/* calloc */ export_calloc,
|
||||||
|
/* premain */ {NULL, NULL, NULL, NULL},
|
||||||
|
/* run_ctors_p */ 0,
|
||||||
|
/* unused */ { 0, 0, 0},
|
||||||
|
/* heapbase */ NULL, /* heapptr */ NULL, /* heaptop */ NULL,
|
||||||
|
/* unused1 */ 0, /* forkee */ 0, /* hmodule */ NULL,
|
||||||
|
/* api_major */ CYGWIN_VERSION_API_MAJOR,
|
||||||
|
/* api_minor */ CYGWIN_VERSION_API_MINOR,
|
||||||
|
/* unused2 */ {0, 0, 0, 0, 0},
|
||||||
|
/* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf,
|
||||||
|
/* impure_ptr */ &reent_data,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
char *old_title = NULL;
|
char *old_title = NULL;
|
||||||
|
@ -550,11 +581,6 @@ static NO_COPY int mypid = 0;
|
||||||
static int argc = 0;
|
static int argc = 0;
|
||||||
static char **argv = NULL;
|
static char **argv = NULL;
|
||||||
|
|
||||||
#ifdef _MT_SAFE
|
|
||||||
ResourceLocks _reslock NO_COPY;
|
|
||||||
MTinterface _mtinterf NO_COPY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
sigthread::init (const char *s)
|
sigthread::init (const char *s)
|
||||||
{
|
{
|
||||||
|
@ -599,14 +625,10 @@ dll_crt0_1 ()
|
||||||
fork copy code doesn't copy the data in libccrt0.cc (that's why we
|
fork copy code doesn't copy the data in libccrt0.cc (that's why we
|
||||||
pass in the per_process struct into the .dll from libccrt0). */
|
pass in the per_process struct into the .dll from libccrt0). */
|
||||||
|
|
||||||
*(user_data->impure_ptr_ptr) = &reent_data;
|
|
||||||
_impure_ptr = &reent_data;
|
_impure_ptr = &reent_data;
|
||||||
|
|
||||||
#ifdef _MT_SAFE
|
#ifdef _MT_SAFE
|
||||||
user_data->resourcelocks = &_reslock;
|
|
||||||
user_data->resourcelocks->Init();
|
user_data->resourcelocks->Init();
|
||||||
|
|
||||||
user_data->threadinterface = &_mtinterf;
|
|
||||||
user_data->threadinterface->Init0();
|
user_data->threadinterface->Init0();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -755,7 +777,7 @@ dll_crt0_1 ()
|
||||||
sig_send (NULL, __SIGFLUSH); /* also initializes uid, gid */
|
sig_send (NULL, __SIGFLUSH); /* also initializes uid, gid */
|
||||||
|
|
||||||
/* Execute any specified "premain" functions */
|
/* Execute any specified "premain" functions */
|
||||||
if (user_data->premain[0])
|
if (user_data->premain[PREMAIN_LEN / 2])
|
||||||
for (unsigned int i = PREMAIN_LEN / 2; i < PREMAIN_LEN; i++)
|
for (unsigned int i = PREMAIN_LEN / 2; i < PREMAIN_LEN; i++)
|
||||||
user_data->premain[i] (argc, argv);
|
user_data->premain[i] (argc, argv);
|
||||||
|
|
||||||
|
@ -853,21 +875,17 @@ dll_crt0 (per_process *uptr)
|
||||||
{
|
{
|
||||||
/* Set the local copy of the pointer into the user space. */
|
/* Set the local copy of the pointer into the user space. */
|
||||||
if (uptr)
|
if (uptr)
|
||||||
*user_data = *uptr;
|
{
|
||||||
|
memcpy (user_data, uptr, per_process_overwrite);
|
||||||
|
*(user_data->impure_ptr_ptr) = &reent_data;
|
||||||
|
}
|
||||||
_dll_crt0 ();
|
_dll_crt0 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void *export_malloc (unsigned int);
|
|
||||||
extern "C" void export_free (void *);
|
|
||||||
extern "C" void *export_realloc (void *, unsigned int);
|
|
||||||
extern "C" void *export_calloc (unsigned int, unsigned int);
|
|
||||||
|
|
||||||
/* This must be called by anyone who uses LoadLibrary to load cygwin1.dll */
|
/* This must be called by anyone who uses LoadLibrary to load cygwin1.dll */
|
||||||
extern "C" void cygwin_dll_init ();
|
extern "C" void
|
||||||
void
|
|
||||||
cygwin_dll_init ()
|
cygwin_dll_init ()
|
||||||
{
|
{
|
||||||
static struct _reent *temp_impure;
|
|
||||||
static char **envp;
|
static char **envp;
|
||||||
static int _fmode;
|
static int _fmode;
|
||||||
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
|
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
|
||||||
|
@ -879,21 +897,11 @@ cygwin_dll_init ()
|
||||||
|
|
||||||
DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc,
|
DuplicateHandle (hMainProc, GetCurrentThread (), hMainProc,
|
||||||
&hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
|
&hMainThread, 0, FALSE, DUPLICATE_SAME_ACCESS);
|
||||||
user_data->dll_major = CYGWIN_VERSION_DLL_MAJOR;
|
|
||||||
user_data->dll_minor = CYGWIN_VERSION_DLL_MINOR;
|
|
||||||
user_data->api_major = CYGWIN_VERSION_API_MAJOR;
|
|
||||||
user_data->api_minor = CYGWIN_VERSION_API_MINOR;
|
|
||||||
user_data->magic_biscuit = sizeof (per_process);
|
user_data->magic_biscuit = sizeof (per_process);
|
||||||
|
|
||||||
user_data->impure_ptr_ptr = &temp_impure;
|
|
||||||
user_data->envptr = &envp;
|
user_data->envptr = &envp;
|
||||||
user_data->fmode_ptr = &_fmode;
|
user_data->fmode_ptr = &_fmode;
|
||||||
|
|
||||||
user_data->malloc = &export_malloc;
|
|
||||||
user_data->free = &export_free;
|
|
||||||
user_data->realloc = &export_realloc;
|
|
||||||
user_data->calloc = &export_calloc;
|
|
||||||
|
|
||||||
dll_crt0_1 ();
|
dll_crt0_1 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1030,11 +1038,8 @@ __api_fatal (const char *fmt, ...)
|
||||||
|
|
||||||
/* We are going down without mercy. Make sure we reset
|
/* We are going down without mercy. Make sure we reset
|
||||||
our process_state. */
|
our process_state. */
|
||||||
if (user_data != NULL)
|
sigproc_terminate ();
|
||||||
{
|
myself->record_death (FALSE);
|
||||||
sigproc_terminate ();
|
|
||||||
myself->record_death (FALSE);
|
|
||||||
}
|
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
(void) try_to_debug ();
|
(void) try_to_debug ();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -29,7 +29,7 @@ typedef enum { NONE, LINK, LOAD } dllType;
|
||||||
|
|
||||||
struct dll
|
struct dll
|
||||||
{
|
{
|
||||||
per_process *p;
|
per_process p;
|
||||||
HMODULE handle;
|
HMODULE handle;
|
||||||
const char *name;
|
const char *name;
|
||||||
dllType type;
|
dllType type;
|
||||||
|
@ -128,7 +128,7 @@ add (HMODULE h, char *name, per_process *p, dllType type)
|
||||||
|
|
||||||
_list[_last].name = name && type == LOAD ? strdup (name) : NULL;
|
_list[_last].name = name && type == LOAD ? strdup (name) : NULL;
|
||||||
_list[_last].handle = h;
|
_list[_last].handle = h;
|
||||||
_list[_last].p = p;
|
_list[_last].p = *p;
|
||||||
_list[_last].type = type;
|
_list[_last].type = type;
|
||||||
|
|
||||||
ret = _last++;
|
ret = _last++;
|
||||||
|
@ -139,14 +139,6 @@ static int
|
||||||
initOneDll (per_process *p)
|
initOneDll (per_process *p)
|
||||||
{
|
{
|
||||||
/* global variable user_data must be initialized */
|
/* global variable user_data must be initialized */
|
||||||
if (user_data == NULL)
|
|
||||||
{
|
|
||||||
small_printf ("WARNING: process not inited while trying to init a DLL!\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* init impure_ptr */
|
|
||||||
*(p->impure_ptr_ptr) = *(user_data->impure_ptr_ptr);
|
|
||||||
|
|
||||||
/* FIXME: init environment (useful?) */
|
/* FIXME: init environment (useful?) */
|
||||||
*(p->envptr) = *(user_data->envptr);
|
*(p->envptr) = *(user_data->envptr);
|
||||||
|
@ -220,7 +212,7 @@ DllList::recordDll (HMODULE h, per_process *p)
|
||||||
if (_dlopenIndex != -1)
|
if (_dlopenIndex != -1)
|
||||||
{
|
{
|
||||||
_list[_dlopenIndex].handle = h;
|
_list[_dlopenIndex].handle = h;
|
||||||
_list[_dlopenIndex].p = p;
|
_list[_dlopenIndex].p = *p;
|
||||||
_list[_dlopenIndex].type = type;
|
_list[_dlopenIndex].type = type;
|
||||||
ret = _dlopenIndex;
|
ret = _dlopenIndex;
|
||||||
_dlopenIndex = -1;
|
_dlopenIndex = -1;
|
||||||
|
@ -248,7 +240,7 @@ DllList::detachDll (int dll_index)
|
||||||
if (dll_index != -1)
|
if (dll_index != -1)
|
||||||
{
|
{
|
||||||
dll *aDll = &(_list[dll_index]);
|
dll *aDll = &(_list[dll_index]);
|
||||||
doGlobalDTORS (aDll->p);
|
doGlobalDTORS (&aDll->p);
|
||||||
if (aDll->type == LOAD)
|
if (aDll->type == LOAD)
|
||||||
_numberOfOpenedDlls--;
|
_numberOfOpenedDlls--;
|
||||||
aDll->type = NONE;
|
aDll->type = NONE;
|
||||||
|
@ -274,7 +266,7 @@ DllList::initAll ()
|
||||||
debug_printf ("call to DllList::initAll");
|
debug_printf ("call to DllList::initAll");
|
||||||
for (int i = 0; i < _last; i++)
|
for (int i = 0; i < _last; i++)
|
||||||
{
|
{
|
||||||
per_process *p = _list[i].p;
|
per_process *p = &_list[i].p;
|
||||||
if (p)
|
if (p)
|
||||||
initOneDll (p);
|
initOneDll (p);
|
||||||
}
|
}
|
||||||
|
@ -290,7 +282,7 @@ DllList::doGlobalDestructorsOfDlls ()
|
||||||
{
|
{
|
||||||
if (_list[i].type != NONE)
|
if (_list[i].type != NONE)
|
||||||
{
|
{
|
||||||
per_process *p = _list[i].p;
|
per_process *p = &_list[i].p;
|
||||||
if (p)
|
if (p)
|
||||||
doGlobalDTORS (p);
|
doGlobalDTORS (p);
|
||||||
}
|
}
|
||||||
|
@ -418,7 +410,7 @@ DllListIterator::~DllListIterator ()
|
||||||
|
|
||||||
DllListIterator::operator per_process* ()
|
DllListIterator::operator per_process* ()
|
||||||
{
|
{
|
||||||
return _list[index ()].p;
|
return &_list[index ()].p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -462,11 +454,15 @@ extern "C"
|
||||||
int
|
int
|
||||||
dll_dllcrt0 (HMODULE h, per_process *p)
|
dll_dllcrt0 (HMODULE h, per_process *p)
|
||||||
{
|
{
|
||||||
|
struct _reent reent_data;
|
||||||
|
if (p == NULL)
|
||||||
|
p = &__cygwin_user_data;
|
||||||
|
else
|
||||||
|
*(p->impure_ptr_ptr) = &reent_data;
|
||||||
|
|
||||||
/* Partially initialize Cygwin guts for non-cygwin apps. */
|
/* Partially initialize Cygwin guts for non-cygwin apps. */
|
||||||
if (dynamically_loaded && (! user_data || user_data->magic_biscuit == 0))
|
if (dynamically_loaded && user_data->magic_biscuit == 0)
|
||||||
{
|
dll_crt0 (p);
|
||||||
dll_crt0 (p);
|
|
||||||
}
|
|
||||||
return _the.recordDll (h, p);
|
return _the.recordDll (h, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,9 +53,8 @@ extern void cygwin_premain3 (int argc, char **argv);
|
||||||
SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment.
|
SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class per_process
|
struct per_process
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
char *initial_sp;
|
char *initial_sp;
|
||||||
|
|
||||||
/* The offset of these 3 values can never change. */
|
/* The offset of these 3 values can never change. */
|
||||||
|
@ -96,19 +95,14 @@ class per_process
|
||||||
/* non-zero of ctors have been run. Inherited from parent. */
|
/* non-zero of ctors have been run. Inherited from parent. */
|
||||||
int run_ctors_p;
|
int run_ctors_p;
|
||||||
|
|
||||||
/* These will be non-zero if the above (malloc,free,realloc) have been
|
DWORD unused[3];
|
||||||
overridden. */
|
|
||||||
/* FIXME: not currently used */
|
|
||||||
int __imp_malloc;
|
|
||||||
int __imp_free;
|
|
||||||
int __imp_realloc;
|
|
||||||
|
|
||||||
/* Heap management. Inherited from parent. */
|
/* Heap management. Inherited from parent. */
|
||||||
void *heapbase; /* bottom of the heap */
|
void *heapbase; /* bottom of the heap */
|
||||||
void *heapptr; /* current index into heap */
|
void *heapptr; /* current index into heap */
|
||||||
void *heaptop; /* current top of heap */
|
void *heaptop; /* current top of heap */
|
||||||
|
|
||||||
HANDLE unused1; /* unused */
|
DWORD unused1; /* unused */
|
||||||
|
|
||||||
/* Non-zero means the task was forked. The value is the pid.
|
/* Non-zero means the task was forked. The value is the pid.
|
||||||
Inherited from parent. */
|
Inherited from parent. */
|
||||||
|
@ -120,14 +114,13 @@ class per_process
|
||||||
DWORD api_minor; /* linked with */
|
DWORD api_minor; /* linked with */
|
||||||
/* For future expansion, so apps won't have to be relinked if we
|
/* For future expansion, so apps won't have to be relinked if we
|
||||||
add an item. */
|
add an item. */
|
||||||
#ifdef _MT_SAFE
|
DWORD unused2[5];
|
||||||
|
|
||||||
ResourceLocks *resourcelocks;
|
ResourceLocks *resourcelocks;
|
||||||
MTinterface *threadinterface;
|
MTinterface *threadinterface;
|
||||||
void *internal_reserved[6];
|
struct _reent *impure_ptr;
|
||||||
#else
|
|
||||||
void *internal_reserved[8];
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
#define per_process_overwrite ((unsigned) &(((struct per_process *) NULL)->resourcelocks))
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#ifdef _PATH_PASSWD
|
#ifdef _PATH_PASSWD
|
||||||
|
|
|
@ -48,7 +48,7 @@ _cygwin_crt0_common (MainFunc f)
|
||||||
__cygwin_user_data.ctors = &__CTOR_LIST__;
|
__cygwin_user_data.ctors = &__CTOR_LIST__;
|
||||||
__cygwin_user_data.dtors = &__DTOR_LIST__;
|
__cygwin_user_data.dtors = &__DTOR_LIST__;
|
||||||
__cygwin_user_data.envptr = &environ;
|
__cygwin_user_data.envptr = &environ;
|
||||||
__cygwin_user_data.impure_ptr_ptr = &_impure_ptr;
|
_impure_ptr = __cygwin_user_data.impure_ptr;
|
||||||
__cygwin_user_data.main = f;
|
__cygwin_user_data.main = f;
|
||||||
__cygwin_user_data.premain[0] = cygwin_premain0;
|
__cygwin_user_data.premain[0] = cygwin_premain0;
|
||||||
__cygwin_user_data.premain[1] = cygwin_premain1;
|
__cygwin_user_data.premain[1] = cygwin_premain1;
|
||||||
|
|
|
@ -76,11 +76,6 @@ sigprocmask (int sig, const sigset_t *set, sigset_t *oldset)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* gcc can call sigprocmask when a builtin contructor is activated.
|
|
||||||
This can happen prior to the setup of myself */
|
|
||||||
if (!user_data)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (oldset)
|
if (oldset)
|
||||||
*oldset = myself->getsigmask ();
|
*oldset = myself->getsigmask ();
|
||||||
if (set)
|
if (set)
|
||||||
|
@ -109,21 +104,6 @@ sigprocmask (int sig, const sigset_t *set, sigset_t *oldset)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* This is called _raise because the real raise is in newlib. */
|
|
||||||
int
|
|
||||||
_raise (int sig)
|
|
||||||
{
|
|
||||||
if (!user_data)
|
|
||||||
{
|
|
||||||
set_errno (ESRCH);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _kill (myself->pid, sig);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
kill_worker (pid_t pid, int sig)
|
kill_worker (pid_t pid, int sig)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue