diff options
-rw-r--r-- | src/4a-hal-manager/4a-hal-manager.c | 36 | ||||
-rw-r--r-- | src/4a-hal-manager/4a-hal-manager.h | 3 | ||||
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-cb.c | 2 |
3 files changed, 40 insertions, 1 deletions
diff --git a/src/4a-hal-manager/4a-hal-manager.c b/src/4a-hal-manager/4a-hal-manager.c index e21b948..84e39e5 100644 --- a/src/4a-hal-manager/4a-hal-manager.c +++ b/src/4a-hal-manager/4a-hal-manager.c @@ -65,7 +65,6 @@ static int HalMgrInitApi(afb_api_t apiHandle) if(! apiHandle) return -1; - // Retrieve section config from api handle halMgrData = (struct HalMgrData *) afb_api_get_userdata(apiHandle); if(! halMgrData) return -2; @@ -103,6 +102,8 @@ static int HalMgrInitApi(afb_api_t apiHandle) } } + on_exit(&HalMgrPrepareClosingApi, (void *) apiHandle); + return 0; } @@ -144,6 +145,39 @@ int HalMgrCreateApi(afb_api_t apiHandle, struct HalMgrData *halMgrData) return afb_api_new_api(apiHandle, HAL_MANAGER_API_NAME, HAL_MANAGER_API_INFO, 1, HalMgrLoadApi, halMgrData) ? 0 : -1; } +void HalMgrPrepareClosingApi(int code, void *closure) +{ + int err; + + afb_api_t apiHandle = (afb_api_t) closure; + + struct HalMgrData *halMgrData; + + if(! apiHandle) + return; + + AFB_API_ERROR(apiHandle, + "An interrupt signal has been received, prepare closing all hal api and 'hal-manager' api"); + + halMgrData = (struct HalMgrData *) afb_api_get_userdata(apiHandle); + if(! halMgrData) { + AFB_API_ERROR(apiHandle, + "Did not succeed to get 'hal-manager' data structure, will not be able " + "to close all hal api and 'hal-manager' api properly"); + return; + } + + err = InternalHalDeleteAllApi(apiHandle, halMgrData); + if(err) { + AFB_API_ERROR(apiHandle, "Error %i happened when tried to delete all hal api", err); + return; + } + + HalUtlRemoveHalMgrData(halMgrData); + + return; +} + /******************************************************************************* * Startup function * ******************************************************************************/ diff --git a/src/4a-hal-manager/4a-hal-manager.h b/src/4a-hal-manager/4a-hal-manager.h index d5f11e5..3818a7c 100644 --- a/src/4a-hal-manager/4a-hal-manager.h +++ b/src/4a-hal-manager/4a-hal-manager.h @@ -23,4 +23,7 @@ #define HAL_MANAGER_API_NAME "4a-hal-manager" #define HAL_MANAGER_API_INFO "Manager for 4A HAL APIs" +// Function to be called when +void HalMgrPrepareClosingApi(int code, void *closure); + #endif /* _HALMGR_BINDING_INCLUDE_ */
\ No newline at end of file diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c index c1078a9..78bbcb4 100644 --- a/src/4a-internals-hal/4a-internals-hal-cb.c +++ b/src/4a-internals-hal/4a-internals-hal-cb.c @@ -1142,7 +1142,9 @@ int InternalHalUnmanageOneHalMapObject(afb_api_t apiHandle, struct InternalHalAl halMapData->action = NULL; if(halMapData->ctl.alsaCtlCreation) { + // TODO JAI : Enable next line when 'afb_api_call_sync' while in exit will be allowed err = InternalHalDeleteAlsaCtl(apiHandle, cardNbString, &halMapData->ctl); + // err = 0; if(err) AFB_API_WARNING(apiHandle, "Error %i returned when tried to custom ALSA control '%s', " |