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 15struct Exception : public std::exception 16{ 17 std::string s; 18 Exception(std::string ss) : s(ss) {} 19 virtual ~Exception() throw () { } 20 const char* what() const throw() { return s.c_str(); } 21}; 22 23// Synchronized data structure for listener to send events through 24template<typename T> 25class multithreaded_queue { 26 std::condition_variable m_condition; 27 std::mutex m_mutex; 28 std::queue<T> m_data; 29 bool m_notified; 30 31public: 32 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 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 on Linux/Darwin 60inline char* get_working_dir() { 61#ifdef __APPLE__ 62 return getwd(0); 63#else 64 return get_current_dir_name(); 65#endif 66} 67 68#endif // LLDB_TEST_API_COMMON_H 69