/* Copyright (C) 2021-2025 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "config.h"
#include <stdio.h>
#include <signal.h>
#include <stdarg.h>
#include <fcntl.h>      // creat
#include <unistd.h>     // sleep
#include <pthread.h>    // pthread_exit
#include <sys/wait.h>   // wait
#include <locale.h>

#include "libiberty.h"
#include "DbeApplication.h"
#include "Histable.h"
#include "ipcio.h"
#include "Dbe.h"
#include "DbeSession.h"
#include "DbeThread.h"
#include "DbeView.h"

int ipc_flags = 0;
IPCTraceLevel ipc_trace_level = TRACE_LVL_0;
int ipc_single_threaded_mode = 0;
const char *IPC_PROTOCOL_UNKNOWN = "IPC_PROTOCOL_UNKNOWN";
const char *IPC_PROTOCOL_CURR = IPC_PROTOCOL_STR;
char const *ipc_protocol = NULL;

DbeThreadPool *ipcThreadPool;

extern int currentRequestID;
extern int currentChannelID;
extern BufferPool *responseBufferPool;
extern bool cancelNeeded (int);
extern void reexec ();

/* Simple implementation of support for cancel of open experiment. Since we have only one cancellable
   operation supported at this moment, we are using just a global variable.
   As we support more and more cancellable ops we need a more sophisticated data struture such
   as a mt-safe array to keep track of all cancellable requests/channels and update the supporting
   routines - setCancellableChannel, cancelNeeded (in ipcio.cc) setCancelRequestedCh */
int cancellableChannelID = 0xFFFFFFFF;
int cancelRequestedChannelID;

static const char *table_name (int);

#define VSIZE(v)        ((long long) ((v) ? (v)->size() : 0))

inline const char*
bool2str (bool v)
{
  return v ? "true" : "false";
}

inline const char*
str2str (const char* v)
{
  return v ? v : "NULL";
}

inline const char*
str2s (const char* v)
{
  return v ? v : "";
}

inline DbeView *
getView (int index)
{
  return dbeSession->getView (index);
}

extern "C"
{
  typedef void (*SignalHandler)(int);
}

/*
 * Fatal error handlers
 */
static int fatalErrorCode = 1;
static int fatalErrorCounter = 0;
static void *fatalErrorContext = 0;
static siginfo_t *fatalErrorInfo = 0;
static char *fatalErrorDynamicMemory = NULL;

extern "C" void
fatalErrorHadler (int sig, siginfo_t *info, void *context)
{
  if (fatalErrorCounter > 0)
    { // Need synchronization here
      //sleep(10); // Wait 10 seconds to make sure previous processing is done
      return; // exit(fatalErrorCode); // Already in processing
    }
  fatalErrorCounter = 1;
  fatalErrorCode = sig;
  fatalErrorContext = context;
  fatalErrorInfo = info;
  // Free reserved memory
  if (fatalErrorDynamicMemory != NULL)
    {
      free (fatalErrorDynamicMemory);
      fatalErrorDynamicMemory = NULL;
    }
  // Get process ID
  pid_t pid = getpid ();
  // Create dump file
  char fname[128];
  snprintf (fname, sizeof (fname), "/tmp/gprofng.%lld", (long long) pid);
  mkdir (fname, 0700);
  snprintf (fname, sizeof (fname), "/tmp/gprofng.%lld/crash.sig%d.%lld",
	    (long long) pid, sig, (long long) pid);
  // Dump stack trace in background using pstack
  char buf[256];
  snprintf (buf, sizeof (buf), "/usr/bin/pstack %lld > %s.pstack",
	    (long long) pid, fname);
  system (buf);
  int fd = creat (fname, 0600);
  if (fd >= 0)
    {
      // Write error message
      dbe_write (fd, "A fatal error has been detected by er_print: Signal %d\n",
		 sig);
      dbe_write (fd, "Protocol Version: %d\n", IPC_VERSION_NUMBER);
      close (fd);
    }
  wait (0); // wait for pstack
  //sleep(10); // Wait 10 seconds to make sure processing of fatal error is done
  // Exit with correct status
  exit (fatalErrorCode);
}

// SIGABRT Handler
extern "C" void
sigABRT_handler (int sig, siginfo_t *info, void *context)
{
  fatalErrorHadler (sig, info, context);
  pthread_exit (&fatalErrorCode);
}

// SIGSEGV Handler
extern "C" void
sigSEGV_handler (int sig, siginfo_t *info, void *context)
{
  //if (fatalErrorCounter > 0) sleep(1); // Wait 1 second
  fatalErrorHadler (sig, info, context);
  pthread_exit (&fatalErrorCode);
}

// SIGTERM Handler
extern "C" void sigterm_handler (int sig, siginfo_t *info, void *context);
struct sigaction old_sigterm_handler;

volatile int term_flag;
int error_flag;

extern "C" void
sigterm_handler (int, siginfo_t *, void *)
{
  if (fatalErrorCounter > 0)
    {
      //sleep(10); // Wait 10 seconds to make sure processing of fatal error is done
      //return; // Fatal error processing will exit it
      pthread_exit (&fatalErrorCode);
    }
  term_flag = 1;
}

#define ipc_log ipc_default_log
#define ipc_request_trace ipc_request_log
#define ipc_response_trace ipc_response_log
static const char *ipc_log_name = NULL;
static const char *ipc_request_log_name = NULL;
static const char *ipc_response_log_name = NULL;
static FILE *requestLogFileP = stderr;
static FILE *responseLogFileP = stderr;
static hrtime_t begin_time;
static long long delta_time = 0;

void
ipc_default_log (const char *fmt, ...)
{
  if (!ipc_log_name || !ipc_flags)
    return;
  if (ipc_trace_level >= TRACE_LVL_3)
    {
      hrtime_t cur_time = gethrtime ();
      unsigned long long time_stamp = (cur_time - begin_time) / 1000000 + delta_time;
      fprintf (stderr, "%7llu: ", time_stamp);
    }
  va_list vp;
  va_start (vp, fmt);
  vfprintf (stderr, fmt, vp);
  va_end (vp);
  fflush (stderr);
}

extern "C" void sigint_handler (int sig, siginfo_t *info, void *context);
struct sigaction old_sigint_handler;

extern "C" void
sigint_handler (int, siginfo_t *, void *)
{
  ipc_log ("SIGINT signal happens\n");
}

void
ipc_request_log (IPCTraceLevel trace_level, const char *fmt, ...)
{
  if (!ipc_request_log_name || !ipc_flags || trace_level > ipc_trace_level)
    return;
  fprintf (responseLogFileP, "thr: %llu ", (unsigned long long) pthread_self ());
  if (ipc_trace_level >= TRACE_LVL_3)
    {
      hrtime_t cur_time = gethrtime ();
      unsigned long long time_stamp = (cur_time - begin_time) / 1000000 + delta_time;
      fprintf (requestLogFileP, "%7llu: ", time_stamp);
    }
  va_list vp;
  va_start (vp, fmt);
  vfprintf (requestLogFileP, fmt, vp);
  va_end (vp);
  fflush (requestLogFileP);
}

void
ipc_response_log (IPCTraceLevel trace_level, const char *fmt, ...)
{
  if (!ipc_response_log_name || !ipc_flags || trace_level > ipc_trace_level)
    return;
  fprintf (responseLogFileP, "thr: %llu ", (unsigned long long) pthread_self ());
  if (ipc_trace_level >= TRACE_LVL_3)
    {
      hrtime_t cur_time = gethrtime ();
      unsigned long long time_stamp = (cur_time - begin_time) / 1000000 + delta_time;
      fprintf (responseLogFileP, "%7llu: ", time_stamp);
    }
  va_list vp;
  va_start (vp, fmt);
  vfprintf (responseLogFileP, fmt, vp);
  va_end (vp);
  fflush (responseLogFileP);
}

#ifdef IPC_LOG
void
ipc_dump (char *s, Vector<bool> *v)
{
  if (v == NULL)
    {
      ipc_log ("    Vector<bool> %s is NULL\n", str2s (s));
      return;
    }
  ipc_log ("    Vector<bool> %s size=%lld\n", str2s (s), VSIZE (v));
  for (int i = 0; i < v->size (); i++)
    ipc_log ("      [%d]: %s\n", i, bool2str (v->fetch (i)));
}

void
ipc_dump (char *s, Vector<String> *v)
{
  if (v == NULL)
    {
      ipc_log ("    Vector<bool> %s is NULL\n", str2s (s));
      return;
    }
  ipc_log ("    Vector<String> %s size=%lld\n", str2s (s), VSIZE (v));
  for (int i = 0; i < v->size (); i++)
    {
      String str = v->fetch (i);
      ipc_log ("      [%d]: '%s'\n", i, str2str (str));
    }
}

void
ipc_dump (char *s, Vector<Obj> *v)
{
  if (v == NULL)
    {
      ipc_log ("    Vector<Obj> %s is NULL\n", str2s (s));
      return;
    }
  ipc_log ("    Vector<void *> %s size=%lld\n", str2s (s), VSIZE (v));
  for (int i = 0; i < v->size (); i++)
    ipc_log ("      [%d]: 0x%08llx\n", i, (long long) (v->fetch (i)));
}

#else
#define ipc_dump(s, v)
#endif

static MetricList *
readMetricListV2 (int dbevindex, IPCrequest* req)
{
  MetricType mtype = (MetricType) readInt (req);
  Vector<int> *type = (Vector<int>*)readArray (req);
  Vector<int> *subtype = (Vector<int>*)readArray (req);
  Vector<bool> *sort = (Vector<bool>*)readArray (req);
  Vector<int> *vis = (Vector<int>*)readArray (req);
  Vector<char*> *cmd = (Vector<char*>*)readArray (req);
  Vector<char*> *expr_spec = (Vector<char*>*)readArray (req);
  Vector<char*> *legends = (Vector<char*>*)readArray (req);
  MetricList *mlist = dbeGetMetricListV2 (dbevindex, mtype, type, subtype, sort,
					  vis, cmd, expr_spec, legends);
  return mlist;
}

static void
setCancellableChannel (int chID)
{
  cancellableChannelID = chID;
}

/* Add more entries here for other cancellable operations */
static void
checkCancellableOp (char *inp, IPCrequest* req)
{
  if (!strcmp (inp, "setFilterStr"))
    setCancellableChannel (currentChannelID);
  else if (!strcmp (inp, "openExperimentList"))
    setCancellableChannel (currentChannelID);
  else if (!strcmp (inp, "getFiles") || !strcmp (inp, "getFileAttributes"))
    {
      setCancellableChannel (currentChannelID);
      req->setCancelImmediate ();
    }
}

/* This is what used to be the core of ipc_mainLoop before asynch ipc.
   Read the details of the request from the request buffer: name, args etc
   do the work by calling the appropriate dbe routine(s) and write the
   response to a response buffer and queue it up in the response queue */

