Skip to content

Commit 5910762

Browse files
committed
impr: bridge, monitor thread protection of bool flags and initialization methods
1 parent 9c4100f commit 5910762

File tree

2 files changed

+56
-30
lines changed

2 files changed

+56
-30
lines changed

src/bridge.h

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class BridgeClass {
106106

107107
struct k_mutex read_mutex{};
108108
struct k_mutex write_mutex{};
109+
struct k_mutex bridge_mutex{};
109110

110111
k_tid_t upd_tid{};
111112
k_thread_stack_t *upd_stack_area{};
@@ -119,17 +120,27 @@ class BridgeClass {
119120
serial_ptr = &serial;
120121
}
121122

122-
operator bool() const {
123-
return started;
123+
operator bool() {
124+
return is_started();
125+
}
126+
127+
bool is_started() {
128+
k_mutex_lock(&bridge_mutex, K_FOREVER);
129+
bool out = started;
130+
k_mutex_unlock(&bridge_mutex);
131+
return out;
124132
}
125133

126134
// Initialize the bridge
127135
bool begin(unsigned long baud=DEFAULT_SERIAL_BAUD) {
128-
serial_ptr->begin(baud);
129-
transport = new SerialTransport(*serial_ptr);
130-
131136
k_mutex_init(&read_mutex);
132137
k_mutex_init(&write_mutex);
138+
k_mutex_init(&bridge_mutex);
139+
140+
if (is_started()) return true;
141+
142+
serial_ptr->begin(baud);
143+
transport = new SerialTransport(*serial_ptr);
133144

134145
client = new RPCClient(*transport);
135146
server = new RPCServer(*transport);
@@ -141,32 +152,29 @@ class BridgeClass {
141152
NULL, NULL, NULL,
142153
UPDATE_THREAD_PRIORITY, 0, K_NO_WAIT);
143154

144-
bool res;
145-
call(RESET_METHOD).result(res);
146-
if (res) {
147-
started = true;
148-
}
155+
k_mutex_lock(&bridge_mutex, K_FOREVER);
156+
bool res = false;
157+
started = call(RESET_METHOD).result(res) && res;
158+
k_mutex_unlock(&bridge_mutex);
149159
return res;
150160
}
151161

152162
template<typename F>
153163
bool provide(const MsgPack::str_t& name, F&& func) {
164+
k_mutex_lock(&bridge_mutex, K_FOREVER);
154165
bool res;
155-
if (!call(BIND_METHOD, name).result(res)) {
156-
return false;
157-
}
158-
return server->bind(name, func);
166+
bool out = call(BIND_METHOD, name).result(res) && res && server->bind(name, func);
167+
k_mutex_unlock(&bridge_mutex);
168+
return out;
159169
}
160170

161171
template<typename F>
162172
bool provide_safe(const MsgPack::str_t& name, F&& func) {
173+
k_mutex_lock(&bridge_mutex, K_FOREVER);
163174
bool res;
164-
if (!call(BIND_METHOD, name).result(res)) {
165-
return false;
166-
}
167-
168-
return server->bind(name, func, "__safe__");
169-
175+
bool out = call(BIND_METHOD, name).result(res) && res && server->bind(name, func, "__safe__");
176+
k_mutex_unlock(&bridge_mutex);
177+
return out;
170178
}
171179

172180
void update() {

src/monitor.h

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class BridgeMonitor: public Stream {
3030
BridgeClass* bridge;
3131
RingBufferN<BufferSize> temp_buffer;
3232
struct k_mutex monitor_mutex{};
33-
bool is_connected = false;
33+
bool _connected = false;
3434

3535
public:
3636
explicit BridgeMonitor(BridgeClass& bridge): bridge(&bridge) {}
@@ -40,15 +40,31 @@ class BridgeMonitor: public Stream {
4040
bool begin(unsigned long _legacy_baud=0, uint16_t _legacy_config=0) {
4141
k_mutex_init(&monitor_mutex);
4242

43+
if (is_connected()) return true;
44+
4345
bool bridge_started = (*bridge);
4446
if (!bridge_started) {
4547
bridge_started = bridge->begin();
4648
}
47-
return bridge_started && bridge->call(MON_CONNECTED_METHOD).result(is_connected);
49+
50+
if (!bridge_started) return false;
51+
52+
k_mutex_lock(&monitor_mutex, K_FOREVER);
53+
bool out = false;
54+
_connected = bridge->call(MON_CONNECTED_METHOD).result(out) && out;
55+
k_mutex_unlock(&monitor_mutex);
56+
return out;
57+
}
58+
59+
bool is_connected() {
60+
k_mutex_lock(&monitor_mutex, K_FOREVER);
61+
bool out = _connected;
62+
k_mutex_unlock(&monitor_mutex);
63+
return out;
4864
}
4965

50-
explicit operator bool() const {
51-
return is_connected;
66+
explicit operator bool() {
67+
return is_connected();
5268
}
5369

5470
int read() override {
@@ -109,11 +125,11 @@ class BridgeMonitor: public Stream {
109125

110126
bool reset() {
111127
bool res;
112-
bool ok = bridge->call(MON_RESET_METHOD).result(res);
113-
if (ok && res) {
114-
is_connected = false;
115-
}
116-
return (ok && res);
128+
bool ok = bridge->call(MON_RESET_METHOD).result(res) && res;
129+
k_mutex_lock(&monitor_mutex, K_FOREVER);
130+
_connected = !ok;
131+
k_mutex_unlock(&monitor_mutex);
132+
return ok;
117133
}
118134

119135
private:
@@ -135,7 +151,9 @@ class BridgeMonitor: public Stream {
135151
}
136152

137153
// if (async_rpc.error.code > NO_ERR) {
138-
// is_connected = false;
154+
// k_mutex_lock(&monitor_mutex, K_FOREVER);
155+
// _connected = false;
156+
// k_mutex_unlock(&monitor_mutex);
139157
// }
140158
}
141159

0 commit comments

Comments
 (0)