@@ -18,6 +18,13 @@ struct k_p4wq_work;
1818 */
1919typedef void (* k_p4wq_handler_t )(struct k_p4wq_work * work );
2020
21+ /**
22+ * Optional P4 Queue done callback.
23+ * Will be called after the memory structure is not used anymore by the p4wq.
24+ * If it is not used it must be set to NULL.
25+ */
26+ typedef void (* k_p4wq_done_handler_t )(struct k_p4wq_work * work );
27+
2128/**
2229 * @brief P4 Queue Work Item
2330 *
@@ -74,6 +81,11 @@ struct k_p4wq {
7481
7582 /* K_P4WQ_* flags above */
7683 uint32_t flags ;
84+
85+ /* done handler which is called every time after work was successfully executed
86+ * and k_p4wq_work is not needed by p4wq anymore
87+ */
88+ k_p4wq_done_handler_t done_handler ;
7789};
7890
7991struct k_p4wq_initparam {
@@ -83,6 +95,7 @@ struct k_p4wq_initparam {
8395 struct k_thread * threads ;
8496 struct z_thread_stack_element * stacks ;
8597 uint32_t flags ;
98+ k_p4wq_done_handler_t done_handler ;
8699};
87100
88101/**
@@ -95,8 +108,9 @@ struct k_p4wq_initparam {
95108 * @param name Symbol name of the struct k_p4wq that will be defined
96109 * @param n_threads Number of threads in the work queue pool
97110 * @param stack_sz Requested stack size of each thread, in bytes
111+ * @param dn_handler Function pointer to handler of type k_p4wq_done_handler_t
98112 */
99- #define K_P4WQ_DEFINE (name , n_threads , stack_sz ) \
113+ #define K_P4WQ_DEFINE_WITH_DONE_HANDLER (name , n_threads , stack_sz , dn_handler ) \
100114 static K_THREAD_STACK_ARRAY_DEFINE(_p4stacks_##name, \
101115 n_threads, stack_sz); \
102116 static struct k_thread _p4threads_##name[n_threads]; \
@@ -109,8 +123,19 @@ struct k_p4wq_initparam {
109123 .stacks = &(_p4stacks_##name[0][0]), \
110124 .queue = &name, \
111125 .flags = 0, \
126+ .done_handler = dn_handler, \
112127 }
113128
129+ /**
130+ * @brief Statically initialize a P4 Work Queue
131+ *
132+ * Same like K_P4WQ_DEFINE_WITH_DONE_HANDLER but without an
133+ * optional handler which is called everytime when work is executed
134+ * and not used anymore by the p4wq
135+ */
136+ #define K_P4WQ_DEFINE (name , n_threads , stack_sz ) \
137+ K_P4WQ_DEFINE_WITH_DONE_HANDLER(name, n_threads, stack_sz, NULL)
138+
114139/**
115140 * @brief Statically initialize an array of P4 Work Queues
116141 *
@@ -122,8 +147,9 @@ struct k_p4wq_initparam {
122147 * @param n_threads Number of threads and work queues
123148 * @param stack_sz Requested stack size of each thread, in bytes
124149 * @param flg Flags
150+ * @param dn_handler Function pointer to handler of type k_p4wq_done_handler_t
125151 */
126- #define K_P4WQ_ARRAY_DEFINE (name , n_threads , stack_sz , flg ) \
152+ #define K_P4WQ_ARRAY_DEFINE_WITH_DONE_HANDLER (name , n_threads , stack_sz , flg , dn_handler ) \
127153 static K_THREAD_STACK_ARRAY_DEFINE(_p4stacks_##name, \
128154 n_threads, stack_sz); \
129155 static struct k_thread _p4threads_##name[n_threads]; \
@@ -136,8 +162,19 @@ struct k_p4wq_initparam {
136162 .stacks = &(_p4stacks_##name[0][0]), \
137163 .queue = name, \
138164 .flags = K_P4WQ_QUEUE_PER_THREAD | flg, \
165+ .done_handler = dn_handler, \
139166 }
140167
168+ /**
169+ * @brief Statically initialize an array of P4 Work Queues
170+ *
171+ * Same like K_P4WQ_ARRAY_DEFINE_WITH_DONE_HANDLER but without an
172+ * optional handler which is called everytime when work is executed
173+ * and not used anymore by the p4wq
174+ */
175+ #define K_P4WQ_ARRAY_DEFINE (name , n_threads , stack_sz , flg ) \
176+ K_P4WQ_ARRAY_DEFINE_WITH_DONE_HANDLER(name, n_threads, stack_sz, flg, NULL)
177+
141178/**
142179 * @brief Initialize P4 Queue
143180 *
0 commit comments