int
ipc_doWork (void *arg)
{
  IPCrequest *req = (IPCrequest *) arg;
  currentRequestID = req->getRequestID ();
  currentChannelID = req->getChannelID ();
  req->setStatus (IN_PROGRESS);
  String inp = readString (req);
  if (inp == NULL)
    {
      ipc_log ("NULL ipc command received, exiting\n");
      return 0;
    }
  ipc_log ("ipc: %s Req %x Ch %x\n", inp, req->getRequestID (), req->getChannelID ());
  checkCancellableOp (inp, req);
  if (!strcmp (inp, "initApplication"))
    {
      bool nbm = readBoolean (req);
      String arg1 = readString (req);
      String arg2 = readString (req);
      Vector<String> *arg3 = (Vector<String>*)readArray (req);
      ipc_log ("  nbm: %s, arg1: '%s', arg2: '%s'\n", bool2str (nbm), str2str (arg1), str2str (arg2));
      ipc_dump ("arg3", arg3);
      // set the session to be interactive
      dbeSession->set_interactive (true);
      if (nbm)
	theApplication->set_name ("analyzer-NBM");
      else
	theApplication->set_name ("analyzer");

	  // XXX Why does it reset the install directory????  Or a licensing directory???
      // Vector<String> *res = theDbeApplication->initApplication (arg1, arg2, &setProgress);
      Vector<String> *res = theDbeApplication->initApplication (NULL, NULL, &setProgress);
      writeArray (res, req);
      free (arg1);
      free (arg2);
      destroy (arg3);
      destroy (res);
    }
  else if (!strcmp (inp, "syncTime"))
    {
      long long anl_time = readLong (req);
      hrtime_t cur_time = gethrtime ();
      long long time_stamp = (cur_time - begin_time) / 1000000;
      delta_time = anl_time - time_stamp;
      ipc_log (" syncTime %llu %llu \n", anl_time, delta_time);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "getInitMessages"))
    {
      Vector<String> *res = dbeGetInitMessages ();
      ipc_log ("  returned = %lld msgs\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "reExec"))
    {
      ipc_log ("  started reexec()\n");
      reexec ();
    }
  else if (!strcmp (inp, "dbeCreateDirectories"))
    {
      String arg1 = readString (req); // path
      ipc_log ("  arg = %s\n", arg1);
      String res = dbeCreateDirectories (arg1);
      writeString (res, req);
      free (arg1);
      free (res);
    }
  else if (!strcmp (inp, "dbeDeleteFile"))
    {
      String arg1 = readString (req); // path
      ipc_log ("  arg = %s\n", arg1);
      String res = dbeDeleteFile (arg1);
      writeString (res, req);
      free (arg1);
      free (res);
    }
  else if (!strcmp (inp, "dbeReadFile"))
    {
      String arg1 = readString (req);
      ipc_log ("  arg = %s\n", arg1); // path
      Vector<String> *res = dbeReadFile (arg1);
      writeArray (res, req);
      free (arg1);
      destroy (res);
    }
  else if (!strcmp (inp, "dbeWriteFile"))
    {
      String arg1 = readString (req); // path
      String arg2 = readString (req); // contents
      ipc_log ("  arg1 = %s  arg2 = %s\n", arg1, arg2);
      int res = dbeWriteFile (arg1, arg2);
      writeInt (res, req);
      free (arg1);
    }
  else if (!strcmp (inp, "getExpPreview"))
    {
      // XXX add another argument == DbeView index
      String arg1 = readString (req);
      ipc_log ("  arg = %s\n", arg1);
      Vector<String> *res = dbeGetExpPreview (0, arg1);
      writeArray (res, req);
      free (arg1);
      destroy (res);
    }
  else if (!strcmp (inp, "getFileAttributes"))
    {
      String arg1 = readString (req); // filename
      String arg2 = readString (req); // format
      ipc_log ("  arg1 = %s  arg2 = %s\n", arg1, arg2);
      String res = dbeGetFileAttributes (arg1, arg2);
      writeString (res, req);
      free (arg1);
      free (arg2);
      free (res);
    }
  else if (!strcmp (inp, "getFiles"))
    {
      String arg1 = readString (req); // dirname
      String arg2 = readString (req); // format
      ipc_log ("  arg1 = %s  arg2 = %s\n", arg1, arg2);
      String res = dbeGetFiles (arg1, arg2);
      writeString (res, req);
      free (arg1);
      free (arg2);
      free (res);
    }
  else if (!strcmp (inp, "getOSFamily"))
    writeString ("Linux", req);
  else if (!strcmp (inp, "getRunningProcesses"))
    {
      String arg1 = readString (req); // format
      ipc_log ("  arg = %s\n", arg1);
      String res = dbeGetRunningProcesses (arg1);
      writeString (res, req);
      free (arg1);
      free (res);
    }
  else if (!strcmp (inp, "getCurrentDirectory"))
    {
      char buf [2048];
      String res = getcwd (buf, (size_t) sizeof (buf)); // Get current directory
      writeString (res, req);
    }
  else if (!strcmp (inp, "getHomeDirectory"))
    {
      String res = getenv ("HOME"); // Get HOME directory
      writeString (res, req);
    }
  else if (!strcmp (inp, "setCurrentDirectory"))
    {
      String arg1 = readString (req); // dirname
      ipc_log ("  arg = %s\n", arg1);
      int res = chdir (arg1); // Change directory
      writeInt (res, req);
      free (arg1);
    }
  else if (!strcmp (inp, "getLocale"))
    {
      String res = setlocale (LC_ALL, ""); // Get locale
      writeString (res, req);
    }
  else if (!strcmp (inp, "setLocale"))
    {
      String arg1 = readString (req); // locale
      ipc_log ("  arg = %s\n", arg1);
      String res = setlocale (LC_ALL, arg1); // Set locale
      writeString (res, req);
      free (arg1);
    }
  else if (!strcmp (inp, "readRCFile"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req); // file name
      ipc_log ("  arg1=%d, arg2=%s\n", arg1, arg2);
      String res = dbeReadRCFile (arg1, arg2); // Read RC File
      writeString (res, req);
      free (res);
    }
  else if (!strcmp (inp, "dbeGetExpParams"))
    {
      // XXX add another argument == DbeView index
      String arg1 = readString (req);
      ipc_log ("  arg = %s\n", arg1);
      String res = dbeGetExpParams (0, arg1);
      writeString (res, req);
      free (arg1);
      free (res);
    }
  else if (!strcmp (inp, "getExperimentsGroups"))
    {
      Vector<Vector<char*>*> *groups = dbeGetExperimensGroups ();
      writeArray (groups, req);
      destroy (groups);
    }
  else if (!strcmp (inp, "setExperimentsGroups"))
    {
      Vector<Vector<char*>*> *groups = (Vector<Vector<char*>*> *)readArray (req);
      ipc_log ("  groups.size = %lld\n", VSIZE (groups));
      char *msg_str = dbeSetExperimentsGroups (groups);
      writeString (msg_str, req);
      free (msg_str);
      destroy (groups);
    }
  else if (!strcmp (inp, "dropExperiment"))
    {
      int arg1 = readInt (req);
      Vector<int> *arg2 = (Vector<int>*)readArray (req);
      ipc_log ("  arg = %d, exps = %lld\n", arg1, VSIZE (arg2));
      char *res = dbeDropExperiment (arg1, arg2);
      writeString (res, req);
      free (res);
      delete arg2;
    }
  else if (!strcmp (inp, "getUserExpId"))
    {
      Vector<int> *arg = (Vector<int>*)readArray (req);
      ipc_log ("  expIds = %lld\n", VSIZE (arg));
      Vector<int> *res = dbeGetUserExpId (arg);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getFounderExpId"))
    {
      Vector<int> *arg = (Vector<int>*)readArray (req);
      ipc_log ("  expIds = %lld\n", VSIZE (arg));
      Vector<int> *res = dbeGetFounderExpId (arg);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getExpGroupId"))
    {
      Vector<int> *arg = (Vector<int>*)readArray (req);
      ipc_log ("  expIds = %lld\n", VSIZE (arg));
      Vector<int> *res = dbeGetExpGroupId (arg);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getExpsProperty"))
    {
      String arg = readString (req);
      Vector<String> *res = dbeGetExpsProperty (arg);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getExpName"))
    {
      // XXX add argument == DbeView index
      Vector<String> *res = dbeGetExpName (0);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getExpState"))
    {
      // XXX add argument == DbeView index
      Vector<int> *res = dbeGetExpState (0);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getExpEnable"))
    {
      int arg1 = readInt (req);
      ipc_log ("  arg1 = %d\n", arg1);
      Vector<bool> *res = dbeGetExpEnable (arg1);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "setExpEnable"))
    {
      int arg1 = readInt (req);
      Vector<bool> *arg2 = (Vector<bool>*)readArray (req);
      ipc_log ("  arg1=%d\n", arg1);
      ipc_dump ("arg2", arg2);
      bool b = dbeSetExpEnable (arg1, arg2);
      writeBoolean (b, req);
      ipc_log ("  dbeSetExpEnable returns %s\n", bool2str (b));
      delete arg2;
    }
  else if (!strcmp (inp, "getExpInfo"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<String> *res = dbeGetExpInfo (arg1);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getViewModeEnable"))
    {
      bool res = dbeGetViewModeEnable ();
      writeBoolean (res, req);
    }
  else if (!strcmp (inp, "getJavaEnable"))
    {
      bool res = dbeGetJavaEnable ();
      writeBoolean (res, req);
    }
  else if (!strcmp (inp, "updateNotes"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      String arg4 = readString (req);
      bool arg5 = readBoolean (req);
      ipc_log ("  args = %d, %d\n", arg1, arg2);
      int i = dbeUpdateNotes (arg1, arg2, arg3, arg4, arg5);
      writeInt (i, req);
    }
  else if (!strcmp (inp, "getLoadObjectList"))
    {
      int arg1 = readInt (req);
      ipc_log ("  arg = %d\n", arg1);
      Vector<void *> *res = dbeGetLoadObjectList (arg1);
      if (res == NULL)
	ipc_log ("  returning = NULL for LoadObjectList\n");
      else
	{
	  Vector<char*> *s = (Vector<char*> *) res->fetch (0);
	  ipc_log ("  returning = %lld vectors for %lld LoadObjects\n",
		   VSIZE (res), VSIZE (s));
	}
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getLoadObjectName"))
    {
      int arg1 = readInt (req);
      ipc_log ("  arg = %d\n", arg1);
      Vector<String> *res = dbeGetLoadObjectName (arg1);
      ipc_log ("  returning = %lld strings\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getTabListInfo"))
    {
      int arg1 = readInt (req);
      ipc_log ("  arg = %d\n", arg1);
      Vector<void*> *res = dbeGetTabListInfo (arg1);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getSearchPath"))
    {
      // XXX add argument == DbeView index
      ipc_log ("  no args\n");
      Vector<String> *res = dbeGetSearchPath (0);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setSearchPath"))
    {
      // XXX add another argument == DbeView index
      Vector<String> *res = (Vector<String>*)readArray (req);
      ipc_log ("  %lld strings\n", VSIZE (res));
      dbeSetSearchPath (0, res);
      writeString (NULL, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getPathmaps"))
    {
      Vector<void*> *res = dbeGetPathmaps (0);
      ipc_log ("  returns = %lld objects, number of pathmaps = %lld\n",
	       VSIZE (res), VSIZE ((Vector<int>*)res->fetch (0)));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setPathmaps"))
    {
      Vector<String> *from = (Vector<String>*)readArray (req);
      Vector<String> *to = (Vector<String>*)readArray (req);
      char *res = dbeSetPathmaps (from, to);
      writeString (res, req);
      free (res);
      if (from)
	{
	  from->destroy ();
	  delete from;
	}
      if (to)
	{
	  to->destroy ();
	  delete to;
	}
    }
  else if (!strcmp (inp, "addPathmap"))
    {
      // XXX add another argument == DbeView index
      String arg1 = readString (req);
      String arg2 = readString (req);
      ipc_log ("  args = '%s', '%s'\n", arg1 ? arg1 : "NULL", arg2 ? arg2 : "NULL");
      char *res = dbeAddPathmap (0, arg1, arg2);
      ipc_log ("  returns = '%s'\n", (res != NULL ? res : "NULL"));
      writeString (res, req);
      free (arg1);
      free (arg2);
    }
  else if (!strcmp (inp, "getMsg"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  args = %d, %d\n", arg1, arg2);
      String res = dbeGetMsg (arg1, arg2);
      ipc_log ("  returns = '%s'\n", (res != NULL ? res : "<NULL>"));
      writeString (res, req);
      free (res);
    }
  else if (!strcmp (inp, "initView"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  new view = %d; clone of view %d\n", arg1, arg2);
      dbeInitView (arg1, arg2);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "disposeWindow"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      dbeDeleteView (arg1);
      writeString (NULL, req);
    }
#if 0
  else if (!strcmp (inp, "createMapfile"))
    {
      int arg1 = readInt ();
      String arg2 = readString ();
      int arg3 = readInt ();
      ipc_log ("  args = %d, %s, %d\n", arg1, arg2, arg3);
      String res = dbeCreateMapfile (arg1, arg2, arg3);
      writeString (res);
      free (arg2);
      free (res);
    }
#endif
  else if (!strcmp (inp, "setCompareModeV2"))
    {
      int dbevindex = readInt (req);
      int cmp_mode = readInt (req);
      getView (dbevindex)->set_compare_mode (cmp_mode);
      writeResponseGeneric (RESPONSE_STATUS_SUCCESS, req->getRequestID (), req->getChannelID ());
    }
  else if (!strcmp (inp, "getCompareModeV2"))
    {
      int dbevindex = readInt (req);
      int res = CMP_DISABLE;
      if (dbeSession->expGroups && dbeSession->expGroups->size () > 1)
	res = getView (dbevindex)->get_compare_mode ();
      ipc_log ("  %s: %d returns %d\n", inp, dbevindex, res);
      writeInt (res, req);
    }
  else if (!strcmp (inp, "getRefMetricsV2"))
    {
      Vector<void*> *res = dbeGetRefMetricsV2 ();
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setCurMetricsV2"))
    {
      int dbevindex = readInt (req);
      int cmp_mode = readInt (req);
      MetricList *mlist = readMetricListV2 (dbevindex, req);
      getView (dbevindex)->reset_metric_list (mlist, cmp_mode);
      writeResponseGeneric (RESPONSE_STATUS_SUCCESS, req->getRequestID (), req->getChannelID ());
    }
  else if (!strcmp (inp, "getCurMetricsV2"))
    {
      int arg1 = readInt (req);
      MetricType arg2 = (MetricType) readInt (req);
      ipc_log ("  args = %d, %d\n", arg1, arg2);
      Vector<void*> *res = dbeGetCurMetricsV2 (arg1, arg2);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getRefMetricTree"))
    {
      int dbevindex = readInt (req);
      bool include_unregistered = readBoolean (req);
      ipc_log ("  args = %d, %d\n", dbevindex, include_unregistered);
      Vector<void*> *res = dbeGetRefMetricTree (dbevindex, include_unregistered);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getRefMetricTreeValues"))
    {
      int dbevindex = readInt (req);
      Vector<String> *metcmds = (Vector<String>*)readArray (req);
      Vector<String> *nonmetcmds = (Vector<String>*)readArray (req);
      ipc_log ("  args = %d, metcmds->size()=%lld, nonmetcmds->size()=%lld\n",
	       dbevindex, VSIZE (metcmds), VSIZE (nonmetcmds));
      ipc_dump ("metcmds", metcmds);
      ipc_dump ("nonmetcmds", nonmetcmds);
      Vector<void*> *res = dbeGetRefMetricTreeValues (dbevindex, metcmds, nonmetcmds);
#ifdef IPC_LOG
      if (res != NULL)
	ipc_log ("  returns = %lld objects, length = %lld\n",
		 VSIZE (res), VSIZE (((Vector<int>*)res->fetch (0))));
      else
	ipc_log ("  returns NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getOverviewText"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<char*> *res = dbeGetOverviewText (arg1);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setSort"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      MetricType arg3 = (MetricType) readInt (req);
      bool arg4 = readBoolean (req);
      ipc_log ("  args = %d, %d, %d, %c\n", arg1, arg2, arg3, (arg4 ? 'T' : 'F'));
      dbeSetSort (arg1, arg2, arg3, arg4);
      writeString (NULL, req);
    }

  else if (!strcmp (inp, "getAnoValue"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<int> *res = dbeGetAnoValue (arg1);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "setAnoValue"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d, array\n", arg1);
      Vector<int> *arg2 = (Vector<int>*)readArray (req);
      dbeSetAnoValue (arg1, arg2);
      writeString (NULL, req);
      delete arg2;
    }
  else if (!strcmp (inp, "getNameFormat"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      int b = dbeGetNameFormat (arg1);
      writeInt (b, req);
    }
  else if (!strcmp (inp, "getSoName"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      bool b = dbeGetSoName (arg1);
      writeBoolean (b, req);
    }
  else if (!strcmp (inp, "setNameFormat"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      bool arg3 = readBoolean (req);
      ipc_log ("  args = %d, %d, %d\n", arg1, arg2, arg3);
      dbeSetNameFormat (arg1, arg2, arg3);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "getViewMode"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      int i = dbeGetViewMode (arg1);
      ipc_log ("  returns = %d\n", i);
      writeInt (i, req);
    }
  else if (!strcmp (inp, "setViewMode"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  args = %d, %d\n", arg1, arg2);
      dbeSetViewMode (arg1, arg2);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "getTLValue"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetTLValue (arg1);
      ipc_log ("  returns = %lld void*'s\n", VSIZE (res));
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "setTLValue"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      String tldata_cmd = readString (req);
      int entity_prop_id = readInt (req);
      int align = readInt (req);
      int depth = readInt (req);
      dbeSetTLValue (arg1, tldata_cmd, entity_prop_id, align, depth);
      writeString (NULL, req);
      free (tldata_cmd);
    }
  else if (!strcmp (inp, "getExpFounderDescendants"))
    {
      Vector<void*> *res = dbeGetExpFounderDescendants ();
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getExpSelection"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetExpSelection (arg1);
      writeArray (res, req);
      destroy (res);
    }

  else if (!strcmp (inp, "setFilterStr"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      ipc_log ("  args = %d, %s\n", arg1, arg2);
      String res = dbeSetFilterStr (arg1, arg2);
      ipc_log ("  returns = '%s'\n", res ? res : "NULL");
      writeString (res, req);
      free (arg2);
      free (res);
    }

  else if (!strcmp (inp, "getFilterStr"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      String res = dbeGetFilterStr (arg1);
      ipc_log ("  returns = '%s'\n", res ? res : "NULL");
      writeString (res, req);
      free (res);
    }

  else if (!strcmp (inp, "validateFilterExpression"))
    {
      String arg1 = readString (req);
      int res = dbeValidateFilterExpression (arg1);
      ipc_log ("  validateFilterExpression('%s') returned %d\n", str2str (arg1), res);
      free (arg1);
      writeInt (res, req);
    }

  else if (!strcmp (inp, "getFilterKeywords"))
    {
      int dbevindex = readInt (req);
      Vector<void*>*res = dbeGetFilterKeywords (dbevindex);
      writeArray (res, req);
      destroy (res);
    }

  else if (!strcmp (inp, "getFilters"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  args: view = %d, experiment = %d\n", arg1, arg2);
      Vector<void*>*res = dbeGetFilters (arg1, arg2);
      ipc_log ("  -- returned %lld Filters\n", VSIZE (res));
      writeArray (res, req);
      delete res;
    }

  else if (!strcmp (inp, "updateFilters"))
    {
      int arg1 = readInt (req);
      Vector<bool> *arg2 = (Vector<bool>*)readArray (req);
      Vector<String> *arg3 = (Vector<String>*)readArray (req);
      ipc_log ("arg1=%d arg2->size()=%lld  arg3->size()=%lld\n",
	       arg1, VSIZE (arg2), VSIZE (arg3));
      ipc_dump ("arg2", arg2);
      ipc_dump ("arg3", arg3);
      bool b = dbeUpdateFilters (arg1, arg2, arg3);
      writeBoolean (b, req);
      ipc_log ("  returns %s\n", (b == true ? "true" : "false"));
      delete arg2;
      delete arg3;
    }
  else if (!strcmp (inp, "getLoadObjectState"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d \n", arg1);
      Vector<int> *res = dbeGetLoadObjectState (arg1);
      ipc_log ("  returning = %lld int's\n", VSIZE (res));
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "setLoadObjectState"))
    {
      int arg1 = readInt (req);
      Vector<int> *arg2 = (Vector<int>*)readArray (req);
      ipc_log ("  args = %d, %lld objects\n", arg1, VSIZE (arg2));
      dbeSetLoadObjectState (arg1, arg2);
      writeString (NULL, req);
      delete arg2;
    }
  else if (!strcmp (inp, "setLoadObjectDefaults"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      dbeSetLoadObjectDefaults (arg1);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "getMemTabSelectionState"))
    {
      int arg1 = readInt (req);
      ipc_log ("  arg = %d\n", arg1);
      Vector<bool> *res = dbeGetMemTabSelectionState (arg1);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setMemTabSelectionState"))
    {
      int arg1 = readInt (req);
      Vector<bool> *arg2 = (Vector<bool> *)readArray (req);
      ipc_log ("  args = %d\n  arg2 = %lld objects\n", arg1, VSIZE (arg2));
      dbeSetMemTabSelectionState (arg1, arg2);
      writeString (NULL, req);
      destroy (arg2);
    }
  else if (!strcmp (inp, "getIndxTabSelectionState"))
    {
      int arg1 = readInt (req);
      ipc_log ("  arg = %d\n", arg1);
      Vector<bool> *res = dbeGetIndxTabSelectionState (arg1);
      ipc_log ("  -- returned %lld-vector [bool]\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setIndxTabSelectionState"))
    {
      int arg1 = readInt (req);
      Vector<bool> *arg2 = (Vector<bool> *)readArray (req);
      ipc_log ("  args = %d\n  arg2 = %lld objects\n", arg1, VSIZE (arg2));
      dbeSetIndxTabSelectionState (arg1, arg2);
      writeString (NULL, req);
      destroy (arg2);
    }
  else if (!strcmp (inp, "getTabSelectionState"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<bool> *res = dbeGetTabSelectionState (arg1);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "setTabSelectionState"))
    {
      int arg1 = readInt (req);
      Vector<bool> *arg2 = (Vector<bool>*)readArray (req);
      ipc_log ("  args = %d\n  arg2 = %lld objects\n", arg1, VSIZE (arg2));
      dbeSetTabSelectionState (arg1, arg2);
      writeString (NULL, req);
      delete arg2;
    }
  else if (!strcmp (inp, "getMemObjects"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetMemObjects (arg1);

#ifdef IPC_LOG
      if (res == NULL)
	ipc_log ("  -- returned NULL\n");
      else
	{
	  Vector<int> *mo_types = (Vector<int> *)res->fetch (0);
	  ipc_log ("  -- returned %lld-vector [ %lld-vectors]\n",
		   VSIZE (res), VSIZE (mo_types));
	}
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "loadMachineModel"))
    {
      String arg1 = readString (req);
#ifdef IPC_LOG
      ipc_log ("  arg = `%s'\n", arg1);
#endif
      String sts = dbeLoadMachineModel (arg1);
#ifdef IPC_LOG
      ipc_log ("  returns '%s'\n", sts ? sts : "NULL");
#endif
      writeString (sts, req);
      free (arg1);
    }
  else if (!strcmp (inp, "getMachineModel"))
    {
      String sts = dbeGetMachineModel ();
#ifdef IPC_LOG
      ipc_log ("  returns '%s'\n", sts ? sts : "NULL");
#endif
      writeString (sts, req);
    }
  else if (!strcmp (inp, "getCPUVerMachineModel"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<char*> *res = dbeGetCPUVerMachineModel (arg1);
      writeArray (res, req);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "listMachineModels"))
    {
      Vector<String> *res = dbeListMachineModels ();
#ifdef IPC_LOG
      if (res != NULL)
	ipc_log ("  returns = %lld strings\n", VSIZE (res));
      else
	ipc_log ("  returns NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "defineMemObj"))
    {
      String arg1 = readString (req);
      String arg2 = readString (req);
      String arg3 = readString (req);
      String arg4 = readString (req);
#ifdef IPC_LOG
      ipc_log ("  args = %s, %s, %s, %s\n", arg1, arg2, arg3 == NULL ? "NULL" : arg3, arg4 == NULL ? "NULL" : arg4);
#endif
      String sts = dbeDefineMemObj (arg1, arg2, NULL, arg3, arg4);
#ifdef IPC_LOG
      ipc_log ("  returns '%s'\n", sts ? sts : "NULL");
#endif
      writeString (sts, req);
      free (arg1);
      free (arg2);
      free (arg3);
      free (arg4);
    }
  else if (!strcmp (inp, "deleteMemObj"))
    {
      String arg1 = readString (req);
#ifdef IPC_LOG
      ipc_log ("  args = %s\n", arg1);
#endif
      String sts = dbeDeleteMemObj (arg1);
#ifdef IPC_LOG
      ipc_log ("  returns '%s'\n", sts ? sts : "NULL");
#endif
      writeString (sts, req);
      free (arg1);
    }
  else if (!strcmp (inp, "getIndxObjDescriptions"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetIndxObjDescriptions (arg1);
#ifdef IPC_LOG
      if (res == NULL)
	ipc_log ("  -- returned NULL\n");
      else
	{
	  Vector<int> *indxo_types = (Vector<int> *)res->fetch (0);
	  ipc_log ("  -- returned %lld-vector [ %lld-vectors]\n",
		   VSIZE (res), VSIZE (indxo_types));
	}
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getCustomIndxObjects"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetCustomIndxObjects (arg1);
#ifdef IPC_LOG
      if (res == NULL)
	ipc_log ("  -- returned NULL\n");
      else
	{
	  Vector<char *> *indxo_names = (Vector<char *> *)res->fetch (0);
	  ipc_log ("  -- returned %lld-vector [ %lld-vectors]\n",
		   VSIZE (res), VSIZE (indxo_names));
	}
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "defineIndxObj"))
    {
      String arg1 = readString (req);
      String arg2 = readString (req);
      String arg3 = readString (req);
      String arg4 = readString (req);
      ipc_log ("  args = %s, %s, %s, %s\n", arg1, arg2, arg3 == NULL ? "NULL" : arg3, arg4 == NULL ? "NULL" : arg4);
      String sts = dbeDefineIndxObj (arg1, arg2, arg3, arg4);
      ipc_log ("  returns '%s'\n", sts ? sts : "NULL");
      writeString (sts, req);
      free (arg1);
      free (arg2);
      free (arg3);
      free (arg4);
    }
  else if (!strcmp (inp, "setSelObj"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      int arg3 = readInt (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, %ld, %s, %d\n", arg1, (long) arg2, table_name (arg3), arg4);
      dbeSetSelObj (arg1, arg2, arg3, arg4);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "setSelObjV2"))
    {
      int arg1 = readInt (req);
      uint64_t arg2 = readLong (req);
      ipc_log ("  args = %d, %lld\n", arg1, (long long) arg2);
      dbeSetSelObjV2 (arg1, arg2);
      writeString (NULL, req);
    }
  else if (!strcmp (inp, "getSelObj"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %s, %d\n", arg1, table_name (arg2), arg3);
      Obj i = dbeGetSelObj (arg1, arg2, arg3);
      ipc_log ("  returns = %ld (0x%08lx)\n", (long) i, (long) i);
      writeObject (i, req);
    }
  else if (!strcmp (inp, "getSelObjV2"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      ipc_log ("  arg1 = %d  agr2 = %s\n", arg1, arg2 ? arg2 : "NULL");
      Obj res = dbeGetSelObjV2 (arg1, arg2);
      ipc_log ("  returns = %lld\n", (long long) res);
      writeObject (res, req);
      free (arg2);
    }
  else if (!strcmp (inp, "getSelObjIO"))
    {
      int arg1 = readInt (req);
      uint64_t arg2 = readLong (req);
      int arg3 = readInt (req);
      ipc_log ("  arg1 = %d, arg2 = %lld, arg3 = %d\n", arg1, (long long) arg2, arg3);
      Vector<uint64_t> *res = dbeGetSelObjIO (arg1, arg2, arg3);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getSelObjsIO"))
    {
      int arg1 = readInt (req);
      Vector<uint64_t> *arg2 = (Vector<uint64_t>*)readArray (req);
      int arg3 = readInt (req);
      ipc_log ("  arg1 = %d, arg2 size = %lld, arg3 = %d\n",
	       arg1, VSIZE (arg2), arg3);
      Vector<uint64_t> *res = dbeGetSelObjsIO (arg1, arg2, arg3);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getSelObjHeapTimestamp"))
    {
      int arg1 = readInt (req);
      uint64_t arg2 = readLong (req);
      ipc_log ("  arg1 = %d, arg2 = %llu\n", arg1, (unsigned long long) arg2);
      uint64_t st = dbeGetSelObjHeapTimestamp (arg1, arg2);
      ipc_log ("  returns = %llu\n", (unsigned long long) st);
      writeLong (st, req);
    }
  else if (!strcmp (inp, "getSelObjHeapUserExpId"))
    {
      int arg1 = readInt (req);
      uint64_t arg2 = readLong (req);
      ipc_log ("  arg1 = %d, arg2 = %llu\n", arg1, (unsigned long long) arg2);
      int userExpId = dbeGetSelObjHeapUserExpId (arg1, arg2);
      ipc_log ("  returns = %d\n", userExpId);
      writeInt (userExpId, req);
    }
  else if (!strcmp (inp, "getSelIndex"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      int arg3 = readInt (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, 0x%08lx, %s, %d\n", arg1, (long) arg2, table_name (arg3), arg4);
      int i = dbeGetSelIndex (arg1, arg2, arg3, arg4);
      ipc_log ("  returns = %d\n", i);
      writeInt (i, req);
    }
  else if (!strcmp (inp, "printData"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      String arg4 = readString (req);
      String arg5 = readString (req);
      ipc_log ("  args = %d, %s, %d, `%s', `%s'\n",
	       arg1, table_name (arg2), arg3,
	       (arg4 == NULL ? "NULL" : arg4),
	       (arg5 == NULL ? "NULL" : arg5));
      String res = dbePrintData (arg1, arg2, arg3, arg4, arg5, NULL);
      writeString (res, req);
      free (arg4);
      free (arg5);
      free (res);
    }
  else if (!strcmp (inp, "getPrintLimit"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      int i = dbeGetPrintLimit (arg1);
      ipc_log ("  returns = %d\n", i);
      writeInt (i, req);
    }
  else if (!strcmp (inp, "setPrintLimit"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  args = %d, %d\n", arg1, arg2);
      String res = dbeSetPrintLimit (arg1, arg2);
      writeString (res, req);
      free (res);
    }
  else if (!strcmp (inp, "getPrintMode"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      int i = dbeGetPrintMode (arg1);
      ipc_log ("  returns = %d\n", i);
      writeInt (i, req);
    }
  else if (!strcmp (inp, "setPrintMode"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      ipc_log ("  args = %d, %s\n", arg1, arg2);
      String res = dbeSetPrintMode (arg1, arg2);
      writeString (res, req);
      free (arg2);
      free (res);
    }
  else if (!strcmp (inp, "getPrintDelim"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      char i = dbeGetPrintDelim (arg1);
      ipc_log ("  returns = %c\n", i);
      writeInt ((int) i, req);
    }
  else if (!strcmp (inp, "getHotMarks"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  args = %d, %s (%d) \n", arg1, table_name (arg2), arg2);
      Vector<void*> *res = dbeGetHotMarks (arg1, arg2);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getHotMarksInc"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      ipc_log ("  args = %d, %s (%d) \n", arg1, table_name (arg2), arg2);
      Vector<void*> *res = dbeGetHotMarksInc (arg1, arg2);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getSummaryHotMarks"))
    {
      int arg1 = readInt (req);
      Vector<Obj> *arg2 = (Vector<Obj>*)readArray (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, 0x%llx, %s (%d)\n", arg1, (long long) arg2, table_name (arg3), arg3);
      Vector<void*> *res = dbeGetSummaryHotMarks (arg1, arg2, arg3);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncId"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, %s, %d, %d\n", arg1, table_name (arg2), arg3, arg4);
      Vector<uint64_t> *res = dbeGetFuncId (arg1, arg2, arg3, arg4);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getFuncCalleeInfo"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      Vector<int> *arg3 = (Vector<int>*)readArray (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, %s, %lld, %d\n", arg1, table_name (arg2), VSIZE (arg3), arg4);
      Vector<void*> *res = dbeGetFuncCalleeInfo (arg1, arg2, arg3, arg4);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncCallerInfo"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      Vector<int> *arg3 = (Vector<int>*)readArray (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, %s, %lld, %d\n", arg1, table_name (arg2), VSIZE (arg3), arg4);
      Vector<void*> *res = dbeGetFuncCallerInfo (arg1, arg2, arg3, arg4);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setFuncData"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      int arg3 = readInt (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, %ld, %s, %d\n", arg1, (long) arg2, table_name (arg3), arg4);
      int i = dbeSetFuncData (arg1, arg2, arg3, arg4);
      ipc_log ("  returns = %d\n", i);
      writeInt (i, req);
    }
  else if (!strcmp (inp, "setFuncDataV2"))
    {
      int dbevindex = readInt (req);
      Obj sel_obj = readObject (req);
      int type = readInt (req);
      int subtype = readInt (req);
      Vector<long long> *longs = new Vector<long long>(2);
      Vector<char *> *strings = new Vector<char *>(2);

      longs->append (dbeSetFuncData (dbevindex, sel_obj, type, subtype));
      strings->append (dbeGetMsg (dbevindex, ERROR_MSG));
      String sf_name = NULL;
      long long sf_id = 0;
      switch (type)
	{
	case DSP_SOURCE:
	case DSP_DISASM:
	  {
	    Histable *obj = (Histable *) sel_obj;
	    if (obj)
	      {
		Histable *sf = obj->convertto (Histable::SOURCEFILE);
		if (sf)
		  {
		    sf_id = sf->id;
		    sf_name = dbe_strdup (sf->get_name ());
		  }
	      }
	    break;
	  }
	}
      longs->append (sf_id);
      strings->append (sf_name);
      ipc_log ("  setFuncData(%d, %ld, %s, %d)  returns (%lld, %lld)\n   (%s, %s)\n",
	       dbevindex, (long) sel_obj, table_name (type), subtype, longs->get (0), longs->get (1),
	       STR (strings->get (0)), STR (strings->get (1)));

      Vector<void *> *res = new Vector<void *>(2);
      res->append (longs);
      res->append (strings);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncList"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %s, %d\n", arg1, table_name (arg2), arg3);
      Vector<void*> *res = dbeGetFuncList (arg1, arg2, arg3);
#ifdef IPC_LOG
      if (res != NULL)
	ipc_log ("  returns = %lld objects, length = %lld\n",
		 VSIZE (res), VSIZE ((Vector<int>*)res->fetch (0)));
      else
	ipc_log ("  returns NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncListV2"))
    {
      int dbevindex = readInt (req);
      int mtype = readInt (req);
      Obj sel_obj = readObject (req);
      int type = readInt (req);
      int subtype = readInt (req);
      Vector<void*> *res = dbeGetFuncListV2 (dbevindex, mtype, sel_obj, type, subtype);
      ipc_log ("  args = %d 0x%x %ld, %s, %d returns = %d objects, length = %d\n",
	       dbevindex, mtype, (long) sel_obj, table_name (type), subtype,
	       (int) (res ? res->size () : 0),
	       (int) (res ? ((Vector<int>*)res->fetch (0))->size () : 0));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncListMini"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %s, %d\n", arg1, table_name (arg2), arg3);
      Vector<void*> *res = dbeGetFuncListMini (arg1, arg2, arg3);
#ifdef IPC_LOG
      if (res != NULL)
	ipc_log ("  returns = %lld objects, length = %lld\n",
		 VSIZE (res), VSIZE ((Vector<int>*)res->fetch (0)));
      else
	ipc_log ("  returns NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "dbeGetTotals"))
    {
      int dbevindex = readInt (req);
      int dsptype = readInt (req);
      int subtype = readInt (req);
      Vector<void *> *res = dbeGetTotals (dbevindex, dsptype, subtype);
      ipc_log ("  dbeGetTotals(%d, %d, %d) returns %lld objects\n",
	       dbevindex, dsptype, subtype, VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getComparableObjsV2"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      int arg3 = readInt (req);
      Vector<Obj> *res = dbeGetComparableObjsV2 (arg1, arg2, arg3);
      ipc_log ("  args = %d 0x%lx %d\n", arg1, (long) arg2, arg3);
      ipc_dump ("getComparableObjsV2:res", res);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "dbeConvertSelObj"))
    {
      Obj obj = readObject (req);
      int type = readInt (req);
      Obj res = dbeConvertSelObj (obj, type);
      ipc_log ("  args = %lld %d res=%lld \n", (long long) obj, type,
	       (long long) res);
      writeObject (res, req);
    }
  else if (!strcmp (inp, "getTableDataV2"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      String arg3 = readString (req);
      String arg4 = readString (req);
      String arg5 = readString (req);
      Vector<uint64_t> *arg6 = (Vector<uint64_t>*)readArray (req);
      ipc_log ("  args = %d, %s, %s, %s, %s, %lld\n", arg1, STR (arg2),
	       STR (arg3), STR (arg4), STR (arg5), VSIZE (arg6));
      Vector<void*> *res = dbeGetTableDataV2 (arg1, arg2, arg3, arg4, arg5, arg6);
#ifdef IPC_LOG
      if (res != NULL)
	ipc_log ("  returns = %lld objects, length = %lld\n",
		 VSIZE (res), VSIZE ((Vector<int>*)res->fetch (0)));
      else
	ipc_log ("  returns NULL\n");
#endif
      writeArray (res, req);
      //destroy( arg6 );
      destroy (res);
    }
  else if (!strcmp (inp, "getCallTreeNumLevels"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      int res = dbeGetCallTreeNumLevels (arg1);
#ifdef IPC_LOG
      ipc_log ("  returns = %d\n", res);
#endif
      writeInt (res, req);
    }
  else if (!strcmp (inp, "getCallTreeLevel"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %s, %d\n", arg1, arg2, arg3);
      Vector<void*> *res = dbeGetCallTreeLevel (arg1, arg2, arg3);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getCallTreeChildren"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      Vector<int> *arg3 = (Vector<int> *) readArray (req); /*NodeIdx array*/
      ipc_log ("  args = %d, %s, vec_size=%lld\n", arg1, arg2, (long long) (arg3 ? arg3->size () : 0));
      Vector<void*> *res = dbeGetCallTreeChildren (arg1, arg2, arg3);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getCallTreeLevels"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      ipc_log ("  args = %d, %s\n", arg1, arg2);
      Vector<void*> *res = dbeGetCallTreeLevels (arg1, arg2);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getCallTreeLevelFuncs"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %d, %d\n", arg1, arg2, arg3);
      Vector<void*> *res = dbeGetCallTreeLevelFuncs (arg1, arg2, arg3);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getCallTreeFuncs"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetCallTreeFuncs (arg1);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getGroupIds"))
    {
      int arg1 = readInt (req);
      Vector<int> *res = dbeGetGroupIds (arg1);
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getNames"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      Obj arg3 = readObject (req);
#ifdef IPC_LOG
      ipc_log ("  args = %d, %s 0x%lx\n", arg1, table_name (arg2), (long) arg3);
#endif
      Vector<String> *res = dbeGetNames (arg1, arg2, arg3);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getTotalMax"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %s, %d\n", arg1, table_name (arg2), arg3);
      Vector<void*> *res = dbeGetTotalMax (arg1, arg2, arg3);
#ifdef IPC_LOG
      if (res != NULL)
	ipc_log ("  returns = %lld vectors, length %lld\n",
		 VSIZE (res), VSIZE ((Vector<void*>*)res->fetch (0)));
      else
	ipc_log ("  returns NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "composeFilterClause"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      Vector<int> *arg4 = (Vector<int>*)readArray (req);
      ipc_log ("  args = %d, %s, %d, %lld selections\n",
	       arg1, table_name (arg2), arg3, VSIZE (arg4));
      String s = dbeComposeFilterClause (arg1, arg2, arg3, arg4);
      ipc_log ("  returns %s\n", (s == NULL ? "<NULL>" : s));
      writeString (s, req);
    }
  else if (!strcmp (inp, "getStatisOverviewList"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<Object> *res = dbeGetStatisOverviewList (arg1);
      ipc_log ("  dbeStatisGetOverviewList returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getStatisList"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<Object> *res = dbeGetStatisList (arg1);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getSummary"))
    {
      int arg1 = readInt (req);
      Vector<Obj> *arg2 = (Vector<Obj>*)readArray (req);
      int arg3 = readInt (req);
      int arg4 = readInt (req);
      ipc_log ("  args = %d, 0x%llx, %s (%d), %d\n", arg1, (long long) arg2, table_name (arg3), arg3, arg4);
      Vector<Object> *res = dbeGetSummary (arg1, arg2, arg3, arg4);
      ipc_log ("  dbeGetSummary returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getSummaryV2"))
    {
      int dbevindex = readInt (req);
      Vector<Obj> *sel_objs = (Vector<Obj>*)readArray (req);
      int type = readInt (req);
      int subtype = readInt (req);
      Vector<void*> *res = dbeGetSummaryV2 (dbevindex, sel_objs, type, subtype);
      ipc_log ("  args = %d, [%lld], %s (%d), %d res=[%lld] 0x%llx \n",
	       dbevindex, VSIZE (sel_objs), table_name (type), type, subtype,
	       VSIZE (res), (unsigned long long) res);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getExpName1"))
    {
      // XXX add an argument = DbeView index
      String arg1 = readString (req);
      ipc_log ("  arg = `%s'\n", arg1 ? arg1 : "NULL");
      String res = dbeGetExpName (0, arg1);
      writeString (res, req);
      ipc_log ("  returns `%s'\n", res ? res : "NULL");
      free (arg1);
      free (res);
    }
  else if (!strcmp (inp, "getHwcHelp"))
    {
      // XXX add an argument = DbeView index
      bool forKernel = readBoolean (req);
      Vector<String> *res = dbeGetHwcHelp (0, forKernel);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getHwcSets"))
    {
      // XXX add an argument = DbeView index
      bool forKernel = readBoolean (req);
      Vector<Vector<char*>*> *res = dbeGetHwcSets (0, forKernel);
      writeArray (res, req);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getHwcsAll"))
    {
      // XXX add an argument = DbeView index
      bool forKernel = readBoolean (req);
      Vector<void*> *res = dbeGetHwcsAll (0, forKernel);
      writeArray (res, req);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getHwcAttrList"))
    {
      // XXX add an argument = DbeView index
      bool forKernel = readBoolean (req);
      Vector<char*> *res = dbeGetHwcAttrList (0, forKernel);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getHwcMaxConcurrent"))
    {
      // XXX add an argument = DbeView index
      bool forKernel = readBoolean (req);
      int res = dbeGetHwcMaxConcurrent (0, forKernel);
      writeInt (res, req);
    }
  else if (!strcmp (inp, "getIfreqData"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<char*> *res = dbeGetIfreqData (arg1);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getNewLeakListInfo"))
    {
      int arg1 = readInt (req);
      bool arg2 = readBoolean (req);
      ipc_log ("  args = %d, %d\n", arg1, arg2);
      Vector<void*> *res = dbeGetLeakListInfo (arg1, arg2);
      ipc_log ("  returns %lld void*'s\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getObject"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      Obj arg3 = readObject (req);
      Obj i = dbeGetObject (arg1, arg2, arg3);
      writeObject (i, req);
    }
  else if (!strcmp (inp, "getExpVerboseName"))
    {
      Vector<int> *arg = (Vector<int>*)readArray (req);
      ipc_log ("  expIds = %lld\n", VSIZE (arg));
      Vector<String> *res = dbeGetExpVerboseName (arg);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getName"))
    {
      // XXX add an argument = DbeView index
      int arg1 = readInt (req);
      String res = dbeGetName (0, arg1);
      writeString (res, req);
      free (res);
    }
  else if (!strcmp (inp, "getStartTime"))
    {
      // XXX add an argument = DbeView index
      int arg1 = readInt (req);
      long long l = dbeGetStartTime (0, arg1);
      ipc_log ("  returns = %llu\n", l);
      writeLong (l, req);
    }
  else if (!strcmp (inp, "getRelativeStartTime"))
    {
      // XXX add an argument = DbeView index
      int arg1 = readInt (req);
      long long l = dbeGetRelativeStartTime (0, arg1);
      ipc_log ("  returns = %llu\n", l);
      writeLong (l, req);
    }
  else if (!strcmp (inp, "getEndTime"))
    {
      // XXX add an argument = DbeView index
      int arg1 = readInt (req);
      long long l = dbeGetEndTime (0, arg1);
      ipc_log ("  returns = %llu\n", l);
      writeLong (l, req);
    }
  else if (!strcmp (inp, "getClock"))
    {
      // XXX add an argument = DbeView index
      int arg1 = readInt (req);
      int i = dbeGetClock (0, arg1);
      writeInt (i, req);
    }
    /*
	    else if ( !strcmp( inp, "getFounderExpId" ) ) {
		    // XXX add an argument = DbeView index
		int       arg1 = readInt(req);
		int i = dbeGetFounderExpId(0, arg1 );
		writeInt( i, req );
	    }
     */
  else if (!strcmp (inp, "getEntityProps"))
    {
      int arg1 = readInt (req);
      ipc_log ("  args = %d\n", arg1);
      Vector<void*> *res = dbeGetEntityProps (arg1);
      writeArray (res, req);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getEntities"))
    {
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %d, %d\n", arg1, arg2, arg3);
      Vector<void*> *res = dbeGetEntities (arg1, arg2, arg3);
      writeArray (res, req);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getEntitiesV2"))
    {
      int arg1 = readInt (req);
      Vector<int> *arg2 = (Vector<int>*)readArray (req);
      int arg3 = readInt (req);
      ipc_log ("  args = %d, %lld, %d\n", arg1, VSIZE (arg2), arg3);
      Vector<void*> *res = dbeGetEntitiesV2 (arg1, arg2, arg3);
      writeArray (res, req);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getTLDetails"))
    {//TBR
      int arg1 = readInt (req);
      int arg2 = readInt (req);
      int arg3 = readInt (req);
      int arg4 = readInt (req);
      long long arg5 = readLong (req);
      ipc_log (" dbevindex= %d, exp_id = %d, data_id = %d, "
	       "entity_prop_id = %d, event_id = %lld\n",
	       arg1, arg2, arg3, arg4, arg5);
      Vector<void*> *res = dbeGetTLDetails (arg1, arg2, arg3, arg4, arg5);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getStackNames"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      ipc_log ("  args = %d, %ld\n", arg1, (long) arg2);
      Vector<String> *res = dbeGetStackNames (arg1, arg2);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getStackFunctions"))
    {
      // XXX add an argument = DbeView index
      Obj arg1 = readObject (req);
      ipc_log ("  args = %ld\n", (long) arg1);
      Vector<Obj> *res = dbeGetStackFunctions (0, arg1);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getStacksFunctions"))
    {
      // XXX add an argument = DbeView index
      Vector<Obj> *arg1 = (Vector<Obj>*)readArray (req);
      ipc_log ("  argc = %ld\n", (long) arg1->size ());
      Vector<void*> *res = dbeGetStacksFunctions (0, arg1);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getStackPCs"))
    {
      // XXX add an argument = DbeView index
      Obj arg1 = readObject (req);
      ipc_log ("  args = %ld\n", (long) arg1);
      Vector<Obj> *res = dbeGetStackPCs (0, arg1);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      delete res;
    }
  else if (!strcmp (inp, "getIOStatistics"))
    {
      int dbevindex = readInt (req);
      Vector<Vector<char*>*> *res = dbeGetIOStatistics (dbevindex);
      writeArray (res, req);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getHeapStatistics"))
    {
      int dbevindex = readInt (req);
      Vector<Vector<char*>*> *res = dbeGetHeapStatistics (dbevindex);
      writeArray (res, req);
      ipc_log ("  returns %lld char*'s\n", VSIZE (res));
      destroy (res);
    }
  else if (!strcmp (inp, "getSamples"))
    {
      int dbev_id = readInt (req);
      int exp_id = readInt (req);
      int64_t lo = readLong (req);
      int64_t hi = readLong (req);
      ipc_log ("  dbevindex= %d, exp_id = %d, lo_idx:%lld, hi_idx:%lld\n",
	       dbev_id, exp_id, (long long) lo, (long long) hi);
      Vector<void*> *res = dbeGetSamples (dbev_id, exp_id, lo, hi);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getGCEvents"))
    {
      int dbev_id = readInt (req);
      int exp_id = readInt (req);
      int64_t lo = readLong (req);
      int64_t hi = readLong (req);
      ipc_log ("  dbevindex= %d, exp_id = %d, lo_idx:%lld, hi_idx:%lld\n",
	       dbev_id, exp_id, (long long) lo, (long long) hi);
      Vector<void*> *res = dbeGetGCEvents (dbev_id, exp_id, lo, hi);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncNames"))
    {
      int arg1 = readInt (req);
      Vector<Obj> *arg2 = (Vector<Obj>*)readArray (req);
      ipc_log ("  arg1 = %d, arg2 absent, size = %lld\n", arg1, VSIZE (arg2));
      Vector<String> *res = dbeGetFuncNames (arg1, arg2);
      writeArray (res, req);
      delete arg2;
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncIds"))
    {
      int arg1 = readInt (req);
      Vector<Obj> *arg2 = (Vector<Obj>*)readArray (req);
      ipc_log ("  arg1 = %d, arg2 absent, size = %lld\n", arg1, VSIZE (arg2));
      Vector<uint64_t> *res = dbeGetFuncIds (arg1, arg2);
      writeArray (res, req);
      delete arg2;
      destroy (res);
    }
  else if (!strcmp (inp, "getObjNamesV2"))
    {
      int arg1 = readInt (req);
      Vector<uint64_t> *arg2 = (Vector<uint64_t>*)readArray (req);
      ipc_log ("  arg1 = %d, arg2 absent, size = %lld\n", arg1, VSIZE (arg2));
      Vector<String> *res = dbeGetObjNamesV2 (arg1, arg2);
      writeArray (res, req);
      delete arg2;
      destroy (res);
    }
  else if (!strcmp (inp, "getFuncName"))
    {
      int arg1 = readInt (req);
      Obj arg2 = readObject (req);
      ipc_log ("  arg1 = %d, arg2 = %lld\n", arg1, (long long) arg2);
      String res = dbeGetFuncName (arg1, arg2);
      ipc_log ("  returning = %s\n", res ? res : "NULL");
      writeString (res, req);
      free (res);
    }
  else if (!strcmp (inp, "getObjNameV2"))
    {
      int arg1 = readInt (req);
      uint64_t arg2 = readLong (req);
      ipc_log ("  arg1 = %d, arg2 = %llu\n", arg1, (unsigned long long) arg2);
      String res = dbeGetObjNameV2 (arg1, arg2);
      ipc_log ("  returning = %s\n", res ? res : "NULL");
      writeString (res, req);
      free (res);
    }
  else if (!strcmp (inp, "getDataspaceTypeDesc"))
    {
      // XXX add an argument = DbeView index
      Obj arg1 = readObject (req);
      ipc_log ("  arg1 absent, index = %ld\n", (long) arg1);
      String res = dbeGetDataspaceTypeDesc (0, arg1);
      ipc_log ("  returning = %s\n", res ? res : "NULL");
      writeString (res, req);
      free (res);
    }
    /*
     *   New Interface with Timeline
     */
#if 0 //YXXX TBR
  else if (!strcmp (inp, "dbeInit"))
    dbeInit ();
  else if (!strcmp (inp, "getDefaultExperimentName"))
    {
      String res = dbeGetDefaultExperimentName ();
      ipc_log ("  returning = %s\n", res);
      writeString (res);
      free (res);
    }
  else if (!strcmp (inp, "getExperimentState"))
    {
      String res = dbeGetExperimentState ();
      ipc_log ("  returning = %s\n", res);
      writeString (res);
      free (res);
    }
  else if (!strcmp (inp, "getExpStartTime"))
    {
      long long l = dbeGetExpStartTime ();
      ipc_log ("  returns = %llu\n", l);
      writeLong (l);
    }
  else if (!strcmp (inp, "getExpEndTime"))
    {
      long long l = dbeGetExpEndTime ();
      ipc_log ("  returns = %llu\n", l);
      writeLong (l);
    }
#endif
  else if (!strcmp (inp, "getDataDescriptorsV2"))
    {//TBR? TBD
      int exp_id = readInt (req);
      ipc_log (" exp_id = %d\n", exp_id);
      Vector<void*> *res = dbeGetDataDescriptorsV2 (exp_id);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getDataPropertiesV2"))
    {//TBR? TBD
      int exp_id = readInt (req);
      int arg2 = readInt (req);
      ipc_log (" exp_id = %d, data_idx = %d\n", exp_id, arg2);
      Vector<void*> *res = dbeGetDataPropertiesV2 (exp_id, arg2);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getExperimentTimeInfo"))
    {
      Vector<int> *exp_ids = (Vector<int>*)readArray (req);
      ipc_log ("  cnt = %lld\n", VSIZE (exp_ids));
      Vector<void*> *res = dbeGetExperimentTimeInfo (exp_ids);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getExperimentDataDescriptors"))
    {
      Vector<int> *exp_ids = (Vector<int>*)readArray (req);
      ipc_log ("  cnt = %lld\n", VSIZE (exp_ids));
      Vector<void*> *res = dbeGetExperimentDataDescriptors (exp_ids);
      ipc_log ("  returns = %lld objects\n", VSIZE (res));
      writeArray (res, req);
      destroy (res);
    }
#if 0 //YXXX TBR?
  else if (!strcmp (inp, "getExprValues"))
    {//TBR? TBD
      int arg1 = readInt ();
      String arg2 = readString ();
      ipc_log ("  data_idx = %d expr = %s\n", arg1, arg2 ? arg2 : "NULL");
      Vector<long long> *res = dbeGetExprValues (arg1, arg2);
      ipc_log ("  returns = %d objects\n", res ? res->size () : 0);
      writeArray (res);
      delete res;
      free (arg2);
    }
#endif
  else if (!strcmp (inp, "hasTLData"))
    {
      int dbevindex = readInt (req);
      Vector<int> *exp_ids = (Vector<int>*)readArray (req);
      Vector<int> *data_ids = (Vector<int>*)readArray (req);
      Vector<int> *eprop_ids = (Vector<int>*)readArray (req);
      Vector<int> *eprop_vals = (Vector<int>*)readArray (req);
      Vector<int> *auxs = (Vector<int>*)readArray (req);
      ipc_log ("  dbev_id = %d, cnt = %lld\n", dbevindex, VSIZE (exp_ids));
      Vector<bool> *res = dbeHasTLData (dbevindex,
					exp_ids, data_ids, eprop_ids, eprop_vals, auxs);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getTLData"))
    {
      int dbevindex = readInt (req);
      int exp_id = readInt (req);
      int tldata_type = readInt (req);
      int entity_prop_id = readInt (req);
      int entity_prop_val = readInt (req);
      int aux = readInt (req);
      long long arg5 = readLong (req);
      long long arg6 = readLong (req);
      int arg7 = readInt (req);
      bool getReps = readBoolean (req);
      Vector<String> *secondaryProps = (Vector<String>*)readArray (req);

      ipc_log ("  args = %d:%d; tldata_type=%d entity_prop_id=%d ent=%d aux=%d"
	       "\n    tstart=%lld delta=%lld ndeltas=%d getReps=%d nProps=%lld\n",
	       dbevindex, exp_id,
	       tldata_type, entity_prop_id, entity_prop_val, aux,
	       arg5, arg6, arg7, (int) getReps, VSIZE (secondaryProps));
      Vector<void*> *res = dbeGetTLData (dbevindex, exp_id,
					 tldata_type, entity_prop_id, entity_prop_val, aux,
					 arg5, arg6, arg7, getReps, secondaryProps);
#ifdef IPC_LOG
      if (res)
	{
	  Vector<Obj> *reps = (Vector<Obj>*)res->fetch (0);
	  Vector<Obj> *props = (Vector<Obj>*)res->fetch (1);
	  if (reps)
	    {
	      Vector <long long> *fids = (Vector <long long> *)reps->fetch (2);
	      int sz = fids ? fids->size () : 0;
	      ipc_log ("  returning TL reps (dDscrs); nreps=%d:", sz);
	      int i;
	      for (i = 0; i < sz && i < 7; i++)
		ipc_log (" %lld", fids->fetch (i));
	      if (i < sz)
		ipc_log (" ... %lld", fids->fetch (sz - 1));
	      ipc_log ("\n");
	    }
	  if (props)
	    {
	      int nprops = props->size ();
	      ipc_log ("  returning values for %d properties:\n", nprops);
	      assert (secondaryProps->size () == nprops);
	    }
	}
      else
	ipc_log ("  returning NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
      destroy (secondaryProps);
    }
  else if (!strcmp (inp, "getTLEventCenterTime"))
    {
      int dbevindex = readInt (req);
      int exp_id = readInt (req);
      int tldata_type = readInt (req);
      int entity_prop_id = readInt (req);
      int entity_prop_val = readInt (req);
      int aux = readInt (req);
      long long event_id = readLong (req);
      long long move_count = readLong (req);
      ipc_log ("  args = %d:%d; tldata_type = %d entity_prop_id = %d "
	       "ent = %d aux = %d idx = %lld move=%lld\n",
	       dbevindex, exp_id,
	       tldata_type, entity_prop_id, entity_prop_val, aux, event_id, move_count);
      Vector<long long> * res = dbeGetTLEventCenterTime (dbevindex, exp_id,
							 tldata_type, entity_prop_id, entity_prop_val, aux, event_id, move_count);
      ipc_log ("  returning  idx = %lld, time = %lld\n",
	       res ? res->fetch (0) : -1, res ? res->fetch (1) : -1);
      writeArray (res, req);
    }
  else if (!strcmp (inp, "getTLEventIdxNearTime"))
    {
      int dbevindex = readInt (req);
      int exp_id = readInt (req);
      int tldata_type = readInt (req);
      int entity_prop_id = readInt (req);
      int entity_prop_val = readInt (req);
      int aux = readInt (req);
      int searchDirection = readInt (req);
      long long value = readLong (req);
      ipc_log ("  args = %d:%d; tldata_type = %d entity_prop_id = %d "
	       "ent = %d aux = %d direction = %d value = %lld(0x%llx)\n",
	       dbevindex, exp_id,
	       tldata_type, entity_prop_id, entity_prop_val, aux,
	       searchDirection, value, value);
      long long res = dbeGetTLEventIdxNearTime (dbevindex, exp_id,
						tldata_type, entity_prop_id, entity_prop_val, aux,
						searchDirection, value);
      ipc_log ("  returning = %lld\n", res);
      writeLong (res, req);
    }
  else if (!strcmp (inp, "getAggregatedValue"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      String arg3 = readString (req);
      String arg4 = readString (req);
      long long arg5 = readLong (req);
      long long arg6 = readLong (req);
      int arg7 = readInt (req);
      String arg8 = readString (req);
      String arg9 = readString (req);
      ipc_log ("  data_idx = %d lfilter = \"%s\" fexpr = \"%s\" "
	       "time = \"%s\" tstart = %lld delta = %lld "
	       "num = %d key = \"%s\" aggr = \"%s\"\n",
	       arg1, arg2 ? arg2 : "NULL", arg3 ? arg3 : "NULL",
	       arg4 ? arg4 : "NULL", arg5, arg6,
	       arg7, arg8 ? arg8 : "NULL", arg9 ? arg9 : "NULL");
      Vector<long long> *res = dbeGetAggregatedValue (arg1, arg2, arg3,
						      arg4, arg5, arg6, arg7, arg8, arg9);
#ifdef IPC_LOG
      if (res)
	{
	  int sz = res->size ();
	  ipc_log ("  returning = %d values:", sz);
	  if (sz > 10)
	    sz = 10;
	  for (int i = 0; i < sz; i++)
	    ipc_log (" %lld", res->fetch (i));
	  ipc_log ("\n");
	}
      else
	ipc_log ("  returning NULL\n");
#endif
      writeArray (res, req);
      delete res;
      free (arg2);
      free (arg3);
      free (arg4);
      free (arg8);
      free (arg9);
    }
#if 0//YXXX TBR
  else if (!strcmp (inp, "getExprValue"))
    {
      int exp_id = readInt ();
      int arg1 = readInt ();
      int arg2 = readInt ();
      String arg3 = readString ();
      ipc_log ("  exp_id %d, data_id = %d, event_id = %d, expr = %s\n",
	       exp_id, arg1, arg2, arg3 ? arg3 : "NULL");
      String res = dbeGetExprValue (exp_id, arg1, arg2, arg3);
      ipc_log ("  returning = %s\n", res ? res : "");
      writeString (res);
      free (res);
      free (arg3);
    }
  else if (!strcmp (inp, "getListValues"))
    {
      Obj arg1 = readObject ();
      ipc_log ("  stack = %lu\n", (long) arg1);
      Vector<Obj> *res = dbeGetListValues (arg1);
      ipc_log ("  returns = %d objects\n", res ? res->size () : 0);
      writeArray (res);
      destroy (res);
    }
  else if (!strcmp (inp, "getListNames"))
    {
      Obj arg1 = readObject ();
      ipc_log ("  stack = %lu\n", (long) arg1);
      Vector<String> *res = dbeGetListNames (arg1);
      ipc_log ("  returns = %d objects\n", res ? res->size () : 0);
      writeArray (res);
      destroy (res);
    }
#endif
  else if (!strcmp (inp, "getLineInfo"))
    {
      Obj arg1 = readObject (req);
      ipc_log ("  pc = %lu\n", (long) arg1);
      Vector<String> *res = dbeGetLineInfo (arg1);
      ipc_log ("  returning File name: '%s'\n", res ? res->fetch (0) : "");
      ipc_log ("  returning Lineno:    '%s'\n", res ? res->fetch (1) : "");
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "setAlias"))
    {
      String arg1 = readString (req);
      String arg2 = readString (req);
      String arg3 = readString (req);
      ipc_log ("  name=\"%s\" uname=\"%s\" expr=\"%s\"\n",
	       arg1 ? arg1 : "", arg2 ? arg2 : "", arg3 ? arg3 : "");
      int res = dbeSetAlias (arg1, arg2, arg3);
      ipc_log ("  returning = %d\n", res);
      writeInt (res, req);
    }
  else if (!strcmp (inp, "getAlias"))
    {
      String arg1 = readString (req);
      ipc_log ("  name=\"%s\"\n", arg1 ? arg1 : "");
      Vector<char*> *res = dbeGetAlias (arg1);
      ipc_log ("  returning uname: '%s'\n", res && res->fetch (0) ? res->fetch (0) : "");
      ipc_log ("  returning expr:  '%s'\n", res && res->fetch (1) ? res->fetch (0) : "");
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getXYPlotData"))
    {
      int arg1 = readInt (req);
      String arg2 = readString (req);
      String arg3 = readString (req);
      String arg4 = readString (req);
      String arg5 = readString (req);
      String arg6 = readString (req);
      String arg7 = readString (req);
      String arg8 = readString (req);
      String arg9 = readString (req);
      ipc_log ("  data_idx = %d lfilter = \"%s\" arg = \"%s\" "
	       "func1 = \"%s\" aggr1 = \"%s\" "
	       "func2 = \"%s\" aggr2 = \"%s\" "
	       "func3 = \"%s\" aggr3 = \"%s\" \n",
	       arg1, arg2 ? arg2 : "NULL", arg3 ? arg3 : "NULL",
	       arg4 ? arg4 : "NULL", arg5 ? arg5 : "NULL", arg6 ? arg6 : "NULL",
	       arg7 ? arg7 : "NULL", arg8 ? arg8 : "NULL", arg9 ? arg9 : "NULL");
      Vector<Vector<long long>*> *res = dbeGetXYPlotData (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);

#ifdef IPC_LOG
      if (res)
	{
	  long nvals = res->size ();
	  for (long i = 0; i < nvals; ++i)
	    {
	      Vector<long long> *vals = res->fetch (i);
	      long long sz = VSIZE (vals);
	      ipc_log ("  returning = %lld values:", sz);
	      if (sz > 10)
		sz = 10;
	      for (long j = 0; j < sz; j++)
		ipc_log (" %lld", vals->fetch (j));
	      ipc_log ("\n");
	    }
	}
      else
	ipc_log ("  returning NULL\n");
#endif
      writeArray (res, req);
      destroy (res);
    }
  else if (strcmp (inp, "dbe_archive") == 0)
    {
      Vector<long long> *ids = (Vector<long long> *) readArray (req);
      Vector<const char*> *locations = (Vector<const char*> *) readArray (req);
      dbe_archive (ids, locations);
      delete ids;
      destroy (locations);
      writeResponseGeneric (RESPONSE_STATUS_SUCCESS, req->getRequestID (), req->getChannelID ());
    }
  else if (strcmp (inp, "dbeSetLocations") == 0)
    {
      Vector<const char*> *fnames = (Vector<const char*> *) readArray (req);
      Vector<const char*> *locations = (Vector<const char*> *) readArray (req);
      dbeSetLocations (fnames, locations);
      destroy (fnames);
      destroy (locations);
      writeResponseGeneric (RESPONSE_STATUS_SUCCESS, req->getRequestID (), req->getChannelID ());
    }
  else if (strcmp (inp, "dbeResolvedWith_setpath") == 0)
    {
      char *path = readString (req);
      Vector<void *> *res = dbeResolvedWith_setpath (path);
      free (path);
      writeArray (res, req);
      destroy (res);
    }
  else if (strcmp (inp, "dbeResolvedWith_pathmap") == 0)
    {
      char *old_prefix = readString (req);
      char *new_prefix = readString (req);
      Vector<void *> *res = dbeResolvedWith_pathmap (old_prefix, new_prefix);
      free (old_prefix);
      free (new_prefix);
      writeArray (res, req);
      destroy (res);
    }
  else if (!strcmp (inp, "getCollectorControlValue"))
    {
      /* int dbevindex =*/ readInt (req);
      char *control = readString (req);
      ipc_log ("  args = %s\n", control);
      char *ret = dbeGetCollectorControlValue (control);
      ipc_log ("  returning %s\n", STR (ret));
      writeString (ret, req);
    }
  else if (!strcmp (inp, "setCollectorControlValue"))
    {
      /* int dbevindex =*/ readInt (req);
      char *control = readString (req);
      char *value = readString (req);
#ifdef IPC_LOG
      ipc_log ("  args = %s %s\n", control, value);
#endif
      char *ret = dbeSetCollectorControlValue (control, value);
#ifdef IPC_LOG
      if (ret)
	ipc_log ("  returning %s\n", ret);
      else
	ipc_log ("  returning NULL\n");
#endif
      writeString (ret, req);
    }
  else if (!strcmp (inp, "unsetCollectorControlValue"))
    {
      /* int dbevindex =*/ readInt (req);
      char *control = readString (req);
      ipc_log ("  args = %s\n", control);
      char *ret = dbeUnsetCollectorControlValue (control);
      ipc_log ("  returning %s\n", STR (ret));
      writeString (ret, req);
    }
  else if (!strcmp (inp, "getSignalValue"))
    {
      String arg1 = readString (req);
      ipc_log ("  arg1=\"%s\"\n", arg1 ? arg1 : "");
      int res = dbeGetSignalValue (arg1);
      ipc_log ("  returning = %d\n", res);
      writeInt (res, req);
    }
  else if (!strcmp (inp, "sendSignal"))
    {
      long long p = readLong (req);
      int signum = readInt (req);
      ipc_log ("  args = %llu, %d\n", (long long) p, signum);
      char * ret = dbeSendSignal ((pid_t) p, signum);
#ifdef IPC_LOG
      if (ret)
	ipc_log ("  returning %s\n", ret);
      else
	ipc_log ("  returning NULL\n");
#endif
      writeString (ret, req);
    }
  else if (!strcmp (inp, "checkConnection"))
    {
      String arg1 = readString (req);
      ipc_log ("  arg = `%s'\n", arg1 ? arg1 : "NULL");
      String res = dbeCheckConnection (arg1);
      writeString (res, req);
      ipc_log ("  returns `%s'\n", res ? res : "NULL");
      free (arg1);
      free (res);
    }
  else if (!strcmp (inp, "QUIT"))
    {
#ifdef IPC_LOG
      ipc_log ("  %s\n", inp);
#endif
      exit (0);
    }
  else
    {
      char *s = dbe_sprintf ("Unrecognized request: \"%s\"", inp);
      ipc_log ("%s\n", s);
      writeError (s, req);
      free (s);
    }
  ipc_log ("  processing IPC command %s complete\n", inp);
  free (inp);
  fflush (stdout);
  if (req->getStatus () != CANCELLED_IMMEDIATE)
    // wake up the main working thread, let it take care of delete
    req->setStatus (COMPLETED);
  delete req;
  return 0;
}

void
check_env_args (int argc, char *argv[])
{
  int indx = 2; // Skip "-IPC"
  const char *MINUS_E = "-E";
  const char *SP_ER_PRINT_TRACE_LEVEL = "SP_ER_PRINT_TRACE_LEVEL";
  const char *SP_IPC_PROTOCOL = "SP_IPC_PROTOCOL";
  const char SEPARATOR = '=';
  char *cmd_env_var = NULL;
  while (argc - indx >= 2)
    {
      char *option = argv[indx++];
      if (!streq (option, MINUS_E))
	continue;
      cmd_env_var = argv[indx++];
      char *separator = strchr (cmd_env_var, SEPARATOR);
      if (!separator)
	// Unrecognized option. Fatal error?
	continue;
      char *cmd_env_var_val = separator + 1;
      if (!strncmp (cmd_env_var, SP_ER_PRINT_TRACE_LEVEL,
		    strlen (SP_ER_PRINT_TRACE_LEVEL)))
	{
	  if (streq (cmd_env_var_val, "1"))
	    ipc_trace_level = TRACE_LVL_1;
	  else if (streq (cmd_env_var_val, "2"))
	    ipc_trace_level = TRACE_LVL_2;
	  else if (streq (cmd_env_var_val, "3"))
	    ipc_trace_level = TRACE_LVL_3;
	  else if (streq (cmd_env_var_val, "4"))
	    ipc_trace_level = TRACE_LVL_4;
	  continue;
	}
      if (!strncmp (cmd_env_var, SP_IPC_PROTOCOL, strlen (SP_IPC_PROTOCOL)))
	{
	  if (streq (cmd_env_var_val, IPC_PROTOCOL_CURR))
	    // Only one protocol is currently supported
	    ipc_protocol = IPC_PROTOCOL_CURR;
	  else
	    ipc_protocol = IPC_PROTOCOL_UNKNOWN;
	  continue;
	}
      // Unrecognized option. Fatal error?
    }
}

void
print_ipc_protocol_confirmation ()
{
  if (NULL != ipc_protocol)
    {
      fprintf (stdout, "ER_IPC: %s\n", ipc_protocol);
      fflush (stdout);
    }
}

void
ipc_mainLoop (int argc, char *argv[])
{
  if (getenv ("GPROFNG_DBE_DELAY"))
    sleep (20);
#ifdef IPC_LOG
  ipc_flags = 1;
#endif
  // check_env_args(argc, argv);

  char *er_print_trace_level = getenv ("SP_ER_PRINT_TRACE_LEVEL");
  if (er_print_trace_level != NULL)
    {
      if (streq (er_print_trace_level, "1"))
	ipc_trace_level = TRACE_LVL_1;
      else if (streq (er_print_trace_level, "2"))
	ipc_trace_level = TRACE_LVL_2;
      else if (streq (er_print_trace_level, "3"))
	ipc_trace_level = TRACE_LVL_3;
      else if (streq (er_print_trace_level, "4"))
	ipc_trace_level = TRACE_LVL_4;
    }
  check_env_args (argc, argv);
  print_ipc_protocol_confirmation ();

  if (ipc_flags || getenv ("SP_ER_PRINT_IPC_FLAG") || ipc_trace_level > TRACE_LVL_0)
    {
      ipc_flags = 1;
      if (ipc_trace_level == TRACE_LVL_0)
	ipc_trace_level = TRACE_LVL_1;
      // reopen stderr as file "ipc_log"
      ipc_log_name = getenv ("SP_ER_PRINT_IPC_LOG");
      if (ipc_log_name == NULL)
	ipc_log_name = "ipc_log";
      freopen (ipc_log_name, "w", stderr);
      if (ipc_trace_level >= TRACE_LVL_2)
	{
	  ipc_request_log_name = "ipc_request_log";
	  ipc_response_log_name = "ipc_response_log";
	  requestLogFileP = fopen (ipc_request_log_name, "w");
	  responseLogFileP = fopen (ipc_response_log_name, "w");
	}
      else
	{
	  ipc_request_log_name = "ipc_log";
	  ipc_response_log_name = "ipc_log";
	}
      begin_time = gethrtime ();
    }
  else
    // Reopen stderr as /dev/null
    freopen ("/dev/null", "w", stderr);

  struct sigaction act;
  memset (&act, 0, sizeof (struct sigaction));
  term_flag = 0;
  /* install a handler for TERM */
  ipc_request_trace (TRACE_LVL_1, "Installing SIGTERM handler to abort on error\n");
  sigemptyset (&act.sa_mask);
  act.sa_handler = (SignalHandler) sigterm_handler;
  act.sa_flags = SA_RESTART | SA_SIGINFO;
  if (sigaction (SIGTERM, &act, &old_sigterm_handler) == -1)
    {
      ipc_request_trace (TRACE_LVL_1, "Unable to install SIGTERM handler\n");
      abort ();
    }
  /* install a handler for INT */
  ipc_request_trace (TRACE_LVL_1, "Installing SIGINT handler to send message to analyzer\n");
  sigemptyset (&act.sa_mask);
  act.sa_handler = (SignalHandler) sigint_handler;
  act.sa_flags = SA_RESTART | SA_SIGINFO;
  if (sigaction (SIGINT, &act, &old_sigint_handler) == -1)
    {
      ipc_request_trace (TRACE_LVL_1, "Unable to install SIGINT handler\n");
      abort ();
    }
  ipc_log ("Installed SIGINT handler to handle Ctrl-C properly\n");
  int er_print_catch_crash = 1; // Default: catch fatal signals
  char *s = getenv ("GPROFNG_ALLOW_CORE_DUMP");
  if (s && (strcasecmp (s, "no") == 0 || strcmp (s, "0") == 0))
    er_print_catch_crash = 0;
  if (er_print_catch_crash)
    {
      /* reserve memory for fatal error processing */
      fatalErrorDynamicMemory = (char *) xmalloc (4 * 1024 * 1024); // reserve 4 MB
      /* install a handler for SIGABRT */
      ipc_request_trace (TRACE_LVL_1, "Installing SIGABRT handler to send message to analyzer\n");
      sigemptyset (&act.sa_mask);
      act.sa_handler = (SignalHandler) sigABRT_handler;
      act.sa_flags = SA_RESTART | SA_SIGINFO;
      if (sigaction (SIGABRT, &act, NULL) == -1)
	{
	  ipc_request_trace (TRACE_LVL_1, "Unable to install SIGABRT handler\n");
	  // abort();
	}
      else
	ipc_log ("Installed SIGABRT handler to handle crash properly\n");
      /* install a handler for SIGSEGV */
      ipc_request_trace (TRACE_LVL_1, "Installing SIGABRT handler to send message to analyzer\n");
      sigemptyset (&act.sa_mask);
      act.sa_handler = (SignalHandler) sigSEGV_handler;
      act.sa_flags = SA_RESTART | SA_SIGINFO;
      if (sigaction (SIGSEGV, &act, NULL) == -1)
	{
	  ipc_request_trace (TRACE_LVL_1, "Unable to install SIGSEGV handler\n");
	  // abort();
	}
      else
	ipc_log ("Installed SIGSEGV handler to handle crash properly\n");
    }
  ipc_request_trace (TRACE_LVL_1, "Entering ipc_mainLoop; run dir `%s'\n",
		     theApplication->get_run_dir ());
  cancelRequestedChannelID = 0xFFFFFFFF;
  ipcThreadPool = new DbeThreadPool (0); // DbeThreadPool (-1);
  responseBufferPool = new BufferPool ();
  ipc_log (ipc_single_threaded_mode ?
	   "RUNNING er_print -IPC IN SINGLE THREADED MODE\n" :
	   "RUNNING er_print -IPC IN MULTITHREAD MODE\n");

  /* Send "Ready" signal to the GUI */
  setProgress (100, "Restart engine");

  /* start listening for requests */
  error_flag = 0;
  for (;;)
    {
      readRequestHeader ();
      if (term_flag == 1 || error_flag == 1)
	{
	  ipc_request_trace (TRACE_LVL_1, "SIGTERM received, exiting\n");
	  return;
	}
    }
}

static const char *
table_name (int flavor)
{
  static char def_name[64];

  switch ((FuncListDisp_type) flavor)
    {
    case DSP_FUNCTION:
      return ("FUNCTION");
    case DSP_LINE:
      return ("LINE");
    case DSP_PC:
      return ("PC");
    case DSP_SOURCE:
      return ("SOURCE");
    case DSP_DISASM:
      return ("DISASM");
    case DSP_SELF:
      return ("SELF");
    case DSP_CALLER:
      return ("CALLER");
    case DSP_CALLEE:
      return ("CALLEE");
    case DSP_CALLTREE:
      return ("CALLTREE");
    case DSP_TIMELINE:
      return ("TIMELINE");
    case DSP_STATIS:
      return ("STATIS");
    case DSP_EXP:
      return ("EXP");
    case DSP_LEAKLIST:
      return ("LEAKLIST");
    case DSP_HEAPCALLSTACK:
      return ("HEAP");
    case DSP_MEMOBJ:
      return ("MEMOBJ");
    case DSP_DATAOBJ:
      return ("DATAOBJ");
    case DSP_DLAYOUT:
      return ("DLAYOUT");
    case DSP_SRC_FILE:
      return ("SRC_FILE");
    case DSP_IFREQ:
      return ("IFREQ");
    case DSP_RACES:
      return ("RACES");
    case DSP_INDXOBJ:
      return ("INDXOBJ");
    case DSP_DUALSOURCE:
      return ("DUALSOURCE");
    case DSP_SOURCE_DISASM:
      return ("SOURCE_DISASM");
    case DSP_DEADLOCKS:
      return ("DEADLOCKS");
    case DSP_SOURCE_V2:
      return ("SOURCE_V2");
    case DSP_DISASM_V2:
      return ("DISASM_V2");
    case DSP_IOACTIVITY:
      return ("IOACTIVITY");
    case DSP_OVERVIEW:
      return ("OVERVIEW");
    case DSP_SAMPLE:
      return ("SAMPLE -- UNEXPECTED");
    default:
      snprintf (def_name, sizeof (def_name), "table number %d", flavor);
      return (def_name);
    }
}
