mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
taskprocessor.c: New API for human friendly taskprocessor names.
* Add new API call to get a sequence number for use in human friendly taskprocessor names. * Add new API call to create a taskprocessor name in a given buffer and append a sequence number. Change-Id: Iac458f05b45232315ed64aa31b1df05b875537a9
This commit is contained in:
@@ -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
|
||||
|
@@ -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());
|
||||
}
|
||||
|
Reference in New Issue
Block a user