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.

60 lines
1.3KB

  1. #include <assert.h>
  2. #include "ThreadServer.h"
  3. #include "ThreadSharedState.h"
  4. int ThreadServer::_count = 0;
  5. ThreadServer::ThreadServer(std::shared_ptr<ThreadSharedState> state) :
  6. sharedState(state)
  7. {
  8. ++_count;
  9. }
  10. ThreadServer::~ThreadServer()
  11. {
  12. --_count;
  13. }
  14. void ThreadServer::start()
  15. {
  16. auto startupFunc = [this]() {
  17. this->threadFunction();
  18. };
  19. std::unique_ptr<std::thread> th(new std::thread(startupFunc));
  20. thread = std::move(th);
  21. }
  22. void ThreadServer::threadFunction()
  23. {
  24. sharedState->serverRunning = true;
  25. for (bool done = false; !done; ) {
  26. if (sharedState->serverStopRequested.load()) {
  27. done = true;
  28. } else {
  29. // if msg is null, stop was requested (that's not true anyh more, is it?)
  30. ThreadMessage* msg = sharedState->server_waitForMessageOrShutdown();
  31. if (msg) {
  32. procMessage(msg);
  33. }
  34. }
  35. }
  36. thread->detach();
  37. sharedState->serverRunning = false;
  38. }
  39. //TODO: get rid of this function
  40. void ThreadServer::procMessage(ThreadMessage* msg)
  41. {
  42. handleMessage(msg);
  43. }
  44. void ThreadServer::handleMessage(ThreadMessage* )
  45. {
  46. assert(false); // derived must override.
  47. }
  48. void ThreadServer::sendMessageToClient(ThreadMessage* msg)
  49. {
  50. sharedState->server_sendMessage(msg);
  51. }