* dcrt0.cc (main_environ): Initialize to &__cygwin_environment.

(dll_crt0_1): Move resourcelocks, thread interface, pinfo_init, and
uinfo_init...
(dll_crt0_0): ...to here.
(_dll_crt0): Call update_envptrs here after setting main_environ.
* environ.cc (environ_init): Eliminate initted variable.  Don't call
update_envptrs here.
* sigproc.cc (wait_sig): Use my_sendsig when calling CreatePipe to avoid a
dereference.
This commit is contained in:
Christopher Faylor 2006-03-14 19:07:36 +00:00
parent 3b731dc0e1
commit e5aa298da5
5 changed files with 33 additions and 25 deletions

View File

@ -1,3 +1,15 @@
2006-03-14 Christopher Faylor <cgf@timesys.com>
* dcrt0.cc (main_environ): Initialize to &__cygwin_environment.
(dll_crt0_1): Move resourcelocks, thread interface, pinfo_init, and
uinfo_init...
(dll_crt0_0): ...to here.
(_dll_crt0): Call update_envptrs here after setting main_environ.
* environ.cc (environ_init): Eliminate initted variable. Don't call
update_envptrs here.
* sigproc.cc (wait_sig): Use my_sendsig when calling CreatePipe to
avoid a dereference.
2006-03-13 Christopher Faylor <cgf@timesys.com> 2006-03-13 Christopher Faylor <cgf@timesys.com>
* child_info.h (child_info_fork::handle_failure): Declare new function. * child_info.h (child_info_fork::handle_failure): Declare new function.

View File

@ -36,6 +36,7 @@ details. */
#include "dll_init.h" #include "dll_init.h"
#include "sync.h" #include "sync.h"
#include "heap.h" #include "heap.h"
#include "environ.h"
#define MAX_AT_FILE_LEVEL 10 #define MAX_AT_FILE_LEVEL 10
@ -92,7 +93,7 @@ extern "C"
/* 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;
char ***main_environ; char ***main_environ = &__cygwin_environ;
/* __progname used in getopt error message */ /* __progname used in getopt error message */
char *__progname; char *__progname;
struct per_process __cygwin_user_data = struct per_process __cygwin_user_data =
@ -753,6 +754,14 @@ dll_crt0_0 ()
} }
} }
user_data->resourcelocks->Init ();
user_data->threadinterface->Init ();
if (!in_forkee)
{
pinfo_init (envp, envc);
uinfo_init (); /* initialize user info */
}
_cygtls::init (); _cygtls::init ();
/* Initialize events */ /* Initialize events */
@ -784,8 +793,6 @@ dll_crt0_1 (char *)
small_printf ("cmalloc returns %p\n", cmalloc (HEAP_STR, n)); small_printf ("cmalloc returns %p\n", cmalloc (HEAP_STR, n));
#endif #endif
user_data->resourcelocks->Init ();
user_data->threadinterface->Init ();
ProtectHandle (hMainProc); ProtectHandle (hMainProc);
ProtectHandle (hMainThread); ProtectHandle (hMainThread);
@ -834,9 +841,6 @@ dll_crt0_1 (char *)
} }
#endif #endif
/* Initialize our process table entry. */
pinfo_init (envp, envc);
/* Can be set only after environment has been initialized. */ /* Can be set only after environment has been initialized. */
if (wincap.has_security ()) if (wincap.has_security ())
set_cygwin_privileges (hProcImpToken); set_cygwin_privileges (hProcImpToken);
@ -847,9 +851,6 @@ dll_crt0_1 (char *)
/* Allocate cygheap->fdtab */ /* Allocate cygheap->fdtab */
dtable_init (); dtable_init ();
/* Initialize user info. */
uinfo_init ();
/* Connect to tty. */ /* Connect to tty. */
tty_init (); tty_init ();
@ -967,6 +968,7 @@ _dll_crt0 ()
system_printf ("internal error: couldn't determine location of thread function on stack. Expect signal problems."); system_printf ("internal error: couldn't determine location of thread function on stack. Expect signal problems.");
main_environ = user_data->envptr; main_environ = user_data->envptr;
update_envptrs ();
char padding[CYGTLS_PADSIZE]; char padding[CYGTLS_PADSIZE];

View File

@ -424,7 +424,6 @@ dlfork (int val)
void __stdcall void __stdcall
update_envptrs () update_envptrs ()
{ {
extern char ***main_environ;
for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ()) for (dll *d = dlls.istart (DLL_ANY); d; d = dlls.inext ())
*(d->p.envptr) = __cygwin_environ; *(d->p.envptr) = __cygwin_environ;
*main_environ = __cygwin_environ; *main_environ = __cygwin_environ;

View File

@ -729,16 +729,12 @@ environ_init (char **envp, int envc)
if (efault.faulted ()) if (efault.faulted ())
api_fatal ("internal error reading the windows environment - too many environment variables?"); api_fatal ("internal error reading the windows environment - too many environment variables?");
static int initted; if (!conv_start_chars[0])
if (!initted) for (int i = 0; conv_envvars[i].name != NULL; i++)
{ {
for (int i = 0; conv_envvars[i].name != NULL; i++) conv_start_chars[(int) cyg_tolower (conv_envvars[i].name[0])] = 1;
{ conv_start_chars[(int) cyg_toupper (conv_envvars[i].name[0])] = 1;
conv_start_chars[(int) cyg_tolower (conv_envvars[i].name[0])] = 1; }
conv_start_chars[(int) cyg_toupper (conv_envvars[i].name[0])] = 1;
}
initted = 1;
}
got_something_from_registry = regopt ("default"); got_something_from_registry = regopt ("default");
if (myself->progname[0]) if (myself->progname[0])
@ -814,7 +810,6 @@ environ_init (char **envp, int envc)
out: out:
__cygwin_environ = envp; __cygwin_environ = envp;
update_envptrs ();
if (envp_passed_in) if (envp_passed_in)
{ {
p = getenv ("CYGWIN"); p = getenv ("CYGWIN");

View File

@ -523,7 +523,7 @@ sig_send (_pinfo *p, int sig)
else else
{ {
#ifdef DEBUGGING #ifdef DEBUGGING
system_printf ("internal signal sent while signals are on hold"); system_printf ("signal %d sent to %p while signals are on hold", p, sig);
#endif #endif
return -1; return -1;
} }
@ -1073,11 +1073,11 @@ wait_sig (VOID *)
/* Initialization */ /* Initialization */
SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY); SetThreadPriority (GetCurrentThread (), WAIT_SIG_PRIORITY);
if (!CreatePipe (&readsig, &myself->sendsig, sec_user_nih (sa_buf), 0)) sigCONT = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
if (!CreatePipe (&readsig, &my_sendsig, sec_user_nih (sa_buf), 0))
api_fatal ("couldn't create signal pipe, %E"); api_fatal ("couldn't create signal pipe, %E");
ProtectHandle (readsig); ProtectHandle (readsig);
sigCONT = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); myself->sendsig = my_sendsig;
my_sendsig = myself->sendsig;
/* Setting dwProcessId flags that this process is now capable of receiving /* Setting dwProcessId flags that this process is now capable of receiving
signals. Prior to this, dwProcessId was set to the windows pid of signals. Prior to this, dwProcessId was set to the windows pid of