* 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:
parent
a2dea5c333
commit
052990e6b3
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ()
|
||||||
|
|
Loading…
Reference in New Issue