X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Foicgroup.c;h=5114f4166229c299a242df63e93933d091b52954;hb=c315c87e07c4080ecd0ef488e7a1047bc3c509b2;hp=fa67c2846006bcdd02363b173f703756d0dee1c8;hpb=8031c99214e4213a202edef846de68ad5f080fa0;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/oicgroup.c b/resource/csdk/stack/src/oicgroup.c index fa67c28..5114f41 100755 --- a/resource/csdk/stack/src/oicgroup.c +++ b/resource/csdk/stack/src/oicgroup.c @@ -20,10 +20,16 @@ #define _POSIX_C_SOURCE 200112L +#include "iotivity_config.h" + #include #include "oicgroup.h" +#if defined (__TIZENRT__) +#include +#else #include "cJSON.h" +#endif #include "cbor.h" #include "ocpayload.h" #include "oic_malloc.h" @@ -32,8 +38,6 @@ #include "logger.h" #include "timer.h" -#include "platform_features.h" - #define TAG "OIC_RI_GROUP" #define DESC_DELIMITER "\"" @@ -73,21 +77,36 @@ #if defined(HAVE_PTHREAD_H) #include - pthread_mutex_t lock; - #define MUTEX_LOCK(ARG_NAME) { pthread_mutex_lock(ARG_NAME); } - #define MUTEX_UNLOCK(ARG_NAME) { pthread_mutex_unlock(ARG_NAME); } + pthread_mutex_t g_scheduledResourceLock; + #define MUTEX_LOCK(ARG_NAME) { pthread_mutex_lock(ARG_NAME); } + #define MUTEX_UNLOCK(ARG_NAME) { pthread_mutex_unlock(ARG_NAME); } + #define MUTEX_INITIALIZE(ARG_NAME) { } + #define MUTEX_TERMINATE(ARG_NAME) { } #elif defined(HAVE_WINDOWS_H) - #include - CRITICAL_SECTION lock; - #define MUTEX_LOCK(ARG_NAME) { EnterCriticalSection(ARG_NAME); } - #define MUTEX_UNLOCK(ARG_NAME) { LeaveCriticalSection(ARG_NAME); } + #include + CRITICAL_SECTION g_scheduledResourceLock; + bool g_initializedScheduledResourceLock = false; + #define MUTEX_LOCK(ARG_NAME) { EnterCriticalSection(ARG_NAME); } + #define MUTEX_UNLOCK(ARG_NAME) { LeaveCriticalSection(ARG_NAME); } + #define MUTEX_INITIALIZE(ARG_NAME) { assert(!g_initializedScheduledResourceLock); \ + InitializeCriticalSection(ARG_NAME); \ + g_initializedScheduledResourceLock = true; \ + } + #define MUTEX_TERMINATE(ARG_NAME) { if (g_initializedScheduledResourceLock) \ + { \ + DeleteCriticalSection(ARG_NAME); \ + g_initializedScheduledResourceLock = false; \ + } \ + } #elif defined(WITH_ARDUINO) - #define MUTEX_LOCK(ARG_NAME) { } - #define MUTEX_UNLOCK(ARG_NAME) { } + #define MUTEX_LOCK(ARG_NAME) { } + #define MUTEX_UNLOCK(ARG_NAME) { } + #define MUTEX_INITIALIZE(ARG_NAME) { } + #define MUTEX_TERMINATE(ARG_NAME) { } #else @@ -113,14 +132,14 @@ typedef struct scheduledresourceinfo struct scheduledresourceinfo* next; } ScheduledResourceInfo; -ScheduledResourceInfo *scheduleResourceList = NULL; +ScheduledResourceInfo *g_scheduleResourceList = NULL; void AddScheduledResource(ScheduledResourceInfo **head, ScheduledResourceInfo* add) { OIC_LOG(INFO, TAG, "AddScheduledResource Entering..."); - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); ScheduledResourceInfo *tmp = NULL; if (*head != NULL) @@ -137,14 +156,14 @@ void AddScheduledResource(ScheduledResourceInfo **head, { *head = add; } - MUTEX_UNLOCK(&lock); + MUTEX_UNLOCK(&g_scheduledResourceLock); } ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) { OIC_LOG(INFO, TAG, "GetScheduledResource Entering..."); - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); time_t t_now; @@ -176,7 +195,7 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) exit: - MUTEX_UNLOCK(&lock); + MUTEX_UNLOCK(&g_scheduledResourceLock); if (tmp == NULL) { @@ -189,7 +208,7 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo { OIC_LOG(INFO, TAG, "GetScheduledResourceByActionSetName Entering..."); - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); ScheduledResourceInfo *tmp = NULL; tmp = head; @@ -209,7 +228,7 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo exit: - MUTEX_UNLOCK(&lock); + MUTEX_UNLOCK(&g_scheduledResourceLock); if (tmp == NULL) { @@ -222,7 +241,7 @@ void RemoveScheduledResource(ScheduledResourceInfo **head, ScheduledResourceInfo* del) { - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); OIC_LOG(INFO, TAG, "RemoveScheduledResource Entering..."); ScheduledResourceInfo *tmp = NULL; @@ -230,7 +249,7 @@ void RemoveScheduledResource(ScheduledResourceInfo **head, if (del == NULL) { - MUTEX_UNLOCK(&lock); + MUTEX_UNLOCK(&g_scheduledResourceLock); return; } @@ -254,8 +273,7 @@ void RemoveScheduledResource(ScheduledResourceInfo **head, OCFREE(del) - MUTEX_UNLOCK(&lock); - + MUTEX_UNLOCK(&g_scheduledResourceLock); } typedef struct aggregatehandleinfo @@ -436,11 +454,13 @@ void DeleteAction(OCAction** action) void DeleteActionSet(OCActionSet** actionset) { + OCAction* pointer = NULL; + OCAction* pDel = NULL; + if(*actionset == NULL) return; - OCAction* pointer = (*actionset)->head; - OCAction* pDel = NULL; + pointer = (*actionset)->head; while (pointer) { @@ -759,6 +779,7 @@ exit: OCFREE(desc) OCFREE(capa) OCFREE(action) + OCFREE((*set)->actionsetName) OCFREE(*set) OCFREE(key) OCFREE(value) @@ -795,7 +816,7 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) goto exit; } - actionTypeStr = (char *)malloc(1024); + actionTypeStr = (char *)OICMalloc(1024); if(actionTypeStr != NULL) { sprintf(actionTypeStr, "%ld %u", actionset->timesteps, actionset->type); @@ -805,11 +826,11 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) remaining -= strlen(actionTypeStr); strncat(temp, ACTION_DELIMITER, strlen(ACTION_DELIMITER)); remaining -= strlen(ACTION_DELIMITER); - free(actionTypeStr); + OICFree(actionTypeStr); } else { - free(actionTypeStr); + OICFree(actionTypeStr); res = OC_STACK_ERROR; goto exit; } @@ -910,7 +931,7 @@ OCStackApplicationResult ActionSetCB(void* context, OCDoHandle handle, } // Format the response. Note this requires some info about the request - response.requestHandle = info->ehRequest; + response.requestHandle = info->ehRequest->requestId; response.resourceHandle = info->collResource; response.payload = clientResponse->payload; response.numSendVendorSpecificHeaderOptions = 0; @@ -1083,7 +1104,7 @@ OCStackResult DoAction(OCResource* resource, OCActionSet* actionset, void DoScheduledGroupAction() { OIC_LOG(INFO, TAG, "DoScheduledGroupAction Entering..."); - ScheduledResourceInfo* info = GetScheduledResource(scheduleResourceList); + ScheduledResourceInfo* info = GetScheduledResource(g_scheduleResourceList); if (info == NULL) { @@ -1106,11 +1127,11 @@ void DoScheduledGroupAction() goto exit; } - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); DoAction(info->resource, info->actionset, info->ehRequest); - MUTEX_UNLOCK(&lock); + MUTEX_UNLOCK(&g_scheduledResourceLock); if (info->actionset->type == RECURSIVE) @@ -1126,7 +1147,7 @@ void DoScheduledGroupAction() if (info->actionset->timesteps > 0) { - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); schedule->resource = info->resource; schedule->actionset = info->actionset; schedule->ehRequest = info->ehRequest; @@ -1135,9 +1156,9 @@ void DoScheduledGroupAction() &schedule->timer_id, &DoScheduledGroupAction); - OIC_LOG(INFO, TAG, "Reregisteration."); - MUTEX_UNLOCK(&lock); - AddScheduledResource(&scheduleResourceList, schedule); + OIC_LOG(INFO, TAG, "Reregistration."); + MUTEX_UNLOCK(&g_scheduledResourceLock); + AddScheduledResource(&g_scheduleResourceList, schedule); } else { @@ -1146,7 +1167,7 @@ void DoScheduledGroupAction() } } - RemoveScheduledResource(&scheduleResourceList, info); + RemoveScheduledResource(&g_scheduleResourceList, info); exit: @@ -1164,16 +1185,6 @@ OCStackResult BuildCollectionGroupActionCBORResponse( char *doWhat = NULL; char *details = NULL; -#if defined(_WIN32) - static bool initializedCriticalSection = false; - - if(false == initializedCriticalSection) { - /** @todo Find a way to DeleteCriticalSection somewhere. */ - InitializeCriticalSection(&lock); - initializedCriticalSection = true; - } -#endif - stackRet = ExtractKeyValueFromRequest(ehRequest, &doWhat, &details); if(stackRet != OC_STACK_OK) @@ -1267,6 +1278,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( stackRet = OC_STACK_ERROR; } } + OCRepPayloadDestroy(payload); } else if (method == OC_REST_POST) { @@ -1311,6 +1323,14 @@ OCStackResult BuildCollectionGroupActionCBORResponse( else { OIC_LOG(INFO, TAG, "Group Action[POST]."); + OCServerRequest *request = + GetServerRequestUsingHandle(ehRequest->requestHandle); + if (NULL == request) + { + stackRet = OC_STACK_ERROR; + goto exit; + } + if (actionset->type == NONE) { OIC_LOG_V(INFO, TAG, "Execute ActionSet : %s", @@ -1318,13 +1338,11 @@ OCStackResult BuildCollectionGroupActionCBORResponse( unsigned int num = GetNumOfTargetResource( actionset->head); - ((OCServerRequest *) ehRequest->requestHandle)->ehResponseHandler = - HandleAggregateResponse; - ((OCServerRequest *) ehRequest->requestHandle)->numResponses = - num + 1; + request->ehResponseHandler = HandleAggregateResponse; + request->numResponses = num + 1; + + DoAction(resource, actionset, request); - DoAction(resource, actionset, - (OCServerRequest*) ehRequest->requestHandle); stackRet = OC_STACK_OK; } else @@ -1344,22 +1362,22 @@ OCStackResult BuildCollectionGroupActionCBORResponse( OIC_LOG(INFO, TAG, "Building New Call Info."); memset(schedule, 0, sizeof(ScheduledResourceInfo)); - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); schedule->resource = resource; schedule->actionset = actionset; - schedule->ehRequest = - (OCServerRequest*) ehRequest->requestHandle; - MUTEX_UNLOCK(&lock); + schedule->ehRequest = request; + + MUTEX_UNLOCK(&g_scheduledResourceLock); if (delay > 0) { OIC_LOG_V(INFO, TAG, "delay_time is %ld seconds.", actionset->timesteps); - MUTEX_LOCK(&lock); + MUTEX_LOCK(&g_scheduledResourceLock); schedule->time = registerTimer(delay, &schedule->timer_id, &DoScheduledGroupAction); - MUTEX_UNLOCK(&lock); - AddScheduledResource(&scheduleResourceList, + MUTEX_UNLOCK(&g_scheduledResourceLock); + AddScheduledResource(&g_scheduleResourceList, schedule); stackRet = OC_STACK_OK; } @@ -1375,13 +1393,15 @@ OCStackResult BuildCollectionGroupActionCBORResponse( else if (strcmp(doWhat, "CancelAction") == 0) { ScheduledResourceInfo *info = - GetScheduledResourceByActionSetName(scheduleResourceList, details); + GetScheduledResourceByActionSetName(g_scheduleResourceList, details); if(info != NULL) { + MUTEX_LOCK(&g_scheduledResourceLock); unregisterTimer(info->timer_id); + MUTEX_UNLOCK(&g_scheduledResourceLock); - RemoveScheduledResource(&scheduleResourceList, info); + RemoveScheduledResource(&g_scheduleResourceList, info); stackRet = OC_STACK_OK; } else @@ -1441,6 +1461,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( stackRet = OC_STACK_ERROR; } } + OCRepPayloadDestroy(payload); } exit: @@ -1450,3 +1471,18 @@ exit: return stackRet; } + +OCStackResult InitializeScheduleResourceList() +{ + MUTEX_INITIALIZE(&g_scheduledResourceLock); + + g_scheduleResourceList = NULL; + return OC_STACK_OK; +} + +void TerminateScheduleResourceList() +{ + assert(g_scheduleResourceList == NULL); + + MUTEX_TERMINATE(&g_scheduledResourceLock); +}