X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsrc%2Foicgroup.c;h=5114f4166229c299a242df63e93933d091b52954;hb=3c093548382bb2542c87a67e6e5fa32552c29cb3;hp=e34d73e4fe7a527b22066f27163bfd56073e9378;hpb=cf56a410a2150ae474c676e7e6d01b89552a4873;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/src/oicgroup.c b/resource/csdk/stack/src/oicgroup.c index e34d73e..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,10 +38,6 @@ #include "logger.h" #include "timer.h" -#ifndef WITH_ARDUINO -#include -#endif - #define TAG "OIC_RI_GROUP" #define DESC_DELIMITER "\"" @@ -71,8 +73,45 @@ pointer = NULL; \ } -#ifndef WITH_ARDUINO -pthread_mutex_t lock; +// Mutex implementation macros +#if defined(HAVE_PTHREAD_H) + + #include + 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 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_INITIALIZE(ARG_NAME) { } + #define MUTEX_TERMINATE(ARG_NAME) { } + +#else + + ERROR Need mutex implementation on this platform + #endif enum ACTION_TYPE @@ -93,16 +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..."); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); ScheduledResourceInfo *tmp = NULL; if (*head != NULL) @@ -119,25 +156,21 @@ void AddScheduledResource(ScheduledResourceInfo **head, { *head = add; } -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + MUTEX_UNLOCK(&g_scheduledResourceLock); } ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) { OIC_LOG(INFO, TAG, "GetScheduledResource Entering..."); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); time_t t_now; ScheduledResourceInfo *tmp = NULL; tmp = head; -#ifndef WITH_ARDUINO +#if !defined(WITH_ARDUINO) time(&t_now); #else t_now = now(); @@ -148,11 +181,7 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) while (tmp) { time_t diffTm = 0; -#ifndef WITH_ARDUINO - diffTm = timespec_diff(tmp->time, t_now); -#else diffTm = timespec_diff(tmp->time, t_now); -#endif if (diffTm <= (time_t) 0) { @@ -165,9 +194,9 @@ ScheduledResourceInfo* GetScheduledResource(ScheduledResourceInfo *head) } exit: -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + if (tmp == NULL) { OIC_LOG(INFO, TAG, "Cannot Find Call Info."); @@ -179,9 +208,8 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo { OIC_LOG(INFO, TAG, "GetScheduledResourceByActionSetName Entering..."); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); + ScheduledResourceInfo *tmp = NULL; tmp = head; @@ -199,9 +227,9 @@ ScheduledResourceInfo* GetScheduledResourceByActionSetName(ScheduledResourceInfo } exit: -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + if (tmp == NULL) { OIC_LOG(INFO, TAG, "Cannot Find Call Info."); @@ -212,17 +240,17 @@ exit: void RemoveScheduledResource(ScheduledResourceInfo **head, ScheduledResourceInfo* del) { -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + + MUTEX_LOCK(&g_scheduledResourceLock); + OIC_LOG(INFO, TAG, "RemoveScheduledResource Entering..."); ScheduledResourceInfo *tmp = NULL; if (del == NULL) { -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + return; } @@ -244,9 +272,8 @@ void RemoveScheduledResource(ScheduledResourceInfo **head, } OCFREE(del) -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); } typedef struct aggregatehandleinfo @@ -427,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) { @@ -650,7 +679,7 @@ OCStackResult BuildActionSetFromString(OCActionSet **set, char* actiondesc) // yyyy-mm-dd hh:mm:ss d iterToken = (char *) strtok_r(NULL, ACTION_DELIMITER, &iterTokenPtr); VARIFY_PARAM_NULL(iterToken, result, exit) -#ifndef WITH_ARDUINO +#if !defined(WITH_ARDUINO) if( 2 != sscanf(iterToken, "%ld %u", &(*set)->timesteps, &(*set)->type) ) { // If the return value should be 2, the number of items in the argument. Otherwise, it fails. @@ -750,6 +779,7 @@ exit: OCFREE(desc) OCFREE(capa) OCFREE(action) + OCFREE((*set)->actionsetName) OCFREE(*set) OCFREE(key) OCFREE(value) @@ -786,15 +816,24 @@ 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); - strncat(temp, actionTypeStr, strlen(actionTypeStr)); - remaining -= strlen(actionTypeStr); - free(actionTypeStr); - strncat(temp, ACTION_DELIMITER, strlen(ACTION_DELIMITER)); - remaining--; + if(remaining >= strlen(actionTypeStr) + strlen(ACTION_DELIMITER) + 1) + { + strncat(temp, actionTypeStr, strlen(actionTypeStr)); + remaining -= strlen(actionTypeStr); + strncat(temp, ACTION_DELIMITER, strlen(ACTION_DELIMITER)); + remaining -= strlen(ACTION_DELIMITER); + OICFree(actionTypeStr); + } + else + { + OICFree(actionTypeStr); + res = OC_STACK_ERROR; + goto exit; + } } else { @@ -809,6 +848,7 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) res = OC_STACK_ERROR; goto exit; } + strcat(temp, "uri="); remaining -= strlen("uri="); strcat(temp, action->resourceUri); @@ -842,6 +882,7 @@ OCStackResult BuildStringFromActionSet(OCActionSet* actionset, char** desc) goto exit; } strcat(temp, "|"); + remaining --; } } @@ -890,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; @@ -1063,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) { @@ -1085,13 +1126,13 @@ void DoScheduledGroupAction() OIC_LOG(INFO, TAG, "Target ActionSet is NULL"); goto exit; } -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + + MUTEX_LOCK(&g_scheduledResourceLock); + DoAction(info->resource, info->actionset, info->ehRequest); -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + + MUTEX_UNLOCK(&g_scheduledResourceLock); + if (info->actionset->type == RECURSIVE) { @@ -1106,9 +1147,7 @@ void DoScheduledGroupAction() if (info->actionset->timesteps > 0) { -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); schedule->resource = info->resource; schedule->actionset = info->actionset; schedule->ehRequest = info->ehRequest; @@ -1117,11 +1156,9 @@ void DoScheduledGroupAction() &schedule->timer_id, &DoScheduledGroupAction); - OIC_LOG(INFO, TAG, "Reregisteration."); -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif - AddScheduledResource(&scheduleResourceList, schedule); + OIC_LOG(INFO, TAG, "Reregistration."); + MUTEX_UNLOCK(&g_scheduledResourceLock); + AddScheduledResource(&g_scheduleResourceList, schedule); } else { @@ -1130,7 +1167,7 @@ void DoScheduledGroupAction() } } - RemoveScheduledResource(&scheduleResourceList, info); + RemoveScheduledResource(&g_scheduleResourceList, info); exit: @@ -1241,6 +1278,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( stackRet = OC_STACK_ERROR; } } + OCRepPayloadDestroy(payload); } else if (method == OC_REST_POST) { @@ -1285,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", @@ -1292,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 @@ -1318,30 +1362,22 @@ OCStackResult BuildCollectionGroupActionCBORResponse( OIC_LOG(INFO, TAG, "Building New Call Info."); memset(schedule, 0, sizeof(ScheduledResourceInfo)); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); schedule->resource = resource; schedule->actionset = actionset; - schedule->ehRequest = - (OCServerRequest*) ehRequest->requestHandle; -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif + schedule->ehRequest = request; + + MUTEX_UNLOCK(&g_scheduledResourceLock); if (delay > 0) { OIC_LOG_V(INFO, TAG, "delay_time is %ld seconds.", actionset->timesteps); -#ifndef WITH_ARDUINO - pthread_mutex_lock(&lock); -#endif + MUTEX_LOCK(&g_scheduledResourceLock); schedule->time = registerTimer(delay, &schedule->timer_id, &DoScheduledGroupAction); -#ifndef WITH_ARDUINO - pthread_mutex_unlock(&lock); -#endif - AddScheduledResource(&scheduleResourceList, + MUTEX_UNLOCK(&g_scheduledResourceLock); + AddScheduledResource(&g_scheduleResourceList, schedule); stackRet = OC_STACK_OK; } @@ -1357,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 @@ -1423,6 +1461,7 @@ OCStackResult BuildCollectionGroupActionCBORResponse( stackRet = OC_STACK_ERROR; } } + OCRepPayloadDestroy(payload); } exit: @@ -1432,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); +}