Cellular: Fix sigio to be released in ATHandler destructor

pull/9728/head
Ari Parkkila 2019-02-15 00:12:15 -08:00
parent 883b8b8f4f
commit 0c697f4421
4 changed files with 22 additions and 27 deletions

View File

@ -328,15 +328,6 @@ TEST_F(TestATHandler, test_ATHandler_process_oob)
filehandle_stub_table = NULL; 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) TEST_F(TestATHandler, test_ATHandler_flush)
{ {
EventQueue que; EventQueue que;

View File

@ -80,7 +80,9 @@ public:
virtual void sigio(Callback<void()> func) virtual void sigio(Callback<void()> func)
{ {
func(); if (func) {
func();
}
} }
short short_value; short short_value;

View File

@ -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) : ATHandler::ATHandler(FileHandle *fh, EventQueue &queue, uint32_t timeout, const char *output_delimiter, uint16_t send_delay) :
_nextATHandler(0), _nextATHandler(0),
_fileHandle(fh), _fileHandle(NULL), // filehandle is set by set_file_handle()
_queue(queue), _queue(queue),
_last_err(NSAPI_ERROR_OK), _last_err(NSAPI_ERROR_OK),
_last_3gpp_error(0), _last_3gpp_error(0),
@ -74,7 +74,7 @@ ATHandler::ATHandler(FileHandle *fh, EventQueue &queue, uint32_t timeout, const
_last_response_stop(0), _last_response_stop(0),
_oob_queued(false), _oob_queued(false),
_ref_count(1), _ref_count(1),
_is_fh_usable(true), _is_fh_usable(false),
_stop_tag(NULL), _stop_tag(NULL),
_delimiter(DEFAULT_DELIMITER), _delimiter(DEFAULT_DELIMITER),
_prefix_matched(false), _prefix_matched(false),
@ -114,6 +114,8 @@ void ATHandler::set_debug(bool debug_on)
ATHandler::~ATHandler() ATHandler::~ATHandler()
{ {
set_file_handle(NULL);
while (_oobs) { while (_oobs) {
struct oob_t *oob = _oobs; struct oob_t *oob = _oobs;
_oobs = oob->next; _oobs = oob->next;
@ -146,17 +148,26 @@ FileHandle *ATHandler::get_file_handle()
void ATHandler::set_file_handle(FileHandle *fh) void ATHandler::set_file_handle(FileHandle *fh)
{ {
if (_fileHandle) {
set_is_filehandle_usable(false);
}
_fileHandle = fh; _fileHandle = fh;
_fileHandle->set_blocking(false); if (_fileHandle) {
set_filehandle_sigio(); set_is_filehandle_usable(true);
}
} }
void ATHandler::set_is_filehandle_usable(bool usable) void ATHandler::set_is_filehandle_usable(bool usable)
{ {
_is_fh_usable = usable; if (_fileHandle) {
if (usable) { if (usable) {
// set file handle sigio and blocking mode back _fileHandle->set_blocking(false);
set_file_handle(_fileHandle); _fileHandle->sigio(Callback<void()>(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(); unlock();
} }
void ATHandler::set_filehandle_sigio()
{
_fileHandle->sigio(Callback<void()>(this, &ATHandler::event));
}
void ATHandler::reset_buffer() void ATHandler::reset_buffer()
{ {
_recv_pos = 0; _recv_pos = 0;

View File

@ -190,10 +190,6 @@ public:
*/ */
void process_oob(); 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 /** 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 * @param fh file handle used for reading AT responses and writing AT commands