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); \
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);
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) {
}
}
} 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);
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 */
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;