* dll_init.cc (dll_list::detach): Eliminate reliance on passed in dll address.

Infer from module of caller instead.
(cygwin_detach_dll): Ignore dll_index argument.
* dll_init.h (dll_list::detach): Reflect argument change above.
This commit is contained in:
Christopher Faylor 2002-11-14 04:29:39 +00:00
parent a2dea5c333
commit 052990e6b3
3 changed files with 34 additions and 18 deletions

View File

@ -1,3 +1,10 @@
2002-11-13 Christopher Faylor <cgf@redhat.com>
* dll_init.cc (dll_list::detach): Eliminate reliance on passed in dll
address. Infer from module of caller instead.
(cygwin_detach_dll): Ignore dll_index argument.
* dll_init.h (dll_list::detach): Reflect argument change above.
2002-11-13 Christopher Faylor <cgf@redhat.com> 2002-11-13 Christopher Faylor <cgf@redhat.com>
* ioctl.cc (ioctl): Always print ioctl results, even when it's a tty. * ioctl.cc (ioctl): Always print ioctl results, even when it's a tty.

View File

@ -182,25 +182,34 @@ dll_list::alloc (HINSTANCE h, per_process *p, dll_type type)
/* Detach a DLL from the chain. */ /* Detach a DLL from the chain. */
void void
dll_list::detach (dll *d) dll_list::detach (void *retaddr)
{ {
if (!myself || myself->process_state == PID_EXITED) if (!myself || myself->process_state == PID_EXITED)
return; return;
MEMORY_BASIC_INFORMATION m;
if (!VirtualQuery (retaddr, &m, sizeof m))
return;
HMODULE h = (HMODULE) m.AllocationBase;
if (d->count <= 0) dll *d = &start;
system_printf ("WARNING: try to detach an already detached dll ..."); while ((d = d->next))
else if (--d->count == 0) if (d->handle != h)
{ continue;
d->p.run_dtors (); else if (d->count <= 0)
d->prev->next = d->next; system_printf ("WARNING: try to detach an already detached dll ...");
if (d->next) else if (--d->count == 0)
d->next->prev = d->prev; {
if (d->type == DLL_LOAD) d->p.run_dtors ();
loaded_dlls--; d->prev->next = d->next;
if (end == d) if (d->next)
end = d->prev; d->next->prev = d->prev;
VirtualFree (d, 0, MEM_RELEASE); if (d->type == DLL_LOAD)
} loaded_dlls--;
if (end == d)
end = d->prev;
VirtualFree (d, 0, MEM_RELEASE);
break;
}
} }
/* Initialization for all linked DLLs, called by dll_crt0_1. */ /* Initialization for all linked DLLs, called by dll_crt0_1. */
@ -390,9 +399,9 @@ dll_noncygwin_dllcrt0 (HMODULE h, per_process *p)
} }
extern "C" void extern "C" void
cygwin_detach_dll (dll *d) cygwin_detach_dll (dll *)
{ {
dlls.detach (d); dlls.detach (__builtin_return_address (0));
} }
extern "C" void extern "C" void

View File

@ -70,7 +70,7 @@ public:
int reload_on_fork; int reload_on_fork;
dll *operator [] (const char *name); dll *operator [] (const char *name);
dll *alloc (HINSTANCE, per_process *, dll_type); dll *alloc (HINSTANCE, per_process *, dll_type);
void detach (dll *); void detach (void *);
void init (); void init ();
void load_after_fork (HANDLE, dll *); void load_after_fork (HANDLE, dll *);
dll *inext () dll *inext ()