#include "server.h"
-struct thread_info
-{
- struct inferior_list_entry entry;
- void *target_data;
- void *regcache_data;
- unsigned int gdb_id;
-};
-
struct inferior_list all_processes;
struct inferior_list all_threads;
struct inferior_list all_dlls;
memset (new_thread, 0, sizeof (*new_thread));
new_thread->entry.id = thread_id;
+ new_thread->last_resume_kind = resume_continue;
+ new_thread->last_status.kind = TARGET_WAITKIND_IGNORE;
add_inferior_to_list (&all_threads, & new_thread->entry);
free_one_thread (&thread->entry);
}
+/* Find the first inferior_list_entry E in LIST for which FUNC (E, ARG)
+ returns non-zero. If no entry is found then return NULL. */
+
struct inferior_list_entry *
find_inferior (struct inferior_list *list,
int (*func) (struct inferior_list_entry *, void *), void *arg)
key_dll.base_addr = base_addr;
dll = (void *) find_inferior (&all_dlls, match_dll, &key_dll);
- remove_inferior (&all_dlls, &dll->entry);
- free_one_dll (&dll->entry);
- dlls_changed = 1;
+
+ if (dll == NULL)
+ /* For some inferiors we might get unloaded_dll events without having
+ a corresponding loaded_dll. In that case, the dll cannot be found
+ in ALL_DLL, and there is nothing further for us to do.
+
+ This has been observed when running 32bit executables on Windows64
+ (i.e. through WOW64, the interface between the 32bits and 64bits
+ worlds). In that case, the inferior always does some strange
+ unloading of unnamed dll. */
+ return;
+ else
+ {
+ /* DLL has been found so remove the entry and free associated
+ resources. */
+ remove_inferior (&all_dlls, &dll->entry);
+ free_one_dll (&dll->entry);
+ dlls_changed = 1;
+ }
}
#define clear_list(LIST) \