#pragma once #include class ThreadSharedState; class ThreadServer; class ThreadMessage; /** * This class is meant to be used directly (not sub-classed) * All APIs are non-blocking (polled), so that they may be called * from an audio render thread without fear of priority inversion. * See ThreadSharedState and ThreadSerever for more info. */ class ThreadClient { public: ThreadClient(std::shared_ptr state, std::unique_ptr server); ~ThreadClient(); /** * Poll to see if a message has come back from the server. * Will return null if no message waiting. */ ThreadMessage * getMessage(); /** * Try to send a message. * Returns true if message sent. * * Message might not be sent for various reasons: * - Mailbox still has previous message. * - Unable to lock semaphore without blocking. */ bool sendMessage(ThreadMessage *); const ThreadClient& operator= (const ThreadClient&) = delete; ThreadClient(const ThreadClient&) = delete; private: std::shared_ptr sharedState; std::unique_ptr _server; };