From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/replicant/Wasabi/ServiceManager.h | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Src/replicant/Wasabi/ServiceManager.h (limited to 'Src/replicant/Wasabi/ServiceManager.h') diff --git a/Src/replicant/Wasabi/ServiceManager.h b/Src/replicant/Wasabi/ServiceManager.h new file mode 100644 index 00000000..efcf70df --- /dev/null +++ b/Src/replicant/Wasabi/ServiceManager.h @@ -0,0 +1,52 @@ +#pragma once +#include "foundation/guid.h" +#include "service/api_service.h" +#include "nu/AutoLock.h" +#include "foundation/guid.h" +#include +#include +#include "service/ifc_servicefactory.h" +#include "component/ifc_component_sync.h" +#ifdef _WIN32 +#include +#else +#include +#endif + +class ServiceManager : public api_service, public ifc_component_sync +{ +public: + ServiceManager(); + ~ServiceManager(); + int WASABICALL Dispatchable_QueryInterface(GUID interface_guid, void **object); + + int WASABICALL Service_Register(ifc_serviceFactory *svc); + int WASABICALL Service_Unregister(ifc_serviceFactory *svc); + size_t WASABICALL Service_GetServiceCount(GUID svc_type); + ifc_serviceFactory *WASABICALL Service_EnumService(GUID svc_type, size_t n); + ifc_serviceFactory *WASABICALL Service_EnumService(size_t n); + ifc_serviceFactory *WASABICALL Service_GetServiceByGUID(GUID guid); + void WASABICALL Service_ComponentDone(); + +private: + int WASABICALL ComponentSync_Wait(size_t count); + int GetServiceIndex(GUID key); + +private: + nu::LockGuard serviceGuard; + typedef std::map ServiceMap; + ServiceMap services; + std::vector services_indexer; + + typedef std::vector ServiceList; + std::map services_by_type; + + +#ifdef _WIN32 + HANDLE component_wait; +#else + sem_t component_wait; +#endif +}; + +extern ServiceManager service_manager; -- cgit