static void ClientNetworkLayerClose(UA_Connection *connection) { #ifdef UA_ENABLE_MULTITHREADING if(uatomic_xchg(&connection->state, UA_CONNECTION_CLOSED) == UA_CONNECTION_CLOSED) return; #else if(connection->state == UA_CONNECTION_CLOSED) return; connection->state = UA_CONNECTION_CLOSED; #endif socket_close(connection); }
/* callback triggered from the server */ static void ServerNetworkLayerTCP_closeConnection(UA_Connection *connection) { #ifdef UA_MULTITHREADING if(uatomic_xchg(&connection->state, UA_CONNECTION_CLOSED) == UA_CONNECTION_CLOSED) return; #else if(connection->state == UA_CONNECTION_CLOSED) return; connection->state = UA_CONNECTION_CLOSED; #endif shutdown(connection->sockfd, 2); /* only shut down here. this triggers the select, where the socket is closed in the main thread */ }
/* callback triggered from the server */ static void ServerNetworkLayerTCP_closeConnection(UA_Connection *connection) { #ifdef UA_MULTITHREADING if(uatomic_xchg(&connection->state, UA_CONNECTION_CLOSED) == UA_CONNECTION_CLOSED) return; #else if(connection->state == UA_CONNECTION_CLOSED) return; connection->state = UA_CONNECTION_CLOSED; #endif ServerNetworkLayerTCP *layer = connection->handle; UA_LOG_INFO(layer->layer.logger, UA_LOGCATEGORY_NETWORK, "Closing the Connection %i", connection->sockfd); /* only "shutdown" here. this triggers the select, where the socket is "closed" in the mainloop */ shutdown(connection->sockfd, 2); }
void *rcu_xchg_pointer_sym(void **p, void *v) { cmm_wmb(); return uatomic_xchg(p, v); }