Clean-up: modernize pretty_xml.cpp
[lttng-tools.git] / src / bin / lttng-sessiond / rotation-thread.hpp
index 6dc7c97ac9a8b65142f3cf5a59c168ba8f0877ac..5e9b9d75e07c6741216d75578753133cfcc127bb 100644 (file)
@@ -9,44 +9,85 @@
 #ifndef ROTATION_THREAD_H
 #define ROTATION_THREAD_H
 
-#include <urcu/list.h>
-#include <urcu.h>
-#include <urcu/rculfhash.h>
-#include <lttng/domain.h>
-#include <common/pipe.hpp>
+#include "notification-thread.hpp"
+#include "session.hpp"
+
 #include <common/compat/poll.hpp>
+#include <common/eventfd.hpp>
 #include <common/hashtable/hashtable.hpp>
+#include <common/make-unique-wrapper.hpp>
+#include <common/pipe.hpp>
+
+#include <lttng/domain.h>
+#include <lttng/notification/channel-internal.hpp>
+
+#include <memory>
 #include <pthread.h>
 #include <semaphore.h>
-#include "session.hpp"
-#include "notification-thread.hpp"
+#include <urcu.h>
+#include <urcu/list.h>
+#include <urcu/rculfhash.h>
 
-extern struct lttng_notification_channel *rotate_notification_channel;
-extern int rotate_notification_channel_subscription_change_eventfd;
+namespace lttng {
+namespace sessiond {
 
-enum rotation_thread_job_type {
-       ROTATION_THREAD_JOB_TYPE_SCHEDULED_ROTATION,
-       ROTATION_THREAD_JOB_TYPE_CHECK_PENDING_ROTATION
-};
+enum class rotation_thread_job_type { SCHEDULED_ROTATION, CHECK_PENDING_ROTATION };
 
 struct rotation_thread_timer_queue;
-struct rotation_thread_handle;
 
-struct rotation_thread_timer_queue *rotation_thread_timer_queue_create(void);
-void rotation_thread_timer_queue_destroy(
-               struct rotation_thread_timer_queue *queue);
+class rotation_thread {
+public:
+       using uptr = std::unique_ptr<rotation_thread>;
+
+       rotation_thread(rotation_thread_timer_queue& rotation_timer_queue,
+                       notification_thread_handle& notification_thread_handle);
+       rotation_thread(const rotation_thread&) = delete;
+       rotation_thread(rotation_thread&&) = delete;
+       rotation_thread& operator=(const rotation_thread&) = delete;
+       rotation_thread& operator=(rotation_thread&&) = delete;
+       ~rotation_thread();
+
+       /* Only use through the lttng_thread facilities. */
+       void launch_thread();
+       bool shutdown() const noexcept;
 
-struct rotation_thread_handle *rotation_thread_handle_create(
-               struct rotation_thread_timer_queue *rotation_timer_queue,
-               struct notification_thread_handle *notification_thread_handle);
+       /*
+        * Subscribe/unsubscribe the rotation_thread's notification_channel to/from
+        * session usage notifications to perform size-based rotations.
+        */
+       void subscribe_session_consumed_size_rotation(ltt_session& session, std::uint64_t size);
+       void unsubscribe_session_consumed_size_rotation(ltt_session& session);
 
-void rotation_thread_handle_destroy(
-               struct rotation_thread_handle *handle);
+private:
+       void _thread_function() noexcept;
+       void _run();
+       void _handle_job_queue();
+       void _handle_notification(const lttng_notification& notification);
+       void _handle_notification_channel_activity();
+
+       struct rotation_thread_timer_queue& _rotation_timer_queue;
+       /* Access to the notification thread cmd_queue */
+       notification_thread_handle& _notification_thread_handle;
+       /* Thread-specific quit pipe. */
+       lttng_pipe::uptr _quit_pipe;
+       lttng_notification_channel::uptr _notification_channel;
+       /*
+        * Use an event_fd to wake-up the rotation thread whenever a command
+        * completes on the notification channel. This ensures that any
+        * notification that was queued while waiting for a reply to the command is
+        * eventually consumed.
+        */
+       lttng::eventfd _notification_channel_subscribtion_change_eventfd;
+       lttng_poll_event _events;
+};
 
+struct rotation_thread_timer_queue *rotation_thread_timer_queue_create();
+void rotation_thread_timer_queue_destroy(struct rotation_thread_timer_queue *queue);
 void rotation_thread_enqueue_job(struct rotation_thread_timer_queue *queue,
-               enum rotation_thread_job_type job_type,
-               struct ltt_session *session);
+                                enum rotation_thread_job_type job_type,
+                                struct ltt_session *session);
 
-bool launch_rotation_thread(struct rotation_thread_handle *handle);
+} /* namespace sessiond */
+} /* namespace lttng */
 
 #endif /* ROTATION_THREAD_H */
This page took 0.02429 seconds and 4 git commands to generate.