diff --git a/include/asterisk/taskprocessor.h b/include/asterisk/taskprocessor.h index 6ebf0729cc7669dba73f071578787eee42291f67..af3ce747f6382d7a6d5f8c0ec9373ec3fa1c30b0 100644 --- a/include/asterisk/taskprocessor.h +++ b/include/asterisk/taskprocessor.h @@ -56,6 +56,9 @@ struct ast_taskprocessor; +/*! \brief Suggested maximum taskprocessor name length (less null terminator). */ +#define AST_TASKPROCESSOR_MAX_NAME 45 + #define AST_TASKPROCESSOR_HIGH_WATER_LEVEL 500 /*! @@ -258,6 +261,30 @@ int ast_taskprocessor_execute(struct ast_taskprocessor *tps); */ int ast_taskprocessor_is_task(struct ast_taskprocessor *tps); +/*! + * \brief Get the next sequence number to create a human friendly taskprocessor name. + * \since 13.8.0 + * + * \return Sequence number for use in creating human friendly taskprocessor names. + */ +unsigned int ast_taskprocessor_seq_num(void); + +/*! + * \brief Build a taskprocessor name with a sequence number on the end. + * \since 13.8.0 + * + * \param buf Where to put the built taskprocessor name. + * \param size How large is buf including null terminator. + * \param format printf format to create the non-sequenced part of the name. + * + * \note The user supplied part of the taskprocessor name is truncated + * to allow the full sequence number to be appended within the supplied + * buffer size. + * + * \return Nothing + */ +void __attribute__((format(printf, 3, 4))) ast_taskprocessor_build_name(char *buf, unsigned int size, const char *format, ...); + /*! * \brief Return the name of the taskprocessor singleton * \since 1.6.1 diff --git a/main/taskprocessor.c b/main/taskprocessor.c index 0b67c0f7aba680f94e77c658aefb16e36bc500bb..9a4424ea3287ba5eb33d77c979adb72a3187f4f4 100644 --- a/main/taskprocessor.c +++ b/main/taskprocessor.c @@ -879,3 +879,37 @@ int ast_taskprocessor_is_task(struct ast_taskprocessor *tps) ao2_unlock(tps); return is_task; } + +unsigned int ast_taskprocessor_seq_num(void) +{ + static int seq_num; + + return (unsigned int) ast_atomic_fetchadd_int(&seq_num, +1); +} + +void ast_taskprocessor_build_name(char *buf, unsigned int size, const char *format, ...) +{ + va_list ap; + int user_size; +#define SEQ_STR_SIZE (1 + 8 + 1) /* Dash plus 8 hex digits plus null terminator */ + + ast_assert(buf != NULL); + ast_assert(SEQ_STR_SIZE <= size); + + va_start(ap, format); + user_size = vsnprintf(buf, size - (SEQ_STR_SIZE - 1), format, ap); + va_end(ap); + if (user_size < 0) { + /* + * Wow! We got an output error to a memory buffer. + * Assume no user part of name written. + */ + user_size = 0; + } else if (size < user_size + SEQ_STR_SIZE) { + /* Truncate user part of name to make sequence number fit. */ + user_size = size - SEQ_STR_SIZE; + } + + /* Append sequence number to end of user name. */ + snprintf(buf + user_size, SEQ_STR_SIZE, "-%08x", ast_taskprocessor_seq_num()); +}