internal void InitializeThreads(Inferior inferior)
{
TargetAddress ptr = inferior.ReadAddress (MonoDebuggerInfo.ThreadTable);
while (!ptr.IsNull) {
int size;
if (MonoDebuggerInfo.CheckRuntimeVersion (81, 3))
size = 60 + inferior.TargetMemoryInfo.TargetAddressSize;
else
size = 32 + inferior.TargetMemoryInfo.TargetAddressSize;
TargetReader reader = new TargetReader (inferior.ReadMemory (ptr, size));
long tid = reader.ReadLongInteger ();
TargetAddress lmf_addr = reader.ReadAddress ();
TargetAddress end_stack = reader.ReadAddress ();
TargetAddress extended_notifications_addr = ptr + 24;
if (inferior.TargetMemoryInfo.TargetAddressSize == 4)
tid &= 0x00000000ffffffffL;
reader.Offset += 8;
ptr = reader.ReadAddress ();
ThreadFlags flags = ThreadFlags.None;
if (MonoDebuggerInfo.CheckRuntimeVersion (81, 3)) {
reader.Offset = 56 + inferior.TargetAddressSize;
flags = (ThreadFlags) reader.ReadInteger ();
}
bool found = false;
foreach (SingleSteppingEngine engine in process.Engines) {
if (engine.TID != tid)
continue;
engine.SetManagedThreadData (lmf_addr, extended_notifications_addr);
engine.OnManagedThreadCreated (end_stack);
check_thread_flags (engine, flags);
found = true;
break;
}
if (!found)
Report.Error ("Cannot find thread {0:x} in {1}",
tid, process.ProcessStart.CommandLine);
}
}