From: cgf Date: Mon, 22 May 2000 00:54:22 +0000 (+0000) Subject: * dcrt0.cc (dll_crt0_1): Move uinfo_init call to before sigproc_init to avoid a X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=541cdc15f129aba28ec7f0afb54b5e79b200c94b;p=pf3gnuchains%2Fpf3gnuchains3x.git * dcrt0.cc (dll_crt0_1): Move uinfo_init call to before sigproc_init to avoid a race. (noload): Add an extra argument for debugging. * uinfo.cc (uinfo_init): Eliminate test for multiple calls. (getlogin): Assume that uinfo_init has already been called. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index f471f5b66f..acf819b8ee 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +Sun May 21 20:51:44 2000 Christopher Faylor + + * dcrt0.cc (dll_crt0_1): Move uinfo_init call to before sigproc_init to + avoid a race. + (noload): Add an extra argument for debugging. + * uinfo.cc (uinfo_init): Eliminate test for multiple calls. + (getlogin): Assume that uinfo_init has already been called. + Sat May 20 01:34:57 2000 Christopher Faylor * exceptions.cc (interruptible): Add an argument to control whether diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index b59f2d1833..d5f15c5930 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -721,6 +721,9 @@ dll_crt0_1 () /* Allocate dtable */ dtable_init (); +/* Initialize uid, gid. */ + uinfo_init (); + /* Initialize signal/subprocess handling. */ sigproc_init (); @@ -730,11 +733,6 @@ dll_crt0_1 () /* Set up standard fds in file descriptor table. */ hinfo_init (); -#if 0 - /* Initialize uid, gid. */ - uinfo_init (); -#endif - /* Scan the command line and build argv. Expand wildcards if not called from another cygwin process. */ build_argv (line, argv, argc, @@ -758,14 +756,11 @@ dll_crt0_1 () set_errno (0); debug_printf ("user_data->main %p", user_data->main); - /* Initialize uid, gid. */ - uinfo_init (); - /* Flush signals and ensure that signal thread is up and running. Can't do this for noncygwin case since the signal thread is blocked due to LoadLibrary serialization. */ if (!dynamically_loaded) - sig_send (NULL, __SIGFLUSH); + sig_send (NULL, __SIGFLUSH); /* also initializes uid, gid */ if (user_data->main && !dynamically_loaded) exit (user_data->main (argc, argv, *user_data->envptr)); @@ -992,13 +987,14 @@ __api_fatal (const char *fmt, ...) } extern "C" { -static void noload (char *s) __asm__ ("noload"); +static void noload (HANDLE h, char *s) __asm__ ("noload"); static void __attribute__((unused)) -noload (char *s) +noload (HANDLE h, char *s) { - api_fatal ("couldn't dynamically determine load address for '%s', %E", s); + api_fatal ("couldn't dynamically determine load address for '%s' (handle %p), %E", s, h); } +/* FIXME: This is not thread-safe! */ __asm__ (" .globl cygwin_dll_func_load cygwin_dll_func_load: @@ -1013,6 +1009,8 @@ cygwin_dll_func_load: popl %eax # No. Get back addl $8,%eax # pointer to name pushl %eax # and + movl -4(%eax),%eax # Address of Handle to DLL + pushl (%eax) # Handle to DLL call noload # issue an error gotit: popl %ecx # Pointer to 'return address' diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc index 3bab25c488..97c754ce66 100644 --- a/winsup/cygwin/uinfo.cc +++ b/winsup/cygwin/uinfo.cc @@ -109,9 +109,6 @@ uinfo_init () { struct passwd *p; - if (myself->username[0]) - return; - myself->psid = (PSID) myself->sidbuf; if ((p = getpwnam (internal_getlogin (myself))) != NULL) { @@ -140,7 +137,6 @@ getlogin (void) static NO_COPY char this_username[MAX_USER_NAME]; #endif - uinfo_init (); return strcpy (this_username, myself->username); }