You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.4KB

  1. #pragma once
  2. #include <memory>
  3. #include <thread>
  4. class ThreadSharedState;
  5. class ThreadMessage;
  6. /**
  7. * ThreadServer implements a worker thread that can do work
  8. * off of the audio thread in a plugin.
  9. * To do useful work with Thread server:
  10. * Derive a class from ThreadServer, and override handleMessage.
  11. * Define at least one message by deriving from ThreadMessage.
  12. * Control ThreadServer with ThreadClient.
  13. * For more info, refer to ThreadSharedState
  14. */
  15. class ThreadServer
  16. {
  17. public:
  18. ThreadServer(std::shared_ptr<ThreadSharedState> state);
  19. virtual ~ThreadServer();
  20. void start();
  21. const ThreadServer& operator= (const ThreadServer&) = delete;
  22. ThreadServer(const ThreadServer&) = delete;
  23. static int _count;
  24. protected:
  25. /**
  26. * Derived thread servers must override this to get messages.
  27. * Message is not const, as server is allowed to modify it and
  28. * send it back.
  29. */
  30. virtual void handleMessage(ThreadMessage*);
  31. /**
  32. * Utility for sending replies back to the client.
  33. * Will causes an error if there is a message in the mailbox already.
  34. */
  35. void sendMessageToClient(ThreadMessage*);
  36. std::shared_ptr<ThreadSharedState> sharedState;
  37. std::unique_ptr<std::thread> thread;
  38. private:
  39. // Message based clients should not override this
  40. virtual void threadFunction();
  41. /**
  42. *
  43. * TODO: get rid of proc and handle, if possible
  44. */
  45. void procMessage(ThreadMessage*);
  46. };