20#include "pedigree/kernel/LockGuard.h"
21#include "pedigree/kernel/Service.h"
22#include "pedigree/kernel/ServiceManager.h"
23#include "pedigree/kernel/process/TerminationDeferral.h"
24#include "pedigree/kernel/processor/Processor.h"
25#include "pedigree/kernel/utilities/List.h"
26#include "pedigree/kernel/utilities/new"
30ServiceManager::ServiceManager() : m_Lock(), m_Services() {}
32ServiceManager::~ServiceManager() {
36 for (
auto* service : m_Services) {
37 service->operations.close();
42 for (
auto* service : services) {
43 service->operations.wait();
51 if (result.hasValue()) {
52 return result.value()->pFeatures;
71 auto old = m_Services.lookup(serviceName);
73 displaced = old.value();
74 displaced->operations.
close();
76 m_Services.insert(serviceName, p);
79 displaced->operations.
wait();
88 auto result = m_Services.lookup(serviceName);
89 if (!result.hasValue()) {
92 service = result.value();
93 m_Services.remove(serviceName);
94 service->operations.
close();
96 service->operations.
wait();
103 if (result.hasValue()) {
104 return result.value()->pService;
118 auto result = m_Services.lookup(serviceName);
119 if (result.hasValue()) {
120 service = result.value()->pService;
121 features = result.value()->pFeatures;
124 return service && features;
134 auto result = m_Services.lookup(serviceName);
135 if (!result.hasValue() || !result.value()->operations.tryAcquire(operation)) {
138 service = result.value()->pService;
139 features = result.value()->pFeatures;
141 return features->
provides(type) && service->
serve(type, data, dataLen);
static bool getInterrupts()
bool tryAcquire(size_t n=1)
virtual bool provides(Type service)
Service * pService
The Service itself.
ServiceFeatures * pFeatures
Service operation enumeration.
bool tryGetService(const String &serviceName, Service *&service, ServiceFeatures *&features)
Service * getService(const String &serviceName)
void addService(const String &serviceName, Service *s, ServiceFeatures *feats)
bool serve(const String &serviceName, ServiceFeatures::Type type, void *data, size_t dataLen)
void removeService(const String &serviceName)
ServiceFeatures * enumerateOperations(const String &serviceName)
virtual bool serve(ServiceFeatures::Type type, void *pData, size_t dataLen)=0
void pushBack(const T &value)