diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index 40cae5d..9c017a5 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -78,6 +78,7 @@ typedef struct { mraa_result_t (*i2c_stop_replace) (mraa_i2c_context dev); mraa_result_t (*aio_init_internal_replace) (mraa_aio_context dev, int pin); + mraa_result_t (*aio_close_replace) (mraa_aio_context dev); int (*aio_read_replace) (mraa_aio_context dev); mraa_result_t (*aio_get_valid_fp) (mraa_aio_context dev); mraa_result_t (*aio_init_pre) (unsigned int aio); diff --git a/src/aio/aio.c b/src/aio/aio.c index 35a2c43..16a203f 100644 --- a/src/aio/aio.c +++ b/src/aio/aio.c @@ -225,13 +225,22 @@ mraa_aio_read_float(mraa_aio_context dev) mraa_result_t mraa_aio_close(mraa_aio_context dev) { - if (NULL != dev) { - if (dev->adc_in_fp != -1) - close(dev->adc_in_fp); - free(dev); + if (dev == NULL) { + syslog(LOG_ERR, "aio: close: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; } - return (MRAA_SUCCESS); + if (IS_FUNC_DEFINED(dev, aio_close_replace)) { + return dev->advance_func->aio_close_replace(dev); + } + + if (dev->adc_in_fp != -1) { + close(dev->adc_in_fp); + } + + free(dev); + + return MRAA_SUCCESS; } mraa_result_t