Lines Matching refs:pipe
17 static inline bool pipe_closed(struct k_pipe *pipe) in pipe_closed() argument
19 return (pipe->flags & PIPE_FLAG_OPEN) == 0; in pipe_closed()
22 static inline bool pipe_resetting(struct k_pipe *pipe) in pipe_resetting() argument
24 return (pipe->flags & PIPE_FLAG_RESET) != 0; in pipe_resetting()
27 static inline bool pipe_full(struct k_pipe *pipe) in pipe_full() argument
29 return ring_buf_space_get(&pipe->buf) == 0; in pipe_full()
32 static inline bool pipe_empty(struct k_pipe *pipe) in pipe_empty() argument
34 return ring_buf_is_empty(&pipe->buf); in pipe_empty()
37 static int wait_for(_wait_q_t *waitq, struct k_pipe *pipe, k_spinlock_key_t *key, in wait_for() argument
47 pipe->waiting++; in wait_for()
49 if (waitq == &pipe->space) { in wait_for()
50 SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_pipe, write, pipe, timeout); in wait_for()
52 SYS_PORT_TRACING_OBJ_FUNC_BLOCKING(k_pipe, read, pipe, timeout); in wait_for()
54 rc = z_pend_curr(&pipe->lock, *key, waitq, timeout); in wait_for()
55 *key = k_spin_lock(&pipe->lock); in wait_for()
56 pipe->waiting--; in wait_for()
57 if (unlikely(pipe_resetting(pipe))) { in wait_for()
58 if (pipe->waiting == 0) { in wait_for()
59 pipe->flags &= ~PIPE_FLAG_RESET; in wait_for()
67 void z_impl_k_pipe_init(struct k_pipe *pipe, uint8_t *buffer, size_t buffer_size) in z_impl_k_pipe_init() argument
69 ring_buf_init(&pipe->buf, buffer_size, buffer); in z_impl_k_pipe_init()
70 pipe->flags = PIPE_FLAG_OPEN; in z_impl_k_pipe_init()
71 pipe->waiting = 0; in z_impl_k_pipe_init()
73 pipe->lock = (struct k_spinlock){}; in z_impl_k_pipe_init()
74 z_waitq_init(&pipe->data); in z_impl_k_pipe_init()
75 z_waitq_init(&pipe->space); in z_impl_k_pipe_init()
76 k_object_init(pipe); in z_impl_k_pipe_init()
79 sys_dlist_init(&pipe->poll_events); in z_impl_k_pipe_init()
82 k_obj_core_init_and_link(K_OBJ_CORE(pipe), &obj_type_pipe); in z_impl_k_pipe_init()
84 SYS_PORT_TRACING_OBJ_INIT(k_pipe, pipe, buffer, buffer_size); in z_impl_k_pipe_init()
93 static size_t copy_to_pending_readers(struct k_pipe *pipe, bool *need_resched, in copy_to_pending_readers() argument
110 reader = _priq_wait_best(&pipe->data.waitq); in copy_to_pending_readers()
147 int z_impl_k_pipe_write(struct k_pipe *pipe, const uint8_t *data, size_t len, k_timeout_t timeout) in z_impl_k_pipe_write() argument
152 k_spinlock_key_t key = k_spin_lock(&pipe->lock); in z_impl_k_pipe_write()
155 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_pipe, write, pipe, data, len, timeout); in z_impl_k_pipe_write()
157 if (unlikely(pipe_resetting(pipe))) { in z_impl_k_pipe_write()
163 if (unlikely(pipe_closed(pipe))) { in z_impl_k_pipe_write()
168 if (pipe_empty(pipe)) { in z_impl_k_pipe_write()
179 need_resched = z_sched_wake_all(&pipe->data, 0, NULL); in z_impl_k_pipe_write()
180 } else if (pipe->waiting != 0) { in z_impl_k_pipe_write()
181 written += copy_to_pending_readers(pipe, &need_resched, in z_impl_k_pipe_write()
190 z_handle_obj_poll_events(&pipe->poll_events, in z_impl_k_pipe_write()
195 written += ring_buf_put(&pipe->buf, &data[written], len - written); in z_impl_k_pipe_write()
201 rc = wait_for(&pipe->space, pipe, &key, end, &need_resched); in z_impl_k_pipe_write()
210 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_pipe, write, pipe, rc); in z_impl_k_pipe_write()
212 z_reschedule(&pipe->lock, key); in z_impl_k_pipe_write()
214 k_spin_unlock(&pipe->lock, key); in z_impl_k_pipe_write()
219 int z_impl_k_pipe_read(struct k_pipe *pipe, uint8_t *data, size_t len, k_timeout_t timeout) in z_impl_k_pipe_read() argument
224 k_spinlock_key_t key = k_spin_lock(&pipe->lock); in z_impl_k_pipe_read()
227 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_pipe, read, pipe, data, len, timeout); in z_impl_k_pipe_read()
229 if (unlikely(pipe_resetting(pipe))) { in z_impl_k_pipe_read()
235 if (pipe_full(pipe)) { in z_impl_k_pipe_read()
237 need_resched = z_sched_wake_all(&pipe->space, 0, NULL); in z_impl_k_pipe_read()
240 buf.used += ring_buf_get(&pipe->buf, &data[buf.used], len - buf.used); in z_impl_k_pipe_read()
246 if (unlikely(pipe_closed(pipe))) { in z_impl_k_pipe_read()
254 rc = wait_for(&pipe->data, pipe, &key, end, &need_resched); in z_impl_k_pipe_read()
263 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_pipe, read, pipe, rc); in z_impl_k_pipe_read()
265 z_reschedule(&pipe->lock, key); in z_impl_k_pipe_read()
267 k_spin_unlock(&pipe->lock, key); in z_impl_k_pipe_read()
272 void z_impl_k_pipe_reset(struct k_pipe *pipe) in z_impl_k_pipe_reset() argument
274 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_pipe, reset, pipe); in z_impl_k_pipe_reset()
275 K_SPINLOCK(&pipe->lock) { in z_impl_k_pipe_reset()
276 ring_buf_reset(&pipe->buf); in z_impl_k_pipe_reset()
277 if (likely(pipe->waiting != 0)) { in z_impl_k_pipe_reset()
278 pipe->flags |= PIPE_FLAG_RESET; in z_impl_k_pipe_reset()
279 z_sched_wake_all(&pipe->data, 0, NULL); in z_impl_k_pipe_reset()
280 z_sched_wake_all(&pipe->space, 0, NULL); in z_impl_k_pipe_reset()
283 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_pipe, reset, pipe); in z_impl_k_pipe_reset()
286 void z_impl_k_pipe_close(struct k_pipe *pipe) in z_impl_k_pipe_close() argument
288 SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_pipe, close, pipe); in z_impl_k_pipe_close()
289 K_SPINLOCK(&pipe->lock) { in z_impl_k_pipe_close()
290 pipe->flags = 0; in z_impl_k_pipe_close()
291 z_sched_wake_all(&pipe->data, 0, NULL); in z_impl_k_pipe_close()
292 z_sched_wake_all(&pipe->space, 0, NULL); in z_impl_k_pipe_close()
294 SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_pipe, close, pipe); in z_impl_k_pipe_close()
298 void z_vrfy_k_pipe_init(struct k_pipe *pipe, uint8_t *buffer, size_t buffer_size) in z_vrfy_k_pipe_init() argument
300 K_OOPS(K_SYSCALL_OBJ(pipe, K_OBJ_PIPE)); in z_vrfy_k_pipe_init()
303 z_impl_k_pipe_init(pipe, buffer, buffer_size); in z_vrfy_k_pipe_init()
307 int z_vrfy_k_pipe_read(struct k_pipe *pipe, uint8_t *data, size_t len, k_timeout_t timeout) in z_vrfy_k_pipe_read() argument
309 K_OOPS(K_SYSCALL_OBJ(pipe, K_OBJ_PIPE)); in z_vrfy_k_pipe_read()
312 return z_impl_k_pipe_read(pipe, data, len, timeout); in z_vrfy_k_pipe_read()
316 int z_vrfy_k_pipe_write(struct k_pipe *pipe, const uint8_t *data, size_t len, k_timeout_t timeout) in z_vrfy_k_pipe_write() argument
318 K_OOPS(K_SYSCALL_OBJ(pipe, K_OBJ_PIPE)); in z_vrfy_k_pipe_write()
321 return z_impl_k_pipe_write(pipe, data, len, timeout); in z_vrfy_k_pipe_write()
325 void z_vrfy_k_pipe_reset(struct k_pipe *pipe) in z_vrfy_k_pipe_reset() argument
327 K_OOPS(K_SYSCALL_OBJ(pipe, K_OBJ_PIPE)); in z_vrfy_k_pipe_reset()
328 z_impl_k_pipe_reset(pipe); in z_vrfy_k_pipe_reset()
332 void z_vrfy_k_pipe_close(struct k_pipe *pipe) in z_vrfy_k_pipe_close() argument
334 K_OOPS(K_SYSCALL_OBJ(pipe, K_OBJ_PIPE)); in z_vrfy_k_pipe_close()
335 z_impl_k_pipe_close(pipe); in z_vrfy_k_pipe_close()
348 STRUCT_SECTION_FOREACH(k_pipe, pipe) { in init_pipe_obj_core_list()
349 k_obj_core_init_and_link(K_OBJ_CORE(pipe), &obj_type_pipe); in init_pipe_obj_core_list()