| #ifndef LLDB_TEST_API_COMMON_H |
| #define LLDB_TEST_API_COMMON_H |
| |
| #include <condition_variable> |
| #include <chrono> |
| #include <exception> |
| #include <iostream> |
| #include <mutex> |
| #include <string> |
| #include <queue> |
| |
| #include <unistd.h> |
| |
| /// Simple exception class with a message |
| struct Exception : public std::exception |
| { |
| std::string s; |
| Exception(std::string ss) : s(ss) {} |
| virtual ~Exception() throw () { } |
| const char* what() const throw() { return s.c_str(); } |
| }; |
| |
| // Synchronized data structure for listener to send events through |
| template<typename T> |
| class multithreaded_queue { |
| std::condition_variable m_condition; |
| std::mutex m_mutex; |
| std::queue<T> m_data; |
| bool m_notified; |
| |
| public: |
| |
| void push(T e) { |
| std::lock_guard<std::mutex> lock(m_mutex); |
| m_data.push(e); |
| m_notified = true; |
| m_condition.notify_all(); |
| } |
| |
| T pop(int timeout_seconds, bool &success) { |
| int count = 0; |
| while (count < timeout_seconds) { |
| std::unique_lock<std::mutex> lock(m_mutex); |
| if (!m_data.empty()) { |
| m_notified = false; |
| T ret = m_data.front(); |
| m_data.pop(); |
| success = true; |
| return ret; |
| } else if (!m_notified) |
| m_condition.wait_for(lock, std::chrono::seconds(1)); |
| count ++; |
| } |
| success = false; |
| return T(); |
| } |
| }; |
| |
| /// Allocates a char buffer with the current working directory |
| inline char* get_working_dir() { |
| #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) |
| return getwd(0); |
| #else |
| return get_current_dir_name(); |
| #endif |
| } |
| |
| #endif // LLDB_TEST_API_COMMON_H |