diff --git a/src/rm_services.c b/src/rm_services.c
index aa6b61331c71ecb9fc90392196c641dab7725930..a2d13e79fd6e013c6892345b388f3d4991c566fb 100644 (file)
--- a/src/rm_services.c
+++ b/src/rm_services.c
@@ -93,10 +93,12 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
Rm_ServiceRespInfo *serviceResponse)
{
Rm_Inst *rmInst = (Rm_Inst *)rmHandle;
+ char *instanceName;
Rm_Transaction *transaction;
void *key;
RM_SS_INST_INV_ENTER_CS(key);
+ RM_SC_INST_INV_ENTER_CS(key);
if (rmInst->isLocked) {
serviceResponse->serviceState = RM_SERVICE_DENIED_RM_INSTANCE_LOCKED;
@@ -107,12 +109,20 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
serviceResponse->serviceState = RM_ERROR_INVALID_SERVICE_TYPE;
return;
}
+
+ /* Copy location of instance name to local variable in case Shared Client needs to
+ * transfer control to a shared server */
+ instanceName = rmInst->instName;
+ if (rmInst->instType == Rm_instType_SHARED_CLIENT) {
+ /* Transfer control to shared server instance */
+ rmInst = rmInst->u.sharedClient.sharedServerHandle;
+ }
transaction = rmTransactionQueueAdd(rmInst);
if (transaction) {
transaction->type = serviceRequest->type;
- strncpy(transaction->serviceSrcInstName, rmInst->instName, RM_NAME_MAX_CHARS);
- transaction->callback.serviceCallback = serviceRequest->callback.serviceCallback;
+ strncpy(transaction->serviceSrcInstName, instanceName, RM_NAME_MAX_CHARS);
+ transaction->u.callback.serviceCallback = serviceRequest->callback.serviceCallback;
transaction->state = RM_SERVICE_PROCESSING;
if (serviceRequest->resourceName) {
strncpy(transaction->resourceInfo.name, serviceRequest->resourceName, RM_NAME_MAX_CHARS);
@@ -120,6 +130,8 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
transaction->resourceInfo.base = serviceRequest->resourceBase;
transaction->resourceInfo.length = serviceRequest->resourceLength;
transaction->resourceInfo.alignment = serviceRequest->resourceAlignment;
+ transaction->resourceInfo.ownerCount = RM_RESOURCE_NUM_OWNERS_INVALID;
+ transaction->resourceInfo.instAllocCount = RM_INST_ALLOC_COUNT_INVALID;
if (serviceRequest->resourceNsName) {
strncpy(transaction->resourceInfo.nameServerName, serviceRequest->resourceNsName, RM_NAME_MAX_CHARS);
}
@@ -127,25 +139,29 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
/* Process received transaction */
rmProcessRouter(rmInst, transaction);
- memset((void *)serviceResponse, 0, sizeof(Rm_ServiceRespInfo));
+ memset((void *)serviceResponse, 0, sizeof(*serviceResponse));
if ((rmInst->instType == Rm_instType_SHARED_SERVER) &&
(transaction->state == RM_SERVICE_PROCESSING)) {
/* Shared Server should always return a fully processed transaction */
- serviceResponse->serviceState = RM_ERROR_SHARED_SERVER_UNFINISHED_REQ;
+ serviceResponse->serviceState = RM_ERROR_SHARED_INSTANCE_UNFINISHED_REQ;
rmTransactionQueueDelete(rmInst, transaction->localId);
}
else {
if ((transaction->state == RM_SERVICE_PROCESSING) &&
- (transaction->callback.serviceCallback == NULL)) {
+ (transaction->u.callback.serviceCallback == NULL)) {
/* Block until response is received. Response will be received in transaction. */
Rm_osalTaskBlock(rmInst->blockHandle);
}
serviceResponse->rmHandle = rmHandle;
serviceResponse->serviceState = transaction->state;
+ /* Owner and instance allocation count will only be set within RM under certain circumstances. */
+ serviceResponse->resourceNumOwners = transaction->resourceInfo.ownerCount;
+ serviceResponse->instAllocCount = transaction->resourceInfo.instAllocCount;
if ((serviceResponse->serviceState == RM_SERVICE_PROCESSING) ||
- (serviceResponse->serviceState == RM_SERVICE_APPROVED_STATIC)) {
+ (serviceResponse->serviceState == RM_SERVICE_APPROVED_STATIC) ||
+ (serviceResponse->serviceState == RM_SERVICE_PENDING_SERVER_RESPONSE)) {
/* Service still being processed. Static requests will have their validation responses sent once
* all transports have been established. Provide transaction ID back to component so it can sort
* service responses received via callback function */
@@ -162,7 +178,8 @@ void Rm_serviceHandler (void *rmHandle, const Rm_ServiceReqInfo *serviceRequest,
/* Transactions still processing not deleted from queue including static transactions which will be
* verified once all transports are up */
if ((serviceResponse->serviceState != RM_SERVICE_PROCESSING) &&
- (serviceResponse->serviceState != RM_SERVICE_APPROVED_STATIC)) {
+ (serviceResponse->serviceState != RM_SERVICE_APPROVED_STATIC) &&
+ (serviceResponse->serviceState != RM_SERVICE_PENDING_SERVER_RESPONSE)) {
rmTransactionQueueDelete(rmInst, transaction->localId);
}
}
serviceHandle = rmInst->serviceHandle;
if (serviceHandle == NULL) {
- serviceHandle = Rm_osalMalloc(sizeof(Rm_ServiceHandle));
+ serviceHandle = Rm_osalMalloc(sizeof(*serviceHandle));
if (serviceHandle) {
serviceHandle->rmHandle = rmHandle;
serviceHandle->Rm_serviceHandler = Rm_serviceHandler;
RM_SS_INST_INV_ENTER_CS(key);
if (rmInst->serviceHandle) {
- Rm_osalFree((void *)rmServiceHandle, sizeof(Rm_ServiceHandle));
+ Rm_osalFree((void *)rmServiceHandle, sizeof(*rmServiceHandle));
rmInst->serviceHandle = NULL;
}
else {