#ifndef WorkQueue_h
#define WorkQueue_h
#if OS(DARWIN)
#include <dispatch/dispatch.h>
#endif
#include <chrono>
#include <functional>
#include <wtf/Forward.h>
#include <wtf/Functional.h>
#include <wtf/HashMap.h>
#include <wtf/RefCounted.h>
#include <wtf/Threading.h>
#include <wtf/Vector.h>
#if PLATFORM(GTK) || PLATFORM(EFL)
#include "PlatformProcessIdentifier.h"
#endif
#if PLATFORM(GTK)
#include <wtf/gobject/GMainLoopSource.h>
#include <wtf/gobject/GRefPtr.h>
#elif PLATFORM(EFL)
#include <DispatchQueueEfl.h>
#endif
class WorkQueue : public ThreadSafeRefCounted<WorkQueue> {
public:
enum class QOS {
UserInteractive,
UserInitiated,
Default,
Utility,
Background
};
static PassRefPtr<WorkQueue> create(const char* name, QOS = QOS::Default);
~WorkQueue();
void dispatch(std::function<void ()>);
void dispatchAfter(std::chrono::nanoseconds, std::function<void ()>);
#if OS(DARWIN)
dispatch_queue_t dispatchQueue() const { return m_dispatchQueue; }
#elif PLATFORM(GTK)
void registerSocketEventHandler(int, std::function<void ()>, std::function<void ()>);
void unregisterSocketEventHandler(int);
#elif PLATFORM(EFL)
void registerSocketEventHandler(int, std::function<void ()>);
void unregisterSocketEventHandler(int);
#endif
private:
explicit WorkQueue(const char* name, QOS);
void platformInitialize(const char* name, QOS);
void platformInvalidate();
#if OS(DARWIN)
static void executeFunction(void*);
dispatch_queue_t m_dispatchQueue;
#elif PLATFORM(GTK)
static void startWorkQueueThread(WorkQueue*);
void workQueueThreadBody();
ThreadIdentifier m_workQueueThread;
GRefPtr<GMainContext> m_eventContext;
Mutex m_eventLoopLock;
GRefPtr<GMainLoop> m_eventLoop;
GMainLoopSource m_socketEventSource;
#elif PLATFORM(EFL)
RefPtr<DispatchQueue> m_dispatchQueue;
#endif
};
#endif // WorkQueue_h