dataqueue.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #ifndef DATAQUEUE_H__
  10. #define DATAQUEUE_H__
  11. #include <rtdef.h>
  12. #include <rtconfig.h>
  13. #define RT_DATAQUEUE_EVENT_UNKNOWN 0x00
  14. #define RT_DATAQUEUE_EVENT_POP 0x01
  15. #define RT_DATAQUEUE_EVENT_PUSH 0x02
  16. #define RT_DATAQUEUE_EVENT_LWM 0x03
  17. struct rt_data_item;
  18. /* data queue implementation */
  19. struct rt_data_queue
  20. {
  21. rt_uint32_t magic;
  22. rt_uint16_t size;
  23. rt_uint16_t lwm;
  24. rt_uint16_t get_index : 15;
  25. rt_uint16_t is_empty : 1;
  26. rt_uint16_t put_index : 15;
  27. rt_uint16_t is_full : 1;
  28. struct rt_data_item *queue;
  29. struct rt_spinlock spinlock;
  30. rt_list_t suspended_push_list;
  31. rt_list_t suspended_pop_list;
  32. /* event notify */
  33. void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event);
  34. };
  35. /**
  36. * DataQueue for DeviceDriver
  37. */
  38. rt_err_t rt_data_queue_init(struct rt_data_queue *queue,
  39. rt_uint16_t size,
  40. rt_uint16_t lwm,
  41. void (*evt_notify)(struct rt_data_queue *queue, rt_uint32_t event));
  42. rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
  43. const void *data_ptr,
  44. rt_size_t data_size,
  45. rt_int32_t timeout);
  46. rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
  47. const void **data_ptr,
  48. rt_size_t *size,
  49. rt_int32_t timeout);
  50. rt_err_t rt_data_queue_peek(struct rt_data_queue *queue,
  51. const void **data_ptr,
  52. rt_size_t *size);
  53. void rt_data_queue_reset(struct rt_data_queue *queue);
  54. rt_err_t rt_data_queue_deinit(struct rt_data_queue *queue);
  55. rt_uint16_t rt_data_queue_len(struct rt_data_queue *queue);
  56. #endif