mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
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
This commit is contained in:
@@ -2664,11 +2664,12 @@ static inline enum ast_t38_state ast_channel_get_t38_state(struct ast_channel *c
|
|||||||
do { \
|
do { \
|
||||||
if (ast_test_flag(ast_channel_flags(c), AST_FLAG_BLOCKING)) { \
|
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. */ \
|
/* 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", \
|
ast_log(LOG_DEBUG, "Thread LWP %d is blocking '%s', already blocked by thread LWP %d in procedure %s\n", \
|
||||||
(void *) pthread_self(), ast_channel_name(c), \
|
ast_get_tid(), ast_channel_name(c), \
|
||||||
(void *) ast_channel_blocker(c), ast_channel_blockproc(c)); \
|
ast_channel_blocker_tid(c), ast_channel_blockproc(c)); \
|
||||||
ast_assert(0); \
|
ast_assert(0); \
|
||||||
} \
|
} \
|
||||||
|
ast_channel_blocker_tid_set((c), ast_get_tid()); \
|
||||||
ast_channel_blocker_set((c), pthread_self()); \
|
ast_channel_blocker_set((c), pthread_self()); \
|
||||||
ast_channel_blockproc_set((c), __PRETTY_FUNCTION__); \
|
ast_channel_blockproc_set((c), __PRETTY_FUNCTION__); \
|
||||||
ast_set_flag(ast_channel_flags(c), AST_FLAG_BLOCKING); \
|
ast_set_flag(ast_channel_flags(c), AST_FLAG_BLOCKING); \
|
||||||
@@ -4316,6 +4317,9 @@ void ast_channel_internal_epfd_data_set(struct ast_channel *chan, int which , st
|
|||||||
pthread_t ast_channel_blocker(const struct ast_channel *chan);
|
pthread_t ast_channel_blocker(const struct ast_channel *chan);
|
||||||
void ast_channel_blocker_set(struct ast_channel *chan, pthread_t value);
|
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);
|
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);
|
void ast_channel_timingfunc_set(struct ast_channel *chan, ast_timing_func_t value);
|
||||||
|
|
||||||
|
@@ -2735,10 +2735,10 @@ void ast_hangup(struct ast_channel *chan)
|
|||||||
ast_channel_generator_set(chan, NULL);
|
ast_channel_generator_set(chan, NULL);
|
||||||
|
|
||||||
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING)) {
|
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 "
|
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",
|
||||||
"is blocked by thread %ld in procedure %s! Expect a failure\n",
|
ast_get_tid(), ast_channel_name(chan), ast_channel_blocker_tid(chan),
|
||||||
(long) pthread_self(), ast_channel_name(chan), (long)ast_channel_blocker(chan), ast_channel_blockproc(chan));
|
ast_channel_blockproc(chan));
|
||||||
ast_assert(ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING) == 0);
|
ast_assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ast_channel_tech(chan)->hangup) {
|
if (ast_channel_tech(chan)->hangup) {
|
||||||
@@ -3964,7 +3964,6 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ast_channel_blocker_set(chan, pthread_self());
|
|
||||||
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_EXCEPTION)) {
|
if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_EXCEPTION)) {
|
||||||
if (ast_channel_tech(chan)->exception)
|
if (ast_channel_tech(chan)->exception)
|
||||||
f = ast_channel_tech(chan)->exception(chan);
|
f = ast_channel_tech(chan)->exception(chan);
|
||||||
|
@@ -169,6 +169,7 @@ struct ast_channel {
|
|||||||
unsigned long insmpl; /*!< Track the read/written samples for monitor use */
|
unsigned long insmpl; /*!< Track the read/written samples for monitor use */
|
||||||
unsigned long outsmpl; /*!< 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 */
|
||||||
int fds[AST_MAX_FDS]; /*!< File descriptors for channel -- Drivers will poll on
|
int fds[AST_MAX_FDS]; /*!< File descriptors for channel -- Drivers will poll on
|
||||||
* these file descriptors, so at least one must be non -1.
|
* these file descriptors, so at least one must be non -1.
|
||||||
* See \arg \ref AstFileDesc */
|
* See \arg \ref AstFileDesc */
|
||||||
@@ -1331,6 +1332,15 @@ void ast_channel_blocker_set(struct ast_channel *chan, pthread_t value)
|
|||||||
chan->blocker = 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)
|
ast_timing_func_t ast_channel_timingfunc(const struct ast_channel *chan)
|
||||||
{
|
{
|
||||||
return chan->timingfunc;
|
return chan->timingfunc;
|
||||||
|
Reference in New Issue
Block a user