From: Richard Mudgett Date: Wed, 13 Jun 2018 16:33:44 +0000 (-0500) Subject: channel.c: Make CHECK_BLOCKING() save thread LWP id for messages. X-Git-Tag: 15.5.0-rc1~21^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d598931bad87b7877c54c451cab4c5641d1adfa;p=thirdparty%2Fasterisk.git channel.c: Make CHECK_BLOCKING() save thread LWP id for messages. * Removed an unnecessary call to ast_channel_blocker_set() in __ast_read(). ASTERISK-27625 Change-Id: I342168b999984666fb869cd519fe779583a73834 --- diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index d0c0dbf270..1a43d7b256 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -2773,11 +2773,12 @@ static inline enum ast_t38_state ast_channel_get_t38_state(struct ast_channel *c do { \ if (ast_test_flag(ast_channel_flags(c), AST_FLAG_BLOCKING)) { \ /* This should not happen as there should only be one thread handling a channel's media at a time. */ \ - ast_log(LOG_DEBUG, "Thread %p is blocking '%s', already blocked by thread %p in procedure %s\n", \ - (void *) pthread_self(), ast_channel_name(c), \ - (void *) ast_channel_blocker(c), ast_channel_blockproc(c)); \ + ast_log(LOG_DEBUG, "Thread LWP %d is blocking '%s', already blocked by thread LWP %d in procedure %s\n", \ + ast_get_tid(), ast_channel_name(c), \ + ast_channel_blocker_tid(c), ast_channel_blockproc(c)); \ ast_assert(0); \ } \ + ast_channel_blocker_tid_set((c), ast_get_tid()); \ ast_channel_blocker_set((c), pthread_self()); \ ast_channel_blockproc_set((c), __PRETTY_FUNCTION__); \ ast_set_flag(ast_channel_flags(c), AST_FLAG_BLOCKING); \ @@ -4423,6 +4424,9 @@ int ast_channel_fd_add(struct ast_channel *chan, int value); pthread_t ast_channel_blocker(const struct ast_channel *chan); void ast_channel_blocker_set(struct ast_channel *chan, pthread_t value); +int ast_channel_blocker_tid(const struct ast_channel *chan); +void ast_channel_blocker_tid_set(struct ast_channel *chan, int tid); + ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan); void ast_channel_timingfunc_set(struct ast_channel *chan, ast_timing_func_t value); diff --git a/main/channel.c b/main/channel.c index 6386de2dc9..5f5b208f4e 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2640,10 +2640,10 @@ void ast_hangup(struct ast_channel *chan) ast_channel_generator_set(chan, NULL); if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING)) { - ast_log(LOG_WARNING, "Hard hangup called by thread %ld on %s, while fd " - "is blocked by thread %ld in procedure %s! Expect a failure\n", - (long) pthread_self(), ast_channel_name(chan), (long)ast_channel_blocker(chan), ast_channel_blockproc(chan)); - ast_assert(ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING) == 0); + ast_log(LOG_WARNING, "Hard hangup called by thread LWP %d on %s, while blocked by thread LWP %d in procedure %s! Expect a failure\n", + ast_get_tid(), ast_channel_name(chan), ast_channel_blocker_tid(chan), + ast_channel_blockproc(chan)); + ast_assert(0); } if (ast_channel_tech(chan)->hangup) { @@ -3683,7 +3683,6 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio, int } } } else { - ast_channel_blocker_set(chan, pthread_self()); if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_EXCEPTION)) { if (ast_channel_tech(chan)->exception) f = ast_channel_tech(chan)->exception(chan); diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c index d31ce94d8b..b926514ca4 100644 --- a/main/channel_internal_api.c +++ b/main/channel_internal_api.c @@ -165,6 +165,7 @@ struct ast_channel { unsigned long insmpl; /*!< Track the read/written samples for monitor use */ unsigned long outsmpl; /*!< Track the read/written samples for monitor use */ + int blocker_tid; /*!< If anyone is blocking, this is their thread id */ AST_VECTOR(, int) fds; /*!< File descriptors for channel -- Drivers will poll on * these file descriptors, so at least one must be non -1. * See \arg \ref AstFileDesc */ @@ -1178,6 +1179,15 @@ void ast_channel_blocker_set(struct ast_channel *chan, pthread_t value) chan->blocker = value; } +int ast_channel_blocker_tid(const struct ast_channel *chan) +{ + return chan->blocker_tid; +} +void ast_channel_blocker_tid_set(struct ast_channel *chan, int value) +{ + chan->blocker_tid = value; +} + ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan) { return chan->timingfunc;