diff options
author | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2019-06-14 18:14:13 +0200 |
---|---|---|
committer | Jonathan Aillet <jonathan.aillet@iot.bzh> | 2019-06-18 11:34:58 +0200 |
commit | 24046bfdb0568077a074b503d58a343a06f4234a (patch) | |
tree | 54ecdea5d0768d3d354a2ddbda1e309d574bbd14 /lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c | |
parent | 66f27bce6355cc7df978a9d7a6bc725542057a01 (diff) |
Refactoring 'streams data' linked list
Refactoring 'streams data' linked list code using liburcu.
BUG-AGL: SPEC-2329
Change-Id: Idf9367c015d73574d96d83c82a9e8f5b7588a45d
Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
Diffstat (limited to 'lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c')
-rw-r--r-- | lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c | 251 |
1 files changed, 152 insertions, 99 deletions
diff --git a/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c b/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c index 9e03f33..ffc5578 100644 --- a/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c +++ b/lib/4a-hal-utilities/4a-hal-utilities-hal-streams-handler.c @@ -31,19 +31,116 @@ * Actions to be call when a stream verb is called * ******************************************************************************/ +json_object *HalUtlCallSingleStream(afb_req_t request, + afb_api_t apiHandle, + CtlConfigT *ctrlConfig, + struct HalData *currentHalData, + char *apiToCall, + struct InternalHalMixerData *currentMixerData, + json_object *requestJson) +{ + char *returnedError = NULL, *returnedInfo = NULL; + + json_object *responseJ = NULL; + + if(afb_api_call_sync(apiHandle, + apiToCall, + currentMixerData->verbToCall, + json_object_get(requestJson), + &responseJ, + &returnedError, + &returnedInfo)) { + if(responseJ) + json_object_put(responseJ); + AFB_API_ERROR(apiHandle, + "Something went wrong during call to verb '%s' of api '%s' " + "with error '%s' and info '%s' (stream '%s')", + currentMixerData->verbToCall, + apiToCall, + returnedError ? returnedError : "not returned", + returnedInfo ? returnedInfo : "not returned", + currentMixerData->verb); + free(returnedError); + free(returnedInfo); + return NULL; + } + + if(! responseJ) { + AFB_API_ERROR(apiHandle, + "Seems that %s call to api %s succeed but no response was returned (stream '%s')", + currentMixerData->verbToCall, + apiToCall, + currentMixerData->verb); + free(returnedError); + free(returnedInfo); + return NULL; + } + + // TBD JAI : When mixer events will be available, use them instead of generating events at calls + if(! currentMixerData->event || + (afb_event_push(currentMixerData->event, json_object_get(responseJ)) < 0)) { + AFB_API_ERROR(apiHandle, "Could not generate an event for stream %s", currentMixerData->verb); + } + + return responseJ; +} + +json_object *HalUtlCallAllStream(afb_req_t request, + afb_api_t apiHandle, + CtlConfigT *ctrlConfig, + struct HalData *currentHalData, + char *apiToCall, + struct cds_list_head *streamsDataListHead, + json_object *requestJson) +{ + struct InternalHalMixerData *currentMixerData; + + json_object *responseJ = NULL, *toReturnJ; + + toReturnJ = json_object_new_object(); + if(! toReturnJ) { + AFB_API_ERROR(apiHandle, "Didn't succeed to allocate response json object"); + return NULL; + } + + cds_list_for_each_entry(currentMixerData, streamsDataListHead, node) { + responseJ = HalUtlCallSingleStream(request, + apiHandle, + ctrlConfig, + currentHalData, + apiToCall, + currentMixerData, + requestJson); + if(! responseJ) { + AFB_API_ERROR(apiHandle, + "Seems that an error happened during %s call to api %s (stream '%s')", + currentMixerData->verbToCall, + apiToCall, + currentMixerData->verb); + json_object_put(toReturnJ); + return NULL; + } + + json_object_object_add(toReturnJ, currentMixerData->verb, responseJ); + } + + return toReturnJ; +} + void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) { - int idx, count; + char *apiToCall; - char *apiToCall, *returnedError = NULL, *returnedInfo = NULL; + struct cds_list_head *streamsDataListHead = NULL; afb_api_t apiHandle; CtlConfigT *ctrlConfig; struct HalData *currentHalData; + struct InternalHalMixerData *currentMixerData = NULL; - json_object *requestJson, *responseJ = NULL, *toReturnJ = NULL, *verboseBooleanJ; + json_object *requestJson, *verboseBooleanJ, *toReturnJ; apiHandle = afb_req_get_api(request); if(! apiHandle) { @@ -92,97 +189,31 @@ void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) return; } - currentMixerData = (struct InternalHalMixerData *) afb_req_get_vcbdata(request); - if(! currentMixerData) { - afb_req_fail(request, "hal_call_data", "Can't get current call data"); - return; - } - switch(actionType) { case ACTION_ON_MIXER_STREAM: - count = 1; - break; + currentMixerData = (struct InternalHalMixerData *) afb_req_get_vcbdata(request); + if(! currentMixerData) { + afb_req_fail(request, "hal_call_data", "Can't get stream to call data"); + return; + } - case ACTION_ON_MIXER_ALL_STREAM: - count = (int) HalUtlGetNumberOfMixerDataInList(¤tMixerData); - toReturnJ = json_object_new_object(); + toReturnJ = HalUtlCallSingleStream(request, + apiHandle, + ctrlConfig, + currentHalData, + apiToCall, + currentMixerData, + requestJson); if(! toReturnJ) { - afb_req_fail(request, - "response_json_object", - "Didn't succeed to allocate response json object"); + afb_req_fail_f(request, + "mixer_call", + "Seems that an error happened during %s call to api %s (stream '%s')", + currentMixerData->verbToCall, + apiToCall, + currentMixerData->verb); return; } - break; - - default: - afb_req_fail(request, "mixer_action_type", "Action type is unknown"); - return; - } - - for(idx = 0; idx < count; idx++) { - if(afb_api_call_sync(apiHandle, - apiToCall, - currentMixerData->verbToCall, - json_object_get(requestJson), - &responseJ, - &returnedError, - &returnedInfo)) { - if(responseJ) - json_object_put(responseJ); - if(toReturnJ) - json_object_put(toReturnJ); - afb_req_fail_f(request, - "mixer_call", - "Something went wrong during call to verb '%s' of api '%s' with error '%s' and info '%s' (call to mixer %i out of %i)", - currentMixerData->verbToCall, - apiToCall, - returnedError ? returnedError : "not returned", - returnedInfo ? returnedInfo : "not returned", - idx, - count); - free(returnedError); - free(returnedInfo); - return; - } - - if(! responseJ) { - if(toReturnJ) - json_object_put(toReturnJ); - afb_req_fail_f(request, - "mixer_call", - "Seems that %s call to api %s succeed but no response was returned (call to mixer %i out of %i)", - currentMixerData->verbToCall, - apiToCall, - idx, - count); - free(returnedError); - free(returnedInfo); - return; - } - - // TBD JAI : When mixer events will be available, use them instead of generating events at calls - if(! currentMixerData->event || - (afb_event_push(currentMixerData->event, json_object_get(responseJ)) < 0)) { - AFB_API_ERROR(apiHandle, "Could not generate an event for stream %s", currentMixerData->verb); - } - - switch(actionType) { - case ACTION_ON_MIXER_STREAM: - toReturnJ = responseJ; - break; - - case ACTION_ON_MIXER_ALL_STREAM: - json_object_object_add(toReturnJ, currentMixerData->verb, responseJ); - currentMixerData = currentMixerData->next; - break; - default: - break; - } - } - - switch(actionType) { - case ACTION_ON_MIXER_STREAM: afb_req_success_f(request, toReturnJ, "Action %s correctly transferred to %s without any error raised", @@ -191,13 +222,35 @@ void HalUtlActionOnMixer(afb_req_t request, enum ActionOnMixerType actionType) break; case ACTION_ON_MIXER_ALL_STREAM: + streamsDataListHead = (struct cds_list_head *) afb_req_get_vcbdata(request); + if(! streamsDataListHead) { + afb_req_fail(request, "hal_call_data", "Can't get stream list data"); + return; + } + + toReturnJ = HalUtlCallAllStream(request, + apiHandle, + ctrlConfig, + currentHalData, + apiToCall, + streamsDataListHead, + requestJson); + if(! toReturnJ) { + afb_req_fail_f(request, + "mixer_call", + "Seems that an error happened during call to all streams using api %s", + apiToCall); + return; + } + afb_req_success(request, toReturnJ, "Actions correctly transferred to all streams without any error raised"); break; default: - break; + afb_req_fail(request, "mixer_action_type", "Action type is unknown"); + return; } } @@ -241,7 +294,7 @@ struct InternalHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(afb_api_t ap ! currentHalData->internalHalData) return NULL; - createdStreamData = HalUtlAddMixerDataToMixerDataList(¤tHalData->internalHalData->streamsData); + createdStreamData = HalUtlAddMixerDataToMixerDataList(¤tHalData->internalHalData->streamsDataListHead); if(! createdStreamData) return NULL; @@ -252,13 +305,13 @@ struct InternalHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(afb_api_t ap if(! createdStreamData->verb || ! createdStreamData->verbToCall || ! createdStreamData->streamCardId) { - HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, createdStreamData); + HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsDataListHead, createdStreamData); return NULL; } createdStreamData->event = afb_api_make_event(apiHandle, createdStreamData->verb); if(! createdStreamData->event) { - HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, createdStreamData); + HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsDataListHead, createdStreamData); return NULL; } @@ -271,7 +324,7 @@ struct InternalHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(afb_api_t ap 0, 0)) { AFB_API_ERROR(apiHandle,"Error while creating verb for stream : '%s'", createdStreamData->verb); - HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, createdStreamData); + HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsDataListHead, createdStreamData); return NULL; } @@ -282,7 +335,7 @@ struct InternalHalMixerData *HalUtlAddStreamDataAndCreateStreamVerb(afb_api_t ap "cardId", createdStreamData->streamCardId); if(wrapRet) { AFB_API_ERROR(apiHandle,"Didn't succeed to allocate added stream event json object"); - HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, createdStreamData); + HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsDataListHead, createdStreamData); return NULL; } @@ -312,7 +365,6 @@ int HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(afb_api_t apiHandle, currentHalData = (struct HalData *) getExternalData(ctrlConfig); if((! currentHalData) || (! currentHalData->internalHalData) || - (! currentHalData->internalHalData->streamsData) || (! currentHalData->internalHalData->streamUpdates)) return -3; @@ -331,7 +383,7 @@ int HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(afb_api_t apiHandle, return -5; } - returnedErr = HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsData, toRemoveStreamData); + returnedErr = HalUtlRemoveSelectedMixerData(¤tHalData->internalHalData->streamsDataListHead, toRemoveStreamData); if(returnedErr) { AFB_API_ERROR(apiHandle, "Error %i while removing data for stream", @@ -369,7 +421,7 @@ int HalUtlRemoveStreamDataAndDeleteStreamVerb(afb_api_t apiHandle, ! currentHalData->internalHalData) return -3; - toRemoveStreamData = HalUtlSearchMixerDataByProperties(¤tHalData->internalHalData->streamsData, + toRemoveStreamData = HalUtlSearchMixerDataByProperties(¤tHalData->internalHalData->streamsDataListHead, verb, verbToCall, streamCardId); @@ -395,6 +447,8 @@ int HalUtlRemoveAllStreamsDataAndDeleteAllStreamsVerb(afb_api_t apiHandle) struct HalData *currentHalData; + struct InternalHalMixerData *currentMixerData, *savedMixerData; + if(! apiHandle) return -1; @@ -407,9 +461,8 @@ int HalUtlRemoveAllStreamsDataAndDeleteAllStreamsVerb(afb_api_t apiHandle) (! currentHalData->internalHalData)) return -3; - while(currentHalData->internalHalData->streamsData) { - if(HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(apiHandle, - currentHalData->internalHalData->streamsData)) + cds_list_for_each_entry_safe(currentMixerData, savedMixerData, ¤tHalData->internalHalData->streamsDataListHead, node) { + if(HalUtlRemoveStreamDataAndDeleteStreamVerbUsingMixerData(apiHandle, currentMixerData)) return -4; } |