mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Maxim Thomas
03.30.2025 61dac86bceb9d727e1bd707982c41ab9467c6d5a
opendj-server-legacy/src/test/java/org/opends/server/TestCaseUtils.java
@@ -45,11 +45,12 @@
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.lang.management.LockInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MonitorInfo;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.net.BindException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
@@ -542,6 +543,9 @@
    ErrorLogger.getInstance().addLogPublisher(
            (ErrorLogPublisher) getServerStartupTextErrorPublisher(ERROR_TEXT_WRITER));
  }
  public static void setupTrace() {
    DebugLogger.getInstance().addPublisherIfRequired(DEBUG_TEXT_WRITER);
  }
@@ -742,11 +746,20 @@
  {
     for (; port > 1024;)
     {
         ServerSocket res=null;
        try
        {
          return bindPort(port--);
           res=bindPort(port--);
          return res;
        }
        catch (BindException e){}
        catch (BindException e){
             if (res!=null) {
                 try {
                     res.close();
                 } catch (IOException ex) {}
             }
             res=null;
         }
     }
     throw new BindException("Unable to bind to a free port");
  }
@@ -1927,20 +1940,71 @@
  public static String generateThreadDump() {
    final StringBuilder dump = new StringBuilder();
    final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    final ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100);
    ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(true, true);
    for (ThreadInfo threadInfo : threadInfos) {
        dump.append('"');
        dump.append(threadInfo.getThreadName());
        dump.append("\" ");
        final Thread.State state = threadInfo.getThreadState();
        dump.append("\n   java.lang.Thread.State: ");
        dump.append(state);
        final StackTraceElement[] stackTraceElements = threadInfo.getStackTrace();
        for (final StackTraceElement stackTraceElement : stackTraceElements) {
            dump.append("\n        at ");
            dump.append(stackTraceElement);
      dump.append("\"" + threadInfo.getThreadName() + "\"" +
              (threadInfo.isDaemon() ? " daemon" : "") +
              " prio=" + threadInfo.getPriority() +
              " Id=" + threadInfo.getThreadId() + " " +
              threadInfo.getThreadState());
      if (threadInfo.getLockName() != null) {
        dump.append(" on " + threadInfo.getLockName());
      }
      if (threadInfo.getLockOwnerName() != null) {
        dump.append(" owned by \"" + threadInfo.getLockOwnerName() +
                "\" Id=" + threadInfo.getLockOwnerId());
      }
      if (threadInfo.isSuspended()) {
        dump.append(" (suspended)");
      }
      if (threadInfo.isInNative()) {
        dump.append(" (in native)");
      }
      dump.append('\n');
      StackTraceElement[] stackTrace = threadInfo.getStackTrace();
      int i = 0;
      for (; i < stackTrace.length; i++) {
        StackTraceElement ste = stackTrace[i];
        dump.append("\tat " + ste.toString());
        dump.append('\n');
        if (i == 0 && threadInfo.getLockInfo() != null) {
          Thread.State ts = threadInfo.getThreadState();
          switch (ts) {
            case BLOCKED:
              dump.append("\t-  blocked on " + threadInfo.getLockInfo());
              dump.append('\n');
              break;
            case WAITING:
            case TIMED_WAITING:
              dump.append("\t-  waiting on " + threadInfo.getLockInfo());
              dump.append('\n');
              break;
            default:
          }
        }
        dump.append("\n\n");
        for (MonitorInfo mi : threadInfo.getLockedMonitors()) {
          if (mi.getLockedStackDepth() == i) {
            dump.append("\t-  locked " + mi);
            dump.append('\n');
          }
        }
      }
      if (i < stackTrace.length) {
        dump.append("\t...");
        dump.append('\n');
      }
      LockInfo[] locks = threadInfo.getLockedSynchronizers();
      if (locks.length > 0) {
        dump.append("\n\tNumber of locked synchronizers = " + locks.length);
        dump.append('\n');
        for (LockInfo li : locks) {
          dump.append("\t- " + li);
          dump.append('\n');
        }
      }
      dump.append('\n');
    }
    return dump.toString();
  }