From 0c697f4421a06ddd2ad4d74c202c5c293893aabf Mon Sep 17 00:00:00 2001 From: Ari Parkkila Date: Fri, 15 Feb 2019 00:12:15 -0800 Subject: [PATCH] Cellular: Fix sigio to be released in ATHandler destructor --- .../framework/AT/athandler/athandlertest.cpp | 9 ------ UNITTESTS/stubs/FileHandle_stub.h | 4 ++- features/cellular/framework/AT/ATHandler.cpp | 32 +++++++++++-------- features/cellular/framework/AT/ATHandler.h | 4 --- 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp b/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp index 34615e3de1..4f85540ddd 100644 --- a/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp +++ b/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp @@ -328,15 +328,6 @@ TEST_F(TestATHandler, test_ATHandler_process_oob) filehandle_stub_table = NULL; } -TEST_F(TestATHandler, test_ATHandler_set_filehandle_sigio) -{ - EventQueue que; - FileHandle_stub fh1; - - ATHandler at(&fh1, que, 0, ","); - at.set_filehandle_sigio(); -} - TEST_F(TestATHandler, test_ATHandler_flush) { EventQueue que; diff --git a/UNITTESTS/stubs/FileHandle_stub.h b/UNITTESTS/stubs/FileHandle_stub.h index f568d7e360..af8c6cc2b1 100644 --- a/UNITTESTS/stubs/FileHandle_stub.h +++ b/UNITTESTS/stubs/FileHandle_stub.h @@ -80,7 +80,9 @@ public: virtual void sigio(Callback func) { - func(); + if (func) { + func(); + } } short short_value; diff --git a/features/cellular/framework/AT/ATHandler.cpp b/features/cellular/framework/AT/ATHandler.cpp index 4066d42901..fe9a22c1c7 100644 --- a/features/cellular/framework/AT/ATHandler.cpp +++ b/features/cellular/framework/AT/ATHandler.cpp @@ -62,7 +62,7 @@ static const uint8_t map_3gpp_errors[][2] = { ATHandler::ATHandler(FileHandle *fh, EventQueue &queue, uint32_t timeout, const char *output_delimiter, uint16_t send_delay) : _nextATHandler(0), - _fileHandle(fh), + _fileHandle(NULL), // filehandle is set by set_file_handle() _queue(queue), _last_err(NSAPI_ERROR_OK), _last_3gpp_error(0), @@ -74,7 +74,7 @@ ATHandler::ATHandler(FileHandle *fh, EventQueue &queue, uint32_t timeout, const _last_response_stop(0), _oob_queued(false), _ref_count(1), - _is_fh_usable(true), + _is_fh_usable(false), _stop_tag(NULL), _delimiter(DEFAULT_DELIMITER), _prefix_matched(false), @@ -114,6 +114,8 @@ void ATHandler::set_debug(bool debug_on) ATHandler::~ATHandler() { + set_file_handle(NULL); + while (_oobs) { struct oob_t *oob = _oobs; _oobs = oob->next; @@ -146,17 +148,26 @@ FileHandle *ATHandler::get_file_handle() void ATHandler::set_file_handle(FileHandle *fh) { + if (_fileHandle) { + set_is_filehandle_usable(false); + } _fileHandle = fh; - _fileHandle->set_blocking(false); - set_filehandle_sigio(); + if (_fileHandle) { + set_is_filehandle_usable(true); + } } void ATHandler::set_is_filehandle_usable(bool usable) { - _is_fh_usable = usable; - if (usable) { - // set file handle sigio and blocking mode back - set_file_handle(_fileHandle); + if (_fileHandle) { + if (usable) { + _fileHandle->set_blocking(false); + _fileHandle->sigio(Callback(this, &ATHandler::event)); + } else { + _fileHandle->set_blocking(true); // set back to default state + _fileHandle->sigio(NULL); + } + _is_fh_usable = usable; } } @@ -308,11 +319,6 @@ void ATHandler::process_oob() unlock(); } -void ATHandler::set_filehandle_sigio() -{ - _fileHandle->sigio(Callback(this, &ATHandler::event)); -} - void ATHandler::reset_buffer() { _recv_pos = 0; diff --git a/features/cellular/framework/AT/ATHandler.h b/features/cellular/framework/AT/ATHandler.h index 0be1809567..50b10a5006 100644 --- a/features/cellular/framework/AT/ATHandler.h +++ b/features/cellular/framework/AT/ATHandler.h @@ -190,10 +190,6 @@ public: */ void process_oob(); - /** Set sigio for the current file handle. Sigio event goes through eventqueue so that it's handled in current thread. - */ - void set_filehandle_sigio(); - /** Set file handle, which is used for reading AT responses and writing AT commands * * @param fh file handle used for reading AT responses and writing AT commands