
// This program creates NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS of pthreads,
// creates an lldb Debugger on each thread, creates targets, inserts two
// breakpoints, runs to the first breakpoint, backtraces, runs to the second
// breakpoint, backtraces, kills the inferior process, closes down the
// debugger.

// The main thread keeps track of which pthreads have completed and which
// pthreads have completed successfully, and exits when all pthreads have
// completed successfully, or our time limit has been exceeded.

// This test file helps to uncover race conditions and locking mistakes
// that are hit when lldb is being used to debug multiple processes
// simultaneously.

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _WIN32
#include <unistd.h>
#endif

#include "lldb/API/SBBreakpoint.h"
#include "lldb/API/SBBroadcaster.h"
#include "lldb/API/SBCommandInterpreter.h"
#include "lldb/API/SBDebugger.h"
#include "lldb/API/SBError.h"
#include "lldb/API/SBEvent.h"
#include "lldb/API/SBFrame.h"
#include "lldb/API/SBLaunchInfo.h"
#include "lldb/API/SBListener.h"
#include "lldb/API/SBProcess.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBThread.h"

#include <chrono>
#include <csignal>
#include <thread>

#define NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS 10

#define DEBUG 0

#define STR1(x) #x
#define STR(x) STR1(x)

using namespace lldb;

bool *completed_threads_array = 0;
bool *successful_threads_array  = 0;

const char *inferior_process_name = "testprog";

bool
wait_for_stop_event (SBProcess process, SBListener listener)
{
    bool stopped = false;
    while (!stopped)
    {
        SBEvent event;
        bool waitfor_ret = listener.WaitForEvent (2, event);
        if (event.GetType() == SBProcess::eBroadcastBitStateChanged)
        {
            if (process.GetState() == StateType::eStateStopped
                || process.GetState() == StateType::eStateCrashed
                || process.GetState() == StateType::eStateDetached
                || process.GetState() == StateType::eStateExited)
            {
                stopped = true;
            }
        }
    }
    return stopped;
}

bool
walk_stack_to_main (SBThread thread)
{
    if (thread.IsValid() == 0)
    {
        return false;
    }

    bool found_main = false;
    uint32_t curr_frame = 0;
    const uint32_t framecount = thread.GetNumFrames();
    while (!found_main && curr_frame < framecount)
    {
        SBFrame frame = thread.GetFrameAtIndex (curr_frame);
        const char* function_name = frame.GetFunctionName();
        if (function_name && strcmp (function_name, "main") == 0)
        {
            found_main = true;
            break;
        }
        curr_frame += 1;
    }
    return found_main;
}

// Function names are spelled differently on each platform, for example
// "foo()" on Linux and "int foo(void)" on Windows, so check the breakpoint.
bool stopped_at_breakpoint(SBThread thread, SBBreakpoint breakpoint) {
  return thread.GetStopReason() == eStopReasonBreakpoint &&
         thread.GetStopReasonDataAtIndex(0) == (uint64_t)breakpoint.GetID();
}

