Lines Matching full:ring
37 * Concurrent ring buffer.
57 ck_ring_size(const struct ck_ring *ring) in ck_ring_size() argument
61 c = ck_pr_load_uint(&ring->c_head); in ck_ring_size()
62 p = ck_pr_load_uint(&ring->p_tail); in ck_ring_size()
63 return (p - c) & ring->mask; in ck_ring_size()
67 ck_ring_capacity(const struct ck_ring *ring) in ck_ring_capacity() argument
70 return ring->size; in ck_ring_capacity()
75 * on the ring. This is primarily meant for persistent ck_ring use-cases. The
76 * function returns true if any mutations were performed on the ring.
79 ck_ring_repair(struct ck_ring *ring) in ck_ring_repair() argument
83 if (ring->p_tail != ring->p_head) { in ck_ring_repair()
84 ring->p_tail = ring->p_head; in ck_ring_repair()
92 * This can be called when no concurrent updates are occurring on the ring
94 * persistent storage of the ring. If this functions returns false, the ring
98 ck_ring_valid(const struct ck_ring *ring) in ck_ring_valid() argument
100 unsigned int size = ring->size; in ck_ring_valid()
101 unsigned int c_head = ring->c_head; in ck_ring_valid()
102 unsigned int p_head = ring->p_head; in ck_ring_valid()
104 /* The ring must be a power of 2. */ in ck_ring_valid()
120 ck_ring_init(struct ck_ring *ring, unsigned int size) in ck_ring_init() argument
123 ring->size = size; in ck_ring_init()
124 ring->mask = size - 1; in ck_ring_init()
125 ring->p_tail = 0; in ck_ring_init()
126 ring->p_head = 0; in ck_ring_init()
127 ring->c_head = 0; in ck_ring_init()
140 _ck_ring_enqueue_reserve_sp(struct ck_ring *ring, in _ck_ring_enqueue_reserve_sp() argument
145 const unsigned int mask = ring->mask; in _ck_ring_enqueue_reserve_sp()
148 consumer = ck_pr_load_uint(&ring->c_head); in _ck_ring_enqueue_reserve_sp()
149 producer = ring->p_tail; in _ck_ring_enqueue_reserve_sp()
165 _ck_ring_enqueue_commit_sp(struct ck_ring *ring) in _ck_ring_enqueue_commit_sp() argument
169 ck_pr_store_uint(&ring->p_tail, ring->p_tail + 1); in _ck_ring_enqueue_commit_sp()
174 _ck_ring_enqueue_sp(struct ck_ring *ring, in _ck_ring_enqueue_sp() argument
180 const unsigned int mask = ring->mask; in _ck_ring_enqueue_sp()
183 consumer = ck_pr_load_uint(&ring->c_head); in _ck_ring_enqueue_sp()
184 producer = ring->p_tail; in _ck_ring_enqueue_sp()
200 ck_pr_store_uint(&ring->p_tail, delta); in _ck_ring_enqueue_sp()
205 _ck_ring_enqueue_sp_size(struct ck_ring *ring, in _ck_ring_enqueue_sp_size() argument
214 r = _ck_ring_enqueue_sp(ring, buffer, entry, ts, &sz); in _ck_ring_enqueue_sp_size()
220 _ck_ring_dequeue_sc(struct ck_ring *ring, in _ck_ring_dequeue_sc() argument
225 const unsigned int mask = ring->mask; in _ck_ring_dequeue_sc()
228 consumer = ring->c_head; in _ck_ring_dequeue_sc()
229 producer = ck_pr_load_uint(&ring->p_tail); in _ck_ring_dequeue_sc()
248 ck_pr_store_uint(&ring->c_head, consumer + 1); in _ck_ring_dequeue_sc()
253 _ck_ring_enqueue_reserve_mp(struct ck_ring *ring, in _ck_ring_enqueue_reserve_mp() argument
259 const unsigned int mask = ring->mask; in _ck_ring_enqueue_reserve_mp()
262 producer = ck_pr_load_uint(&ring->p_head); in _ck_ring_enqueue_reserve_mp()
266 consumer = ck_pr_load_uint(&ring->c_head); in _ck_ring_enqueue_reserve_mp()
271 if (ck_pr_cas_uint_value(&ring->p_head, in _ck_ring_enqueue_reserve_mp()
279 new_producer = ck_pr_load_uint(&ring->p_head); in _ck_ring_enqueue_reserve_mp()
300 _ck_ring_enqueue_commit_mp(struct ck_ring *ring, unsigned int producer) in _ck_ring_enqueue_commit_mp() argument
303 while (ck_pr_load_uint(&ring->p_tail) != producer) in _ck_ring_enqueue_commit_mp()
307 ck_pr_store_uint(&ring->p_tail, producer + 1); in _ck_ring_enqueue_commit_mp()
312 _ck_ring_enqueue_mp(struct ck_ring *ring, in _ck_ring_enqueue_mp() argument
318 const unsigned int mask = ring->mask; in _ck_ring_enqueue_mp()
322 producer = ck_pr_load_uint(&ring->p_head); in _ck_ring_enqueue_mp()
330 consumer = ck_pr_load_uint(&ring->c_head); in _ck_ring_enqueue_mp()
339 if (ck_pr_cas_uint_value(&ring->p_head, in _ck_ring_enqueue_mp()
353 new_producer = ck_pr_load_uint(&ring->p_head); in _ck_ring_enqueue_mp()
378 * their data into the ring buffer. in _ck_ring_enqueue_mp()
380 while (ck_pr_load_uint(&ring->p_tail) != producer) in _ck_ring_enqueue_mp()
388 ck_pr_store_uint(&ring->p_tail, delta); in _ck_ring_enqueue_mp()
398 _ck_ring_enqueue_mp_size(struct ck_ring *ring, in _ck_ring_enqueue_mp_size() argument
407 r = _ck_ring_enqueue_mp(ring, buffer, entry, ts, &sz); in _ck_ring_enqueue_mp_size()
413 _ck_ring_trydequeue_mc(struct ck_ring *ring, in _ck_ring_trydequeue_mc() argument
418 const unsigned int mask = ring->mask; in _ck_ring_trydequeue_mc()
421 consumer = ck_pr_load_uint(&ring->c_head); in _ck_ring_trydequeue_mc()
423 producer = ck_pr_load_uint(&ring->p_tail); in _ck_ring_trydequeue_mc()
434 return ck_pr_cas_uint(&ring->c_head, consumer, consumer + 1); in _ck_ring_trydequeue_mc()
438 _ck_ring_dequeue_mc(struct ck_ring *ring, in _ck_ring_dequeue_mc() argument
443 const unsigned int mask = ring->mask; in _ck_ring_dequeue_mc()
446 consumer = ck_pr_load_uint(&ring->c_head); in _ck_ring_dequeue_mc()
456 producer = ck_pr_load_uint(&ring->p_tail); in _ck_ring_dequeue_mc()
468 } while (ck_pr_cas_uint_value(&ring->c_head, in _ck_ring_dequeue_mc()
478 * ring buffer containing pointers. Correctness is only provided if there is up
482 ck_ring_enqueue_spsc_size(struct ck_ring *ring, in ck_ring_enqueue_spsc_size() argument
488 return _ck_ring_enqueue_sp_size(ring, buffer, &entry, in ck_ring_enqueue_spsc_size()
493 ck_ring_enqueue_spsc(struct ck_ring *ring, in ck_ring_enqueue_spsc() argument
498 return _ck_ring_enqueue_sp(ring, buffer, in ck_ring_enqueue_spsc()
503 ck_ring_enqueue_reserve_spsc_size(struct ck_ring *ring, in ck_ring_enqueue_reserve_spsc_size() argument
508 return _ck_ring_enqueue_reserve_sp(ring, buffer, sizeof(void *), in ck_ring_enqueue_reserve_spsc_size()
513 ck_ring_enqueue_reserve_spsc(struct ck_ring *ring, in ck_ring_enqueue_reserve_spsc() argument
517 return _ck_ring_enqueue_reserve_sp(ring, buffer, sizeof(void *), in ck_ring_enqueue_reserve_spsc()
522 ck_ring_enqueue_commit_spsc(struct ck_ring *ring) in ck_ring_enqueue_commit_spsc() argument
525 _ck_ring_enqueue_commit_sp(ring); in ck_ring_enqueue_commit_spsc()
530 ck_ring_dequeue_spsc(struct ck_ring *ring, in ck_ring_dequeue_spsc() argument
535 return _ck_ring_dequeue_sc(ring, buffer, in ck_ring_dequeue_spsc()
541 * ring buffer containing pointers. Correctness is provided for any number of
545 ck_ring_enqueue_mpmc(struct ck_ring *ring, in ck_ring_enqueue_mpmc() argument
550 return _ck_ring_enqueue_mp(ring, buffer, &entry, sizeof(entry), NULL); in ck_ring_enqueue_mpmc()
554 ck_ring_enqueue_mpmc_size(struct ck_ring *ring, in ck_ring_enqueue_mpmc_size() argument
560 return _ck_ring_enqueue_mp_size(ring, buffer, &entry, sizeof(entry), in ck_ring_enqueue_mpmc_size()
565 ck_ring_enqueue_reserve_mpmc(struct ck_ring *ring, in ck_ring_enqueue_reserve_mpmc() argument
570 return _ck_ring_enqueue_reserve_mp(ring, buffer, sizeof(void *), in ck_ring_enqueue_reserve_mpmc()
575 ck_ring_enqueue_reserve_mpmc_size(struct ck_ring *ring, in ck_ring_enqueue_reserve_mpmc_size() argument
581 return _ck_ring_enqueue_reserve_mp(ring, buffer, sizeof(void *), in ck_ring_enqueue_reserve_mpmc_size()
586 ck_ring_enqueue_commit_mpmc(struct ck_ring *ring, unsigned int ticket) in ck_ring_enqueue_commit_mpmc() argument
589 _ck_ring_enqueue_commit_mp(ring, ticket); in ck_ring_enqueue_commit_mpmc()
594 ck_ring_trydequeue_mpmc(struct ck_ring *ring, in ck_ring_trydequeue_mpmc() argument
599 return _ck_ring_trydequeue_mc(ring, in ck_ring_trydequeue_mpmc()
604 ck_ring_dequeue_mpmc(struct ck_ring *ring, in ck_ring_dequeue_mpmc() argument
609 return _ck_ring_dequeue_mc(ring, buffer, (void **)data, in ck_ring_dequeue_mpmc()
615 * ring buffer containing pointers. Correctness is provided for any number of
619 ck_ring_enqueue_reserve_spmc_size(struct ck_ring *ring, in ck_ring_enqueue_reserve_spmc_size() argument
624 return _ck_ring_enqueue_reserve_sp(ring, buffer, sizeof(void *), size); in ck_ring_enqueue_reserve_spmc_size()
628 ck_ring_enqueue_reserve_spmc(struct ck_ring *ring, in ck_ring_enqueue_reserve_spmc() argument
632 return _ck_ring_enqueue_reserve_sp(ring, buffer, sizeof(void *), NULL); in ck_ring_enqueue_reserve_spmc()
636 ck_ring_enqueue_commit_spmc(struct ck_ring *ring) in ck_ring_enqueue_commit_spmc() argument
639 _ck_ring_enqueue_commit_sp(ring); in ck_ring_enqueue_commit_spmc()
644 ck_ring_enqueue_spmc_size(struct ck_ring *ring, in ck_ring_enqueue_spmc_size() argument
650 return _ck_ring_enqueue_sp_size(ring, buffer, &entry, in ck_ring_enqueue_spmc_size()
655 ck_ring_enqueue_spmc(struct ck_ring *ring, in ck_ring_enqueue_spmc() argument
660 return _ck_ring_enqueue_sp(ring, buffer, &entry, in ck_ring_enqueue_spmc()
665 ck_ring_trydequeue_spmc(struct ck_ring *ring, in ck_ring_trydequeue_spmc() argument
670 return _ck_ring_trydequeue_mc(ring, buffer, (void **)data, sizeof(void *)); in ck_ring_trydequeue_spmc()
674 ck_ring_dequeue_spmc(struct ck_ring *ring, in ck_ring_dequeue_spmc() argument
679 return _ck_ring_dequeue_mc(ring, buffer, (void **)data, sizeof(void *)); in ck_ring_dequeue_spmc()
684 * ring buffer containing pointers. Correctness is provided for any number of
688 ck_ring_enqueue_reserve_mpsc(struct ck_ring *ring, in ck_ring_enqueue_reserve_mpsc() argument
693 return _ck_ring_enqueue_reserve_mp(ring, buffer, sizeof(void *), in ck_ring_enqueue_reserve_mpsc()
698 ck_ring_enqueue_reserve_mpsc_size(struct ck_ring *ring, in ck_ring_enqueue_reserve_mpsc_size() argument
704 return _ck_ring_enqueue_reserve_mp(ring, buffer, sizeof(void *), in ck_ring_enqueue_reserve_mpsc_size()
709 ck_ring_enqueue_commit_mpsc(struct ck_ring *ring, unsigned int ticket) in ck_ring_enqueue_commit_mpsc() argument
712 _ck_ring_enqueue_commit_mp(ring, ticket); in ck_ring_enqueue_commit_mpsc()
717 ck_ring_enqueue_mpsc(struct ck_ring *ring, in ck_ring_enqueue_mpsc() argument
722 return _ck_ring_enqueue_mp(ring, buffer, &entry, in ck_ring_enqueue_mpsc()
727 ck_ring_enqueue_mpsc_size(struct ck_ring *ring, in ck_ring_enqueue_mpsc_size() argument
733 return _ck_ring_enqueue_mp_size(ring, buffer, &entry, in ck_ring_enqueue_mpsc_size()
738 ck_ring_dequeue_mpsc(struct ck_ring *ring, in ck_ring_dequeue_mpsc() argument
743 return _ck_ring_dequeue_sc(ring, buffer, (void **)data, in ck_ring_dequeue_mpsc()
749 * values of a particular type in the ring the buffer.