|
@@ -408,10 +408,13 @@ process_RegisterServer(UA_Server *server, UA_Session *session,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if(server->discoveryManager.registerServerCallback)
|
|
|
+ if(server->discoveryManager.registerServerCallback) {
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
server->discoveryManager.
|
|
|
- registerServerCallback(requestServer,
|
|
|
- server->discoveryManager.registerServerCallbackData);
|
|
|
+ registerServerCallback(requestServer,
|
|
|
+ server->discoveryManager.registerServerCallbackData);
|
|
|
+ UA_LOCK(server->serviceMutex);
|
|
|
+ }
|
|
|
|
|
|
// server found, remove from list
|
|
|
LIST_REMOVE(registeredServer_entry, pointers);
|
|
@@ -455,10 +458,13 @@ process_RegisterServer(UA_Server *server, UA_Session *session,
|
|
|
// Previously we only called it if it was a new register call. It may be the case that this endpoint
|
|
|
// registered before, then crashed, restarts and registeres again. In that case the entry is not deleted
|
|
|
// and the callback would not be called.
|
|
|
- if(server->discoveryManager.registerServerCallback)
|
|
|
+ if(server->discoveryManager.registerServerCallback) {
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
server->discoveryManager.
|
|
|
- registerServerCallback(requestServer,
|
|
|
- server->discoveryManager.registerServerCallbackData);
|
|
|
+ registerServerCallback(requestServer,
|
|
|
+ server->discoveryManager.registerServerCallbackData);
|
|
|
+ UA_LOCK(server->serviceMutex)
|
|
|
+ }
|
|
|
|
|
|
// copy the data from the request into the list
|
|
|
UA_RegisteredServer_copy(requestServer, ®isteredServer_entry->registeredServer);
|
|
@@ -565,6 +571,7 @@ void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic) {
|
|
|
static void
|
|
|
periodicServerRegister(UA_Server *server, void *data) {
|
|
|
UA_assert(data != NULL);
|
|
|
+ UA_LOCK(server->serviceMutex);
|
|
|
|
|
|
struct PeriodicServerRegisterCallback *cb = (struct PeriodicServerRegisterCallback *)data;
|
|
|
|
|
@@ -578,7 +585,7 @@ periodicServerRegister(UA_Server *server, void *data) {
|
|
|
UA_StatusCode retval = UA_Server_register_discovery(server,
|
|
|
"opc.tcp://localhost:4840", "/path/to/some/file");
|
|
|
*/
|
|
|
- retval = UA_Server_register_discovery(server, cb->client, NULL);
|
|
|
+ retval = register_server_with_discovery_server(server, cb->client, false, NULL);
|
|
|
}
|
|
|
if (cb->client->state == UA_CLIENTSTATE_CONNECTED) {
|
|
|
UA_StatusCode retval1 = UA_Client_disconnect(cb->client);
|
|
@@ -606,7 +613,8 @@ periodicServerRegister(UA_Server *server, void *data) {
|
|
|
nextInterval = cb->default_interval;
|
|
|
|
|
|
cb->this_interval = nextInterval;
|
|
|
- UA_Server_changeRepeatedCallbackInterval(server, cb->id, nextInterval);
|
|
|
+ changeRepeatedCallbackInterval(server, cb->id, nextInterval);
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -616,11 +624,12 @@ periodicServerRegister(UA_Server *server, void *data) {
|
|
|
(int)(cb->default_interval/1000));
|
|
|
|
|
|
if(!cb->registered) {
|
|
|
- retval = UA_Server_changeRepeatedCallbackInterval(server, cb->id, cb->default_interval);
|
|
|
+ retval = changeRepeatedCallbackInterval(server, cb->id, cb->default_interval);
|
|
|
/* If changing the interval fails, try again after the next registering */
|
|
|
if(retval == UA_STATUSCODE_GOOD)
|
|
|
cb->registered = true;
|
|
|
}
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
}
|
|
|
|
|
|
UA_StatusCode
|
|
@@ -630,17 +639,20 @@ UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
|
|
|
UA_Double intervalMs,
|
|
|
UA_Double delayFirstRegisterMs,
|
|
|
UA_UInt64 *periodicCallbackId) {
|
|
|
-
|
|
|
+ UA_LOCK(server->serviceMutex);
|
|
|
/* No valid server URL */
|
|
|
if(!discoveryServerUrl) {
|
|
|
UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
|
|
|
"No discovery server URL provided");
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return UA_STATUSCODE_BADINTERNALERROR;
|
|
|
}
|
|
|
|
|
|
|
|
|
- if (client->connection.state != UA_CONNECTION_CLOSED)
|
|
|
+ if (client->connection.state != UA_CONNECTION_CLOSED) {
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return UA_STATUSCODE_BADINVALIDSTATE;
|
|
|
+ }
|
|
|
|
|
|
/* check if we are already registering with the given discovery url and remove the old periodic call */
|
|
|
{
|
|
@@ -650,7 +662,7 @@ UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
|
|
|
if(strcmp(rs->callback->discovery_server_url, discoveryServerUrl) == 0) {
|
|
|
UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER,
|
|
|
"There is already a register callback for '%s' in place. Removing the older one.", discoveryServerUrl);
|
|
|
- UA_Server_removeRepeatedCallback(server, rs->callback->id);
|
|
|
+ removeCallback(server, rs->callback->id);
|
|
|
LIST_REMOVE(rs, pointers);
|
|
|
UA_free(rs->callback->discovery_server_url);
|
|
|
UA_free(rs->callback);
|
|
@@ -664,8 +676,10 @@ UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
|
|
|
struct PeriodicServerRegisterCallback* cb =
|
|
|
(struct PeriodicServerRegisterCallback*)
|
|
|
UA_malloc(sizeof(struct PeriodicServerRegisterCallback));
|
|
|
- if(!cb)
|
|
|
+ if(!cb) {
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return UA_STATUSCODE_BADOUTOFMEMORY;
|
|
|
+ }
|
|
|
|
|
|
/* Start repeating a failed register after 1s, then increase the delay. Set
|
|
|
* to 500ms, as the delay is doubled before changing the callback
|
|
@@ -678,19 +692,21 @@ UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
|
|
|
cb->discovery_server_url = (char*)UA_malloc(len+1);
|
|
|
if (!cb->discovery_server_url) {
|
|
|
UA_free(cb);
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return UA_STATUSCODE_BADOUTOFMEMORY;
|
|
|
}
|
|
|
memcpy(cb->discovery_server_url, discoveryServerUrl, len+1);
|
|
|
|
|
|
/* Add the callback */
|
|
|
UA_StatusCode retval =
|
|
|
- UA_Server_addRepeatedCallback(server, periodicServerRegister,
|
|
|
- cb, delayFirstRegisterMs, &cb->id);
|
|
|
+ addRepeatedCallback(server, periodicServerRegister,
|
|
|
+ cb, delayFirstRegisterMs, &cb->id);
|
|
|
if(retval != UA_STATUSCODE_GOOD) {
|
|
|
UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
|
|
|
"Could not create periodic job for server register. "
|
|
|
"StatusCode %s", UA_StatusCode_name(retval));
|
|
|
UA_free(cb);
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -699,8 +715,9 @@ UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
|
|
|
periodicServerRegisterCallback_entry *newEntry =
|
|
|
(periodicServerRegisterCallback_entry *)UA_malloc(sizeof(periodicServerRegisterCallback_entry));
|
|
|
if(!newEntry) {
|
|
|
- UA_Server_removeRepeatedCallback(server, cb->id);
|
|
|
+ removeCallback(server, cb->id);
|
|
|
UA_free(cb);
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return UA_STATUSCODE_BADOUTOFMEMORY;
|
|
|
}
|
|
|
newEntry->callback = cb;
|
|
@@ -709,6 +726,7 @@ UA_Server_addPeriodicServerRegisterCallback(UA_Server *server,
|
|
|
|
|
|
if(periodicCallbackId)
|
|
|
*periodicCallbackId = cb->id;
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
return UA_STATUSCODE_GOOD;
|
|
|
}
|
|
|
|
|
@@ -716,8 +734,10 @@ void
|
|
|
UA_Server_setRegisterServerCallback(UA_Server *server,
|
|
|
UA_Server_registerServerCallback cb,
|
|
|
void* data) {
|
|
|
+ UA_LOCK(server->serviceMutex);
|
|
|
server->discoveryManager.registerServerCallback = cb;
|
|
|
server->discoveryManager.registerServerCallbackData = data;
|
|
|
+ UA_UNLOCK(server->serviceMutex);
|
|
|
}
|
|
|
|
|
|
#endif /* UA_ENABLE_DISCOVERY */
|