Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/fs/bcachefs/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  fifo.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _BCACHEFS_FIFO_H
#define _BCACHEFS_FIFO_H

#include "util.h"

#define FIFO(type)       \
struct {        \
 size_t front, back, size, mask;     \
 type *data;       \
}

#define DECLARE_FIFO(type, name) FIFO(type) name

#define fifo_buf_size(fifo)      \
 ((fifo)->size       \
  ? roundup_pow_of_two((fifo)->size) * sizeof((fifo)->data[0]) \
  : 0)

#define init_fifo(fifo, _size, _gfp)     \
({         \
 (fifo)->front = (fifo)->back = 0;    \
 (fifo)->size = (_size);     \
 (fifo)->mask = (fifo)->size     \
  ? roundup_pow_of_two((fifo)->size) - 1   \
  : 0;       \
 (fifo)->data = kvmalloc(fifo_buf_size(fifo), (_gfp)); \
})

#define free_fifo(fifo)       \
do {         \
 kvfree((fifo)->data);      \
 (fifo)->data = NULL;      \
while (0)

#define fifo_swap(l, r)       \
do {         \
 swap((l)->front, (r)->front);     \
 swap((l)->back, (r)->back);     \
 swap((l)->size, (r)->size);     \
 swap((l)->mask, (r)->mask);     \
 swap((l)->data, (r)->data);     \
while (0)

#define fifo_move(dest, src)      \
do {         \
 typeof(*((dest)->data)) _t;     \
 while (!fifo_full(dest) &&     \
        fifo_pop(src, _t))     \
  fifo_push(dest, _t);     \
while (0)

#define fifo_used(fifo)  (((fifo)->back - (fifo)->front))
#define fifo_free(fifo)  ((fifo)->size - fifo_used(fifo))

#define fifo_empty(fifo) ((fifo)->front == (fifo)->back)
#define fifo_full(fifo)  (fifo_used(fifo) == (fifo)->size)

#define fifo_peek_front(fifo) ((fifo)->data[(fifo)->front & (fifo)->mask])
#define fifo_peek_back(fifo) ((fifo)->data[((fifo)->back - 1) & (fifo)->mask])

#define fifo_entry_idx_abs(fifo, p)     \
 ((((p) >= &fifo_peek_front(fifo)    \
    ? (fifo)->front : (fifo)->back) & ~(fifo)->mask) +  \
    (((p) - (fifo)->data)))

#define fifo_entry_idx(fifo, p) (((p) - &fifo_peek_front(fifo)) & (fifo)->mask)
#define fifo_idx_entry(fifo, i) ((fifo)->data[((fifo)->front + (i)) & (fifo)->mask])

#define fifo_push_back_ref(f)      \
 (fifo_full((f)) ? NULL : &(f)->data[(f)->back++ & (f)->mask])

#define fifo_push_front_ref(f)      \
 (fifo_full((f)) ? NULL : &(f)->data[--(f)->front & (f)->mask])

#define fifo_push_back(fifo, new)     \
({         \
 typeof((fifo)->data) _r = fifo_push_back_ref(fifo);  \
 if (_r)        \
  *_r = (new);      \
 _r != NULL;       \
})

#define fifo_push_front(fifo, new)     \
({         \
 typeof((fifo)->data) _r = fifo_push_front_ref(fifo);  \
 if (_r)        \
  *_r = (new);      \
 _r != NULL;       \
})

#define fifo_pop_front(fifo, i)      \
({         \
 bool _r = !fifo_empty((fifo));     \
 if (_r)        \
  (i) = (fifo)->data[(fifo)->front++ & (fifo)->mask]; \
 _r;        \
})

#define fifo_pop_back(fifo, i)      \
({         \
 bool _r = !fifo_empty((fifo));     \
 if (_r)        \
  (i) = (fifo)->data[--(fifo)->back & (fifo)->mask]; \
 _r;        \
})

#define fifo_push_ref(fifo) fifo_push_back_ref(fifo)
#define fifo_push(fifo, i) fifo_push_back(fifo, (i))
#define fifo_pop(fifo, i) fifo_pop_front(fifo, (i))
#define fifo_peek(fifo)  fifo_peek_front(fifo)

#define fifo_for_each_entry(_entry, _fifo, _iter)   \
 for (typecheck(typeof((_fifo)->front), _iter),   \
      (_iter) = (_fifo)->front;     \
      ((_iter != (_fifo)->back) &&    \
       (_entry = (_fifo)->data[(_iter) & (_fifo)->mask], true)); \
      (_iter)++)

#define fifo_for_each_entry_ptr(_ptr, _fifo, _iter)   \
 for (typecheck(typeof((_fifo)->front), _iter),   \
      (_iter) = (_fifo)->front;     \
      ((_iter != (_fifo)->back) &&    \
       (_ptr = &(_fifo)->data[(_iter) & (_fifo)->mask], true)); \
      (_iter)++)

#endif /* _BCACHEFS_FIFO_H */

Messung V0.5
C=93 H=93 G=92

¤ Dauer der Verarbeitung: 0.0 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.