#include "pseudo_barrier.h"
#include <condition_variable>
#include <mutex>
#include <thread>
#include <vector>

std::mutex mutex;
std::condition_variable cond;
pseudo_barrier_t thread3_barrier;

void *
thread3(void *input)
{
    pseudo_barrier_wait(thread3_barrier);

    int dummy = 47; // thread3-before-lock

    std::unique_lock<std::mutex> lock(mutex); 
    cond.notify_all(); // Set thread3 break point on notify_all at this line.
    return NULL;
}

void *
thread2(void *input)
{
    std::unique_lock<std::mutex> lock(mutex);
    cond.notify_all(); // release main thread
    cond.wait(lock);
    return NULL;
}

void *
thread1(void *input)
{
    std::thread thread_2(thread2, nullptr);
    thread_2.join();

    return NULL;
}

int main()
{
    std::unique_lock<std::mutex> lock(mutex);

    std::thread thread_1(thread1, nullptr);
    cond.wait(lock); // wait for thread2

    pseudo_barrier_init(thread3_barrier, 10);

    std::vector<std::thread> thread_3s;
    for (int i = 0; i < 10; i++) {
      thread_3s.push_back(std::thread(thread3, nullptr));
    }

    cond.wait(lock); // wait for thread_3s

    lock.unlock();

    thread_1.join();
    for (auto &t : thread_3s){
        t.join();
    }

    return 0;
}
