diff --git a/net/udp/udp.h b/net/udp/udp.h index f131556816..86e2a3ce32 100644 --- a/net/udp/udp.h +++ b/net/udp/udp.h @@ -897,7 +897,7 @@ int udp_writebuffer_notifier_setup(worker_t worker, ****************************************************************************/ #ifdef CONFIG_NET_UDP_NOTIFIER -void udp_notifier_teardown(int key); +void udp_notifier_teardown(FAR void *key); #endif /**************************************************************************** diff --git a/net/udp/udp_notifier.c b/net/udp/udp_notifier.c index 82c78dad17..bb9b07d255 100644 --- a/net/udp/udp_notifier.c +++ b/net/udp/udp_notifier.c @@ -170,11 +170,11 @@ int udp_writebuffer_notifier_setup(worker_t worker, * ****************************************************************************/ -void udp_notifier_teardown(int key) +void udp_notifier_teardown(FAR void *key) { /* This is just a simple wrapper around work_notifier_teardown(). */ - work_notifier_teardown(key); + work_notifier_teardown(*(FAR int *)key); } /**************************************************************************** diff --git a/net/udp/udp_txdrain.c b/net/udp/udp_txdrain.c index 791cc0a518..62a04d6157 100644 --- a/net/udp/udp_txdrain.c +++ b/net/udp/udp_txdrain.c @@ -31,8 +31,10 @@ #include #include +#include #include #include +#include #include "utils/utils.h" #include "udp/udp.h" @@ -96,6 +98,10 @@ int udp_txdrain(FAR struct socket *psock, unsigned int timeout) DEBUGASSERT(psock->s_type == SOCK_DGRAM); + /* udp_txdrain() is a cancellation point */ + + enter_cancellation_point(); + conn = psock->s_conn; /* Initialize the wait semaphore */ @@ -112,18 +118,22 @@ int udp_txdrain(FAR struct socket *psock, unsigned int timeout) /* There is pending write data.. wait for it to drain. */ + tls_cleanup_push(tls_get_info(), udp_notifier_teardown, &key); ret = net_sem_timedwait_uninterruptible(&waitsem, timeout); /* Tear down the notifier (in case we timed out or were canceled) */ if (ret < 0) { - udp_notifier_teardown(key); + udp_notifier_teardown(&key); } + + tls_cleanup_pop(tls_get_info(), 0); } net_unlock(); nxsem_destroy(&waitsem); + leave_cancellation_point(); return ret; }