MOS Source Code
Loading...
Searching...
No Matches
ipc_io.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2// IO wrapper for IPC channels
3
4#include "mos/ipc/ipc_io.hpp"
5
6#include "mos/io/io.hpp"
7#include "mos/ipc/ipc.hpp"
8#include "mos/misc/panic.hpp"
9
10#include <mos/allocator.hpp>
11#include <mos_stdlib.hpp>
12
14{
16 void on_closed();
17};
18
24
26{
27 if (io_type != IO_IPC)
28 mos_panic("ipc_control_io_close: io->type != IO_IPC"); // handle error cases in io_close
29
30 // we only deannounce the server, we don't free it
31 ipc_server_io_t *server_io = container_of(this, ipc_server_io_t, control_io);
32 ipc_server_close(server_io->server);
33 delete server_io;
34}
35
37{
39 virtual ~IpcServerIO() {};
40
41 size_t on_read(void *buf, size_t size)
42 {
43 return ipc_server_read(descriptor, buf, size);
44 }
45 size_t on_write(const void *buf, size_t size)
46 {
47 return ipc_server_write(descriptor, buf, size);
48 }
53};
54
56{
58 virtual ~IpcClientIO() {};
59
60 size_t on_read(void *buf, size_t size)
61 {
62 return ipc_client_read(descriptor, buf, size);
63 }
64 size_t on_write(const void *buf, size_t size)
65 {
66 return ipc_client_write(descriptor, buf, size);
67 }
72};
73
75{
76 if (isServerSide)
77 {
78 auto io = mos::create<IpcServerIO>(desc);
79 if (io == nullptr)
80 return -ENOMEM;
81 return io;
82 }
83 else
84 {
85 auto io = mos::create<IpcClientIO>(desc);
86 if (io == nullptr)
87 return -ENOMEM;
88 return io;
89 }
90}
91
92PtrResult<IO> ipc_create(const char *name, size_t max_pending_connections)
93{
94 auto server = ipc_server_create(name, max_pending_connections);
95 if (server.isErr())
96 return server.getErr();
97
99 if (io == nullptr)
100 {
101 ipc_server_close(server.get());
102 return -ENOMEM;
103 }
104
105 io->server = server.get();
106 return &io->control_io;
107}
108
110{
111 if (server->io_type != IO_IPC)
112 return -EBADF; // not an ipc server
113
114 ipc_server_io_t *ipc_server = container_of(static_cast<IPC_ControlIO *>(server), ipc_server_io_t, control_io);
115 const auto ipc = ipc_server_accept(ipc_server->server);
116 if (ipc.isErr())
117 return ipc.getErr();
118
119 const auto io = ipc_conn_io_create(ipc.get(), true);
120 if (io.isErr())
121 return io.getErr();
122
123 return io;
124}
125
126PtrResult<IO> ipc_connect(const char *name, size_t buffer_size)
127{
128 const auto ipc = ipc_connect_to_server(name, buffer_size);
129 if (ipc.isErr())
130 return ipc.getErr();
131
132 const auto io = ipc_conn_io_create(ipc.get(), false);
133 if (io.isErr())
134 return io.getErr();
135
136 return io;
137}
@ IO_NONE
Definition io.hpp:29
@ IO_IPC
Definition io.hpp:22
void ipc_server_close(IPCServer *server)
Definition ipc.cpp:87
void ipc_server_close_channel(IpcDescriptor *ipc)
Definition ipc.cpp:177
PtrResult< IpcDescriptor > ipc_connect_to_server(mos::string_view name, size_t buffer_size)
Definition ipc.cpp:315
void ipc_client_close_channel(IpcDescriptor *ipc)
Definition ipc.cpp:163
size_t ipc_server_read(IpcDescriptor *ipc, void *buffer, size_t size)
Definition ipc.cpp:153
size_t ipc_client_write(IpcDescriptor *ipc, const void *buffer, size_t size)
Definition ipc.cpp:148
size_t ipc_client_read(IpcDescriptor *ipc, void *buffer, size_t size)
Definition ipc.cpp:143
size_t ipc_server_write(IpcDescriptor *ipc, const void *buffer, size_t size)
Definition ipc.cpp:158
PtrResult< IpcDescriptor > ipc_server_accept(IPCServer *server)
Definition ipc.cpp:246
PtrResult< IPCServer > ipc_server_create(mos::string_view name, size_t max_pending_connections)
Definition ipc.cpp:198
PtrResult< IO > ipc_accept(IO *server)
Accept a new connection on an IPC server.
Definition ipc_io.cpp:109
PtrResult< IpcConnectionIO > ipc_conn_io_create(IpcDescriptor *desc, bool isServerSide)
Create a new IPC connection io descriptor.
Definition ipc_io.cpp:74
PtrResult< IO > ipc_connect(const char *name, size_t buffer_size)
Connect to an IPC servers.
Definition ipc_io.cpp:126
PtrResult< IO > ipc_create(const char *name, size_t max_pending_connections)
Create a new IPC server.
Definition ipc_io.cpp:92
T * create(Args &&...args)
Definition allocator.hpp:12
#define mos_panic(fmt,...)
Definition panic.hpp:51
size_t size
Definition slab.cpp:32
const char * name
Definition slab.cpp:33
Definition io.hpp:39
IO(IOFlags flags, io_type_t type)
Definition io.cpp:35
const io_type_t io_type
Definition io.hpp:41
void on_closed()
Definition ipc_io.cpp:25
void on_closed()
Definition ipc_io.cpp:68
size_t on_read(void *buf, size_t size)
Definition ipc_io.cpp:60
IpcClientIO(IpcDescriptor *desc)
Definition ipc_io.cpp:57
virtual ~IpcClientIO()
Definition ipc_io.cpp:58
size_t on_write(const void *buf, size_t size)
Definition ipc_io.cpp:64
IpcConnectionIO(IpcDescriptor *descriptor)
Definition ipc_io.hpp:12
IpcDescriptor *const descriptor
Definition ipc_io.hpp:16
void on_closed()
Definition ipc_io.cpp:49
size_t on_read(void *buf, size_t size)
Definition ipc_io.cpp:41
IpcServerIO(IpcDescriptor *desc)
Definition ipc_io.cpp:38
size_t on_write(const void *buf, size_t size)
Definition ipc_io.cpp:45
virtual ~IpcServerIO()
Definition ipc_io.cpp:39
IPC_ControlIO control_io
Definition ipc_io.cpp:21
IPCServer * server
Definition ipc_io.cpp:22
#define container_of(ptr, type, member)
Definition types.hpp:33