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:
Torbjörn Leksell 2021-03-26 12:39:53 +01:00 committed by Anas Nashif
parent 69e8869127
commit 9ab447b3de
2 changed files with 148 additions and 2 deletions

View file

@ -990,6 +990,109 @@
*/ /* 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 */
/**
* @}
*/

View file

@ -69,6 +69,9 @@ void k_msgq_init(struct k_msgq *msgq, char *buffer, size_t msg_size,
#ifdef CONFIG_POLL
sys_dlist_init(&msgq->poll_events);
#endif /* CONFIG_POLL */
SYS_PORT_TRACING_OBJ_INIT(k_msgq, msgq);
SYS_TRACING_OBJ_INIT(k_msgq, 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;
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)) {
ret = -EINVAL;
} 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;
}
@ -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)
{
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, cleanup, msgq);
CHECKIF(z_waitq_head(&msgq->wait_q) != NULL) {
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, cleanup, msgq, -EBUSY);
return -EBUSY;
}
@ -118,6 +129,9 @@ int k_msgq_cleanup(struct k_msgq *msgq)
k_free(msgq->buffer_start);
msgq->flags &= ~K_MSGQ_FLAG_ALLOC;
}
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, cleanup, msgq, 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);
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, put, msgq, timeout);
if (msgq->used_msgs < msgq->max_msgs) {
/* message queue isn't full */
pending_thread = z_unpend_first_thread(&msgq->wait_q);
if (pending_thread != NULL) {
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, put, msgq, timeout, 0);
/* give message to waiting thread */
(void)memcpy(pending_thread->base.swap_data, data,
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 */
result = -ENOMSG;
} else {
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_msgq, put, msgq, timeout);
/* wait for put message success, failure, or timeout */
_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);
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);
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_msgq, get, msgq, timeout);
if (msgq->used_msgs > 0U) {
/* take first available message from queue */
(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) */
pending_thread = z_unpend_first_thread(&msgq->wait_q);
if (pending_thread != NULL) {
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_msgq, get, msgq, timeout);
/* add thread's message to queue */
(void)memcpy(msgq->write_ptr, pending_thread->base.swap_data,
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);
z_ready_thread(pending_thread);
z_reschedule(&msgq->lock, key);
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_msgq, get, msgq, timeout, 0);
return 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 */
result = -ENOMSG;
} else {
SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_msgq, get, msgq, timeout);
/* wait for get message success or timeout */
_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);
return result;
@ -281,6 +320,8 @@ int z_impl_k_msgq_peek(struct k_msgq *msgq, void *data)
result = -ENOMSG;
}
SYS_PORT_TRACING_OBJ_FUNC(k_msgq, peek, msgq, result);
k_spin_unlock(&msgq->lock, key);
return result;
@ -304,6 +345,8 @@ void z_impl_k_msgq_purge(struct k_msgq *msgq)
key = k_spin_lock(&msgq->lock);
SYS_PORT_TRACING_OBJ_FUNC(k_msgq, purge, msgq);
/* wake up any threads that are waiting to write */
while ((pending_thread = z_unpend_first_thread(&msgq->wait_q)) != NULL) {
arch_thread_return_value_set(pending_thread, -ENOMSG);