xref: /openbmc/obmc-ikvm/ikvm_manager.hpp (revision d1711dd5)
1 #pragma once
2 
3 #include "ikvm_args.hpp"
4 #include "ikvm_input.hpp"
5 #include "ikvm_server.hpp"
6 #include "ikvm_video.hpp"
7 
8 #include <condition_variable>
9 #include <mutex>
10 
11 namespace ikvm
12 {
13 /*
14  * @class Manager
15  * @brief Manages the VNC server by executing threaded loops of RFB operations
16  *        and video device operations.
17  */
18 class Manager
19 {
20   public:
21     /*
22      * @brief Constructs the Manager object
23      *
24      * @param[in] args - Reference to Args object
25      */
26     explicit Manager(const Args& args);
27     ~Manager() = default;
28     Manager(const Manager&) = default;
29     Manager& operator=(const Manager&) = default;
30     Manager(Manager&&) = default;
31     Manager& operator=(Manager&&) = default;
32 
33     /* @brief Begins operation of the VNC server */
34     void run();
35 
36   private:
37     /*
38      * @brief Thread function to loop the RFB update operations
39      *
40      * @param[in] manager - Pointer to the Manager object
41      */
42     static void serverThread(Manager* manager);
43 
44     /* @brief Notifies thread waiters that RFB operations are complete */
45     void setServerDone();
46     /* @brief Notifies thread waiters that video operations are complete */
47     void setVideoDone();
48     /* @brief Blocks until RFB operations complete */
49     void waitServer();
50     /* @brief Blocks until video operations are complete */
51     void waitVideo();
52 
53     /*
54      * @brief Boolean to indicate whether the application should continue
55      *        running
56      */
57     bool continueExecuting;
58     /* @brief Boolean to indicate that RFB operations are complete */
59     bool serverDone;
60     /* @brief Boolean to indicate that video operations are complete */
61     bool videoDone;
62     /* @brief Input object */
63     Input input;
64     /* @brief Video object */
65     Video video;
66     /* @brief RFB server object */
67     Server server;
68     /* @brief Condition variable to enable waiting for thread completion */
69     std::condition_variable sync;
70     /* @brief Mutex for waiting on condition variable safely */
71     std::mutex lock;
72 };
73 
74 } // namespace ikvm
75