void *do_one_debugger (void *in)
{
    uint64_t threadnum = (uint64_t) in;

#if defined (__APPLE__)
    char *threadname;
    asprintf (&threadname, "thread #%lld", threadnum);
    pthread_setname_np (threadname);
    free (threadname);
#endif

#if DEBUG == 1
    printf ("#%lld: Starting debug session\n", threadnum);
#endif

    SBDebugger debugger = lldb::SBDebugger::Create (false);
    if (debugger.IsValid ())
    {
        debugger.SetAsync (true);
        // Like dotest, give lldb-server time to answer on a loaded host.
        debugger.HandleCommand(
            "settings set plugin.process.gdb-remote.packet-timeout 600");
        SBTarget target = debugger.CreateTargetWithFileAndArch(inferior_process_name,
                                                               STR(LLDB_HOST_ARCH));
        SBCommandInterpreter command_interp = debugger.GetCommandInterpreter();
        if (target.IsValid())
        {
            SBBreakpoint bar_br = target.BreakpointCreateByName ("bar", "testprog");
            if (!bar_br.IsValid())
            {
                printf ("#%" PRIu64 ": failed to set breakpoint on bar, exiting.\n", threadnum);
                exit (1);
            }
            SBBreakpoint foo_br = target.BreakpointCreateByName ("foo", "testprog");
            if (!foo_br.IsValid())
            {
                printf ("#%" PRIu64 ": Failed to set breakpoint on foo()\n", threadnum);
            }

            SBLaunchInfo launch_info (NULL);
            SBError error;
            SBProcess process = target.Launch (launch_info, error);
            if (error.Fail()) {
              printf("#%" PRIu64 ": process failed to launch: %s\n", threadnum,
                     error.GetCString());
              completed_threads_array[threadnum] = true;
              return (void *)1;
            }
            if (process.IsValid())
            {
                SBListener listener = debugger.GetListener();
                SBBroadcaster broadcaster = process.GetBroadcaster();
                uint32_t rc = broadcaster.AddListener (listener, SBProcess::eBroadcastBitStateChanged);
                if (rc == 0)
                {
                    printf ("adding listener failed\n");
                    exit (1);
                }

                wait_for_stop_event (process, listener);

                if (!walk_stack_to_main(process.GetSelectedThread())) {
                  printf("#%" PRIu64 ": backtrace while @ foo() failed\n",
                         threadnum);
                  completed_threads_array[threadnum] = true;
                  return (void *)1;
                }

                if (!stopped_at_breakpoint(process.GetSelectedThread(),
                                           foo_br)) {
                  printf("#%" PRIu64
                         ": First breakpoint did not stop at foo()\n",
                         threadnum);
                  completed_threads_array[threadnum] = true;
                  return (void *)1;
                }

                process.Continue();

                wait_for_stop_event (process, listener);

                if (process.GetState() == StateType::eStateExited)
                {
                    printf ("#%" PRIu64 ": Process exited\n", threadnum);
                    completed_threads_array[threadnum] = true;
                    return (void *) 1;
                }

                if (!walk_stack_to_main(process.GetSelectedThread())) {
                  printf("#%" PRIu64 ": backtrace while @ bar() failed\n",
                         threadnum);
                  completed_threads_array[threadnum] = true;
                  return (void *)1;
                }

                if (!stopped_at_breakpoint(process.GetSelectedThread(),
                                           bar_br)) {
                  printf("#%" PRIu64
                         ": Second breakpoint did not stop at bar()\n",
                         threadnum);
                  completed_threads_array[threadnum] = true;
                  return (void *)1;
                }

                process.Kill();

                wait_for_stop_event (process, listener);

                SBDebugger::Destroy(debugger);

#if DEBUG == 1
                printf ("#%" PRIu64 ": All good!\n", threadnum);
#endif
                successful_threads_array[threadnum] = true;
                completed_threads_array[threadnum] = true;
                return (void*) 0;
            }
            else
            {
                printf("#%" PRIu64 ": process failed to launch\n", threadnum);
                successful_threads_array[threadnum] = false;
                completed_threads_array[threadnum] = true;
                return (void*) 0;
            }
        }
        else
        {
            printf ("#%" PRIu64 ": did not get valid target\n", threadnum);
            successful_threads_array[threadnum] = false;
            completed_threads_array[threadnum] = true;
            return (void*) 0;
        }
    }
    else
    {
        printf ("#%" PRIu64 ": did not get debugger\n", threadnum);
        successful_threads_array[threadnum] = false;
        completed_threads_array[threadnum] = true;
        return (void*) 0;
    }
    completed_threads_array[threadnum] = true;
    return (void*) 1;
}

int count_completed_threads(int num_threads) {
  int num_completed_threads = 0;
  for (int i = 0; i < num_threads; i++)
    if (completed_threads_array[i])
      num_completed_threads++;
  return num_completed_threads;
}

int count_successful_threads(int num_threads) {
  int num_successful_threads = 0;
  for (int i = 0; i < num_threads; i++)
    if (successful_threads_array[i])
      num_successful_threads++;
  return num_successful_threads;
}

int main (int argc, char **argv)
{
#if !defined(_MSC_VER)
  signal(SIGPIPE, SIG_IGN);
#endif

    SBDebugger::Initialize();

    completed_threads_array = (bool *) malloc (sizeof (bool) * NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
    memset (completed_threads_array, 0, sizeof (bool) * NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
    successful_threads_array = (bool *) malloc (sizeof (bool) * NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
    memset (successful_threads_array, 0, sizeof (bool) * NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);

    if (argc > 1 && argv[1] != NULL)
    {
        inferior_process_name = argv[1];
    }

    std::thread threads[NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS];
    for (uint64_t i = 0; i< NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS; i++)
    {
        threads[i] = std::move(std::thread(do_one_debugger, (void*)i));
    }


    int max_time_to_wait = 40;  // 40 iterations, or 120 seconds
    if (getenv("ASAN_OPTIONS"))
      max_time_to_wait *= 4;
    for (int iter = 0; iter < max_time_to_wait; iter++) {
        std::this_thread::sleep_for(std::chrono::seconds(3));
        int successful_threads = count_successful_threads(NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
        int total_completed_threads = count_completed_threads(NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);

        if (total_completed_threads == NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS)
        {
#if DEBUG == 1
            printf ("All threads completed.\n");
            printf ("%d threads completed successfully out of %d\n", successful_threads, NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
#endif
            SBDebugger::Terminate();
            if (successful_threads != NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS) {
              printf("only %d threads completed successfully, out of %d\n",
                     successful_threads, NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
              exit(1);
            }
            exit(0);
        }
        else
        {
#if DEBUG == 1
            printf ("%d threads completed so far (%d successfully), out of %d\n", total_completed_threads, successful_threads, NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
#endif
        }
    }

    printf("reached maximum timeout but only %d threads have completed so far "
           "(%d successfully), out of %d.  Exiting.\n",
           count_completed_threads(NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS),
           count_successful_threads(NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS),
           NUMBER_OF_SIMULTANEOUS_DEBUG_SESSIONS);
    // _exit doesn't flush stdout.
    fflush(stdout);

    // We do not call SBDebugger::Terminate() here because it will destroy
    // data that might be being used by threads that are still running. Which
    // would change the timeout into an unrelated crash.
    // _exit instead of exit, to skip more things that could cause a crash.
    _exit(1);
}
