implement object registry

This commit is contained in:
Сергей Маринкевич
2025-12-04 20:03:00 +07:00
parent e7aa646a80
commit 47092fc6f1
10 changed files with 183 additions and 68 deletions
+17 -6
View File
@@ -16,11 +16,22 @@ int main() {
// и читает из fifo, в который пишет сервер (fifo_to_client).
IpcPipeChannel ch("/tmp/fifo_to_client", "/tmp/fifo_to_server");
// RPC‑уровень: создаём IpcMarshaller поверх канала и передаём его в прокси.
IpcMarshaller marshaller(ch);
MyServiceProxy<IpcMarshaller> proxy(marshaller);
// RPC‑уровень: создаём два маршаллера с разными ObjectId и два прокси.
// По договорённости на сервере:
// ObjectId = 0 -> первый MyService
// ObjectId = 1 -> второй MyService
IpcMarshaller m1(ch, 0);
IpcMarshaller m2(ch, 1);
MyServiceProxy<IpcMarshaller> obj1(m1);
MyServiceProxy<IpcMarshaller> obj2(m2);
proxy.add(7, 9);
int counter = proxy.get();
std::cout << "RESULT: " << counter << std::endl;
// obj1 увеличивает свой счётчик.
obj1.add(7, 9);
// obj2 увеличивает счётчик на текущее значение счётчика obj1.
obj2.add(0, obj1.get());
int c1 = obj1.get();
int c2 = obj2.get();
std::cout << "OBJ1: " << c1 << " OBJ2: " << c2 << std::endl;
}
+15 -4
View File
@@ -4,6 +4,7 @@
#include "ipc/IpcPipeChannel.h"
#include "ipc/IpcDispatcher.h"
#include "rpc/RpcInvoker.h"
#include "rpc/RpcRegistry.h"
#include <sys/stat.h>
@@ -16,10 +17,20 @@ int main() {
// Сервер читает из fifo_to_server и пишет в fifo_to_client.
IpcPipeChannel ch("/tmp/fifo_to_server", "/tmp/fifo_to_client");
// RPC‑уровень: инвокер и скелет, который лишь регистрирует методы.
RpcInvoker invoker;
MyService realObj;
MyServiceSkeleton skeleton(realObj, invoker);
// RPC‑уровень: реестр объектов и инвокер, который знает, как их вызывать.
RpcRegistry registry;
RpcInvoker invoker(registry);
// PoC: создаём два "реальных" объекта и оборачиваем их в Skeleton'ы,
// которыми владеет RpcRegistry.
MyService obj1;
MyService obj2;
RpcRegistry::ObjectId id1 =
registry.registerObject<MyServiceSkeleton>(obj1); // id1 == 0
RpcRegistry::ObjectId id2 =
registry.registerObject<MyServiceSkeleton>(obj2); // id2 == 1
(void)id1;
(void)id2;
// IPC‑диспетчер, который декодирует IpcMessage в RPC-вызовы и обратно.
IpcDispatcher dispatcher(ch, invoker);