* dll_init.h (has_dtors): New flag.
(run_dtors): New wrapper function which avoids calling dtors more than once. * dll_init.cc (dll_global_dtors): Use dll.run_dtors wrapper. (dll_list::detach): Ditto. (dll_list::alloc): Set has_dtors flag.
This commit is contained in:
		@@ -35,7 +35,7 @@ dll_global_dtors ()
 | 
			
		||||
  dll_global_dtors_recorded = false;
 | 
			
		||||
  if (recorded && dlls.start.next)
 | 
			
		||||
    for (dll *d = dlls.end; d != &dlls.start; d = d->prev)
 | 
			
		||||
      d->p.run_dtors ();
 | 
			
		||||
      d->run_dtors ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Run all constructors associated with a dll */
 | 
			
		||||
@@ -119,6 +119,7 @@ dll_list::alloc (HINSTANCE h, per_process *p, dll_type type)
 | 
			
		||||
      return d;		/* Return previously allocated pointer. */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* FIXME: Change this to new at some point. */
 | 
			
		||||
  d = (dll *) cmalloc (HEAP_2_DLL, sizeof (*d) + (namelen * sizeof (*name)));
 | 
			
		||||
 | 
			
		||||
  /* Now we've allocated a block of information.  Fill it in with the supplied
 | 
			
		||||
@@ -126,6 +127,7 @@ dll_list::alloc (HINSTANCE h, per_process *p, dll_type type)
 | 
			
		||||
  d->count = 1;
 | 
			
		||||
  wcscpy (d->name, name);
 | 
			
		||||
  d->handle = h;
 | 
			
		||||
  d->has_dtors = true;
 | 
			
		||||
  d->p = p;
 | 
			
		||||
  d->type = type;
 | 
			
		||||
  if (end == NULL)
 | 
			
		||||
@@ -159,7 +161,7 @@ dll_list::detach (void *retaddr)
 | 
			
		||||
      system_printf ("WARNING: trying to detach an already detached dll ...");
 | 
			
		||||
    else if (--d->count == 0)
 | 
			
		||||
      {
 | 
			
		||||
	d->p.run_dtors ();
 | 
			
		||||
	d->run_dtors ();
 | 
			
		||||
	d->prev->next = d->next;
 | 
			
		||||
	if (d->next)
 | 
			
		||||
	  d->next->prev = d->prev;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user