1 #ifndef LLDB_TEST_API_COMMON_H
2 #define LLDB_TEST_API_COMMON_H
3 
4 #include <condition_variable>
5 #include <chrono>
6 #include <exception>
7 #include <iostream>
8 #include <mutex>
9 #include <string>
10 #include <queue>
11 
12 #include <unistd.h>
13 
14 /// Simple exception class with a message
15 struct Exception : public std::exception
16 {
17   std::string s;
ExceptionException18   Exception(std::string ss) : s(ss) {}
~ExceptionException19   virtual ~Exception() throw () { }
whatException20   const char* what() const throw() { return s.c_str(); }
21 };
22 
23 // Synchronized data structure for listener to send events through
24 template<typename T>
25 class multithreaded_queue {
26   std::condition_variable m_condition;
27   std::mutex m_mutex;
28   std::queue<T> m_data;
29   bool m_notified;
30 
31 public:
32 
push(T e)33   void push(T e) {
34     std::lock_guard<std::mutex> lock(m_mutex);
35     m_data.push(e);
36     m_notified = true;
37     m_condition.notify_all();
38   }
39 
pop(int timeout_seconds,bool & success)40   T pop(int timeout_seconds, bool &success) {
41     int count = 0;
42     while (count < timeout_seconds) {
43       std::unique_lock<std::mutex> lock(m_mutex);
44       if (!m_data.empty()) {
45         m_notified = false;
46         T ret = m_data.front();
47         m_data.pop();
48         success = true;
49         return ret;
50       } else if (!m_notified)
51         m_condition.wait_for(lock, std::chrono::seconds(1));
52       count ++;
53     }
54     success = false;
55     return T();
56   }
57 };
58 
59 /// Allocates a char buffer with the current working directory
get_working_dir()60 inline char* get_working_dir() {
61 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
62     return getwd(0);
63 #else
64     return get_current_dir_name();
65 #endif
66 }
67 
68 #endif // LLDB_TEST_API_COMMON_H
69