fifo.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Generic FIFO component, implemented as a circular buffer.
  3. *
  4. * Copyright (c) 2012 Peter A. G. Crosthwaite
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. *
  11. * You should have received a copy of the GNU General Public License along
  12. * with this program; if not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include "fifo.h"
  15. void fifo8_create(Fifo8 *fifo, uint32_t capacity)
  16. {
  17. fifo->data = g_new(uint8_t, capacity);
  18. fifo->capacity = capacity;
  19. fifo->head = 0;
  20. fifo->num = 0;
  21. }
  22. void fifo8_destroy(Fifo8 *fifo)
  23. {
  24. g_free(fifo->data);
  25. }
  26. void fifo8_push(Fifo8 *fifo, uint8_t data)
  27. {
  28. if (fifo->num == fifo->capacity) {
  29. abort();
  30. }
  31. fifo->data[(fifo->head + fifo->num) % fifo->capacity] = data;
  32. fifo->num++;
  33. }
  34. uint8_t fifo8_pop(Fifo8 *fifo)
  35. {
  36. uint8_t ret;
  37. if (fifo->num == 0) {
  38. abort();
  39. }
  40. ret = fifo->data[fifo->head++];
  41. fifo->head %= fifo->capacity;
  42. fifo->num--;
  43. return ret;
  44. }
  45. void fifo8_reset(Fifo8 *fifo)
  46. {
  47. fifo->num = 0;
  48. }
  49. bool fifo8_is_empty(Fifo8 *fifo)
  50. {
  51. return (fifo->num == 0);
  52. }
  53. bool fifo8_is_full(Fifo8 *fifo)
  54. {
  55. return (fifo->num == fifo->capacity);
  56. }
  57. const VMStateDescription vmstate_fifo8 = {
  58. .name = "Fifo8",
  59. .version_id = 1,
  60. .minimum_version_id = 1,
  61. .minimum_version_id_old = 1,
  62. .fields = (VMStateField[]) {
  63. VMSTATE_VBUFFER_UINT32(data, Fifo8, 1, NULL, 0, capacity),
  64. VMSTATE_UINT32(head, Fifo8),
  65. VMSTATE_UINT32(num, Fifo8),
  66. VMSTATE_END_OF_LIST()
  67. }
  68. };