diff --git a/TinyFrame.c b/TinyFrame.c index 4ad41e7..93094cc 100644 --- a/TinyFrame.c +++ b/TinyFrame.c @@ -372,6 +372,12 @@ static void _TF_FN TF_HandleReceivedMessage(TinyFrame *tf) if (res == TF_RENEW) { renew_id_listener(ilst); } + else if (res == TF_CLOSE) { + // Set userdata to NULL to avoid calling user for cleanup + ilst->userdata = NULL; + ilst->userdata2 = NULL; + cleanup_id_listener(tf, i, ilst); + } return; } } @@ -389,8 +395,12 @@ static void _TF_FN TF_HandleReceivedMessage(TinyFrame *tf) res = tlst->fn(tf, &msg); if (res != TF_NEXT) { - // if it's TF_CLOSE, we assume user already cleaned up userdata - // TF_RENEW doesn't make sense here because type listeners don't expire + // type listeners don't have userdata. + // TF_RENEW doesn't make sense here because type listeners don't expire = same as TF_STAY + + if (res == TF_CLOSE) { + cleanup_type_listener(tf, i, tlst); + } return; } } @@ -404,8 +414,16 @@ static void _TF_FN TF_HandleReceivedMessage(TinyFrame *tf) res = glst->fn(tf, &msg); if (res != TF_NEXT) { - // if it's TF_CLOSE, we assume user already cleaned up userdata - // TF_RENEW doesn't make sense here because generic listeners don't expire + // generic listeners don't have userdata. + // TF_RENEW doesn't make sense here because generic listeners don't expire = same as TF_STAY + + // note: It's not expected that user will have multiple generic listeners, or + // ever actually remove them. They're most useful as default callbacks if no other listener + // handled the message. + + if (res == TF_CLOSE) { + cleanup_generic_listener(tf, i, glst); + } return; } }