- Implemented Thread.dumpThreads() and Thread.getThreads().

- Added a couple more fake native libraries to VFS.
This commit is contained in:
jfrijters 2007-08-17 09:12:51 +00:00
Родитель 3c6b7ac8db
Коммит d5d1f1de1b
3 изменённых файлов: 77 добавлений и 2 удалений

Просмотреть файл

@ -50,4 +50,5 @@ public interface LibraryVMInterface
Object newAssemblyClassLoader(cli.System.Reflection.Assembly assembly);
void initProperties(java.util.Properties props);
StackTraceElement[] getStackTrace(cli.System.Diagnostics.StackTrace stack);
}

Просмотреть файл

@ -216,4 +216,9 @@ public class LibraryVMInterfaceImpl implements ikvm.internal.LibraryVMInterface
{
gnu.classpath.VMSystemProperties.initOpenJDK(props);
}
public StackTraceElement[] getStackTrace(cli.System.Diagnostics.StackTrace stack)
{
return ExceptionHelper.getStackTrace(stack, Integer.MAX_VALUE);
}
}

Просмотреть файл

@ -336,6 +336,10 @@ namespace IKVM.NativeCode.java
if (name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("zip")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("awt")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("rmi")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("w2k_lsa_auth")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("jaas_nt")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("jaas_unix")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("unpack")
|| name == "bin/" + IKVM.NativeCode.java.lang.System.mapLibraryName("net"))
{
return new VfsEntry(false);
@ -3564,12 +3568,76 @@ namespace IKVM.NativeCode.java
public static object[][] dumpThreads(object[] threads)
{
throw new NotImplementedException();
#if FIRST_PASS
return null;
#else
jlStackTraceElement[][] stacks = new jlStackTraceElement[threads.Length][];
for (int i = 0; i < threads.Length; i++)
{
VMThread t = GetVMThread(threads[i]);
if (t == null)
{
stacks[i] = new jlStackTraceElement[0];
}
else
{
try
{
bool suspended = false;
if ((t.nativeThread.ThreadState & ThreadState.Suspended) == 0 && t.nativeThread != SystemThreadingThread.CurrentThread)
{
t.nativeThread.Suspend();
suspended = true;
}
StackTrace stack;
try
{
stack = new StackTrace(t.nativeThread, true);
}
finally
{
if (suspended)
{
t.nativeThread.Resume();
}
}
stacks[i] = JVM.Library.getStackTrace(stack);
}
catch (ThreadStateException)
{
stacks[i] = new jlStackTraceElement[0];
}
}
}
return stacks;
#endif
}
#if !FIRST_PASS
private sealed class GetThreads : jsPrivilegedAction
{
public object run()
{
jlThreadGroup root = (jlThreadGroup)mainThreadGroup;
for (; ; )
{
jlThread[] threads = new jlThread[root.activeCount()];
if (root.enumerate(threads) == threads.Length)
{
return threads;
}
}
}
}
#endif
public static object[] getThreads()
{
throw new NotImplementedException();
#if FIRST_PASS
return null;
#else
return (object[])jsAccessController.doPrivileged(new GetThreads());
#endif
}
public static void setPriority0(object thisThread, int newPriority)
@ -3691,6 +3759,7 @@ namespace IKVM.NativeCode.java
// this is called from JniInterface.cs
internal static void WaitUntilLastJniThread()
{
// TODO
throw new NotImplementedException();
}