@@ -50,39 +50,35 @@ class BridgeTCPServer final: public Server {
5050 }
5151
5252 k_mutex_lock (&server_mutex, K_FOREVER);
53-
54- String hostname = _addr.toString ();
55- _listening = bridge->call (TCP_LISTEN_METHOD, hostname, _port).result (listener_id);
56-
53+ if (!_listening){
54+ String hostname = _addr.toString ();
55+ _listening = bridge->call (TCP_LISTEN_METHOD, hostname, _port).result (listener_id);
56+ }
5757 k_mutex_unlock (&server_mutex);
5858
5959 }
6060
6161 BridgeTCPClient<BufferSize> accept () {
6262
63- if (!_listening) {
63+ k_mutex_lock (&server_mutex, K_FOREVER);
64+
65+ if (!_listening) { // Not listening -> return disconnected (invalid) client
66+ k_mutex_unlock (&server_mutex);
6467 return BridgeTCPClient<BufferSize>(*bridge, 0 , false );
6568 }
6669
67- if (_connected) {
70+ if (_connected) { // Connection already established return a client copy
71+ k_mutex_unlock (&server_mutex);
6872 return BridgeTCPClient<BufferSize>(*bridge, connection_id);
6973 }
7074
71- k_mutex_lock (&server_mutex, K_FOREVER);
72-
75+ // Accept a connection
7376 const bool ret = bridge->call (TCP_ACCEPT_METHOD, listener_id).result (connection_id);
77+ _connected = ret;
7478
7579 k_mutex_unlock (&server_mutex);
76-
77- if (ret) { // connection_id 0 marks an invalid connection
78- _connected = true ;
79- return BridgeTCPClient<BufferSize>(*bridge, connection_id);
80- } else {
81- _connected = false ;
82- // Return invalid client
83- return BridgeTCPClient<BufferSize>(*bridge, 0 , false );
84- }
85-
80+ // If no connection established return a disconnected (invalid) client
81+ return ret? BridgeTCPClient<BufferSize>(*bridge, connection_id) : BridgeTCPClient<BufferSize>(*bridge, 0 , false );
8682 }
8783
8884 size_t write (uint8_t c) override {
@@ -92,24 +88,25 @@ class BridgeTCPServer final: public Server {
9288 size_t write (const uint8_t *buf, size_t size) override {
9389
9490 BridgeTCPClient<BufferSize> client = accept ();
91+ if (!client) return 0 ;
9592
96- if (client && _connected) {
97- return client.write (buf, size);
93+ k_mutex_lock (&server_mutex, K_FOREVER);
94+ if (_connected) {
95+ size_t written = client.write (buf, size);
96+ k_mutex_unlock (&server_mutex);
97+ return written;
9898 }
99-
99+ k_mutex_unlock (&server_mutex);
100100 return 0 ;
101101 }
102102
103103 void close () {
104104 k_mutex_lock (&server_mutex, K_FOREVER);
105-
106105 String msg;
107- const bool ret = bridge->call (TCP_CLOSE_LISTENER_METHOD, listener_id).result (msg);
108-
109- if (ret) {
110- _listening = false ;
106+ if (_listening){
107+ _listening = !bridge->call (TCP_CLOSE_LISTENER_METHOD, listener_id).result (msg);
108+ // Debug msg?
111109 }
112-
113110 k_mutex_unlock (&server_mutex);
114111 }
115112
@@ -120,16 +117,36 @@ class BridgeTCPServer final: public Server {
120117 k_mutex_unlock (&server_mutex);
121118 }
122119
123- bool is_listening () const {
124- return _listening;
120+ bool is_listening () {
121+ k_mutex_lock (&server_mutex, K_FOREVER);
122+ bool out = _listening;
123+ k_mutex_unlock (&server_mutex);
124+ return out;
125125 }
126126
127- uint16_t getPort () const {
128- return _port;
127+ bool is_connected () {
128+ k_mutex_lock (&server_mutex, K_FOREVER);
129+ bool out = _connected;
130+ k_mutex_unlock (&server_mutex);
131+ return out;
132+ }
133+
134+ uint16_t getPort () {
135+ k_mutex_lock (&server_mutex, K_FOREVER);
136+ uint16_t port = _port;
137+ k_mutex_unlock (&server_mutex);
138+ return port;
139+ }
140+
141+ String getAddr () {
142+ k_mutex_lock (&server_mutex, K_FOREVER);
143+ String hostname = _addr.toString ();
144+ k_mutex_unlock (&server_mutex);
145+ return hostname;
129146 }
130147
131148 operator bool () const {
132- return _listening ;
149+ return is_listening () ;
133150 }
134151
135152 using Print::write;
0 commit comments