Tracing: Message Queue tracing
Add Message Queue tracing, default hooks, and documentation. Signed-off-by: Torbjörn Leksell <torbjorn.leksell@percepio.com>
This commit is contained in:
parent
69e8869127
commit
9ab447b3de
2 changed files with 148 additions and 2 deletions
|
@ -990,6 +990,109 @@
|
||||||
*/ /* end of stack_tracing_apis */
|
*/ /* end of stack_tracing_apis */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Message Queue Tracing APIs
|
||||||
|
* @defgroup msgq_tracing_apis Message Queue Tracing APIs
|
||||||
|
* @ingroup tracing_apis
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace initialization of Message Queue
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_init(msgq)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue alloc init attempt entry
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_alloc_init_enter(msgq)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue alloc init attempt outcome
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_alloc_init_exit(msgq, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue cleanup attempt entry
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_cleanup_enter(msgq)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue cleanup attempt outcome
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_cleanup_exit(msgq, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue put attempt entry
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_put_enter(msgq, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue put attempt blocking
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_put_blocking(msgq, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue put attempt outcome
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param timeout Timeout period
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_put_exit(msgq, timeout, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue get attempt entry
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_get_enter(msgq, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue get attempt blockings
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param timeout Timeout period
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_get_blocking(msgq, timeout)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue get attempt outcome
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param timeout Timeout period
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_get_exit(msgq, timeout, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue peek
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
* @param ret Return value
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_peek(msgq, ret)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Trace Message Queue purge
|
||||||
|
* @param msgq Message Queue object
|
||||||
|
*/
|
||||||
|
#define sys_port_trace_k_msgq_purge(msgq)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @}
|
||||||
|
*/ /* end of msgq_tracing_apis */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -69,6 +69,9 @@ void k_msgq_init(struct k_msgq *msgq, char *buffer, size_t msg_size,
|
||||||
#ifdef CONFIG_POLL
|
#ifdef CONFIG_POLL
|
||||||
sys_dlist_init(&msgq->poll_events);
|
sys_dlist_init(&msgq->poll_events);
|
||||||
#endif /* CONFIG_POLL */
|
#endif /* CONFIG_POLL */
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_INIT(k_msgq, msgq);
|
||||||
|
|
||||||
SYS_TRACING_OBJ_INIT(k_msgq, msgq);
|
SYS_TRACING_OBJ_INIT(k_msgq, msgq);
|
||||||
|
|
||||||
z_object_init(msgq);
|
z_object_init(msgq);
|
||||||
|
@ -81,6 +84,8 @@ int z_impl_k_msgq_alloc_init(struct k_msgq *msgq, size_t msg_size,
|
||||||
int ret;
|
int ret;
|
||||||
size_t total_size;
|
size_t total_size;
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, alloc_init, msgq);
|
||||||
|
|
||||||
if (size_mul_overflow(msg_size, max_msgs, &total_size)) {
|
if (size_mul_overflow(msg_size, max_msgs, &total_size)) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -94,6 +99,8 @@ int z_impl_k_msgq_alloc_init(struct k_msgq *msgq, size_t msg_size,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, alloc_init, msgq, ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +117,11 @@ int z_vrfy_k_msgq_alloc_init(struct k_msgq *msgq, size_t msg_size,
|
||||||
|
|
||||||
int k_msgq_cleanup(struct k_msgq *msgq)
|
int k_msgq_cleanup(struct k_msgq *msgq)
|
||||||
{
|
{
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, cleanup, msgq);
|
||||||
|
|
||||||
CHECKIF(z_waitq_head(&msgq->wait_q) != NULL) {
|
CHECKIF(z_waitq_head(&msgq->wait_q) != NULL) {
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, cleanup, msgq, -EBUSY);
|
||||||
|
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +129,9 @@ int k_msgq_cleanup(struct k_msgq *msgq)
|
||||||
k_free(msgq->buffer_start);
|
k_free(msgq->buffer_start);
|
||||||
msgq->flags &= ~K_MSGQ_FLAG_ALLOC;
|
msgq->flags &= ~K_MSGQ_FLAG_ALLOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, cleanup, msgq, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,10 +146,14 @@ int z_impl_k_msgq_put(struct k_msgq *msgq, const void *data, k_timeout_t timeout
|
||||||
|
|
||||||
key = k_spin_lock(&msgq->lock);
|
key = k_spin_lock(&msgq->lock);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, put, msgq, timeout);
|
||||||
|
|
||||||
if (msgq->used_msgs < msgq->max_msgs) {
|
if (msgq->used_msgs < msgq->max_msgs) {
|
||||||
/* message queue isn't full */
|
/* message queue isn't full */
|
||||||
pending_thread = z_unpend_first_thread(&msgq->wait_q);
|
pending_thread = z_unpend_first_thread(&msgq->wait_q);
|
||||||
if (pending_thread != NULL) {
|
if (pending_thread != NULL) {
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, put, msgq, timeout, 0);
|
||||||
|
|
||||||
/* give message to waiting thread */
|
/* give message to waiting thread */
|
||||||
(void)memcpy(pending_thread->base.swap_data, data,
|
(void)memcpy(pending_thread->base.swap_data, data,
|
||||||
msgq->msg_size);
|
msgq->msg_size);
|
||||||
|
@ -161,11 +179,18 @@ int z_impl_k_msgq_put(struct k_msgq *msgq, const void *data, k_timeout_t timeout
|
||||||
/* don't wait for message space to become available */
|
/* don't wait for message space to become available */
|
||||||
result = -ENOMSG;
|
result = -ENOMSG;
|
||||||
} else {
|
} else {
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_msgq, put, msgq, timeout);
|
||||||
|
|
||||||
/* wait for put message success, failure, or timeout */
|
/* wait for put message success, failure, or timeout */
|
||||||
_current->base.swap_data = (void *) data;
|
_current->base.swap_data = (void *) data;
|
||||||
return z_pend_curr(&msgq->lock, key, &msgq->wait_q, timeout);
|
|
||||||
|
result = z_pend_curr(&msgq->lock, key, &msgq->wait_q, timeout);
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, put, msgq, timeout, result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, put, msgq, timeout, result);
|
||||||
|
|
||||||
k_spin_unlock(&msgq->lock, key);
|
k_spin_unlock(&msgq->lock, key);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -211,6 +236,8 @@ int z_impl_k_msgq_get(struct k_msgq *msgq, void *data, k_timeout_t timeout)
|
||||||
|
|
||||||
key = k_spin_lock(&msgq->lock);
|
key = k_spin_lock(&msgq->lock);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, get, msgq, timeout);
|
||||||
|
|
||||||
if (msgq->used_msgs > 0U) {
|
if (msgq->used_msgs > 0U) {
|
||||||
/* take first available message from queue */
|
/* take first available message from queue */
|
||||||
(void)memcpy(data, msgq->read_ptr, msgq->msg_size);
|
(void)memcpy(data, msgq->read_ptr, msgq->msg_size);
|
||||||
|
@ -223,6 +250,8 @@ int z_impl_k_msgq_get(struct k_msgq *msgq, void *data, k_timeout_t timeout)
|
||||||
/* handle first thread waiting to write (if any) */
|
/* handle first thread waiting to write (if any) */
|
||||||
pending_thread = z_unpend_first_thread(&msgq->wait_q);
|
pending_thread = z_unpend_first_thread(&msgq->wait_q);
|
||||||
if (pending_thread != NULL) {
|
if (pending_thread != NULL) {
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_msgq, get, msgq, timeout);
|
||||||
|
|
||||||
/* add thread's message to queue */
|
/* add thread's message to queue */
|
||||||
(void)memcpy(msgq->write_ptr, pending_thread->base.swap_data,
|
(void)memcpy(msgq->write_ptr, pending_thread->base.swap_data,
|
||||||
msgq->msg_size);
|
msgq->msg_size);
|
||||||
|
@ -236,6 +265,9 @@ int z_impl_k_msgq_get(struct k_msgq *msgq, void *data, k_timeout_t timeout)
|
||||||
arch_thread_return_value_set(pending_thread, 0);
|
arch_thread_return_value_set(pending_thread, 0);
|
||||||
z_ready_thread(pending_thread);
|
z_ready_thread(pending_thread);
|
||||||
z_reschedule(&msgq->lock, key);
|
z_reschedule(&msgq->lock, key);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, get, msgq, timeout, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
result = 0;
|
result = 0;
|
||||||
|
@ -243,11 +275,18 @@ int z_impl_k_msgq_get(struct k_msgq *msgq, void *data, k_timeout_t timeout)
|
||||||
/* don't wait for a message to become available */
|
/* don't wait for a message to become available */
|
||||||
result = -ENOMSG;
|
result = -ENOMSG;
|
||||||
} else {
|
} else {
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_msgq, get, msgq, timeout);
|
||||||
|
|
||||||
/* wait for get message success or timeout */
|
/* wait for get message success or timeout */
|
||||||
_current->base.swap_data = data;
|
_current->base.swap_data = data;
|
||||||
return z_pend_curr(&msgq->lock, key, &msgq->wait_q, timeout);
|
|
||||||
|
result = z_pend_curr(&msgq->lock, key, &msgq->wait_q, timeout);
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, get, msgq, timeout, result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, get, msgq, timeout, result);
|
||||||
|
|
||||||
k_spin_unlock(&msgq->lock, key);
|
k_spin_unlock(&msgq->lock, key);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -281,6 +320,8 @@ int z_impl_k_msgq_peek(struct k_msgq *msgq, void *data)
|
||||||
result = -ENOMSG;
|
result = -ENOMSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC(k_msgq, peek, msgq, result);
|
||||||
|
|
||||||
k_spin_unlock(&msgq->lock, key);
|
k_spin_unlock(&msgq->lock, key);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -304,6 +345,8 @@ void z_impl_k_msgq_purge(struct k_msgq *msgq)
|
||||||
|
|
||||||
key = k_spin_lock(&msgq->lock);
|
key = k_spin_lock(&msgq->lock);
|
||||||
|
|
||||||
|
SYS_PORT_TRACING_OBJ_FUNC(k_msgq, purge, msgq);
|
||||||
|
|
||||||
/* wake up any threads that are waiting to write */
|
/* wake up any threads that are waiting to write */
|
||||||
while ((pending_thread = z_unpend_first_thread(&msgq->wait_q)) != NULL) {
|
while ((pending_thread = z_unpend_first_thread(&msgq->wait_q)) != NULL) {
|
||||||
arch_thread_return_value_set(pending_thread, -ENOMSG);
|
arch_thread_return_value_set(pending_thread, -ENOMSG);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue