wait_queue.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "wait_queue.h"
  2. #include "os/co_task.h"
  3. #include "libs/utils.h"
  4. void wait_queue_init(wait_queue_t *queue, int max_size){
  5. queue->keys = co_malloc(max_size * sizeof(response_t));
  6. memset(queue->keys, 0, sizeof(max_size * sizeof(response_t)));
  7. queue->max_key_count = max_size;
  8. }
  9. s32 wait_queue_add_buffer(wait_queue_t *queue, u16 key, u8*buffer, u16 len) {
  10. s32 q_index = -1;
  11. for(int i = 0; i < queue->max_key_count; i++){
  12. if (key == queue->keys[i].key){
  13. q_index = -1;
  14. break;
  15. }
  16. if ((q_index == -1) && (queue->keys[i].key== 0)){
  17. q_index = i;
  18. }
  19. }
  20. if (q_index != -1) {
  21. queue->keys[q_index].key = key;
  22. queue->keys[q_index].data_len= len;
  23. queue->keys[q_index].resp_data= buffer;
  24. }
  25. return q_index;
  26. }
  27. s32 wait_queue_add(wait_queue_t *queue, u16 key) {
  28. return wait_queue_add_buffer(queue, key, NULL, 0);
  29. }
  30. bool wait_queue_key_acked_response(wait_queue_t *queue, u16 key, u8 *data, u16 len){
  31. bool stop_to_next = false;
  32. for(int i = 0; i < queue->max_key_count; i++){
  33. if (key == queue->keys[i].key){
  34. queue->keys[i].key = ACKED_KEY;
  35. if (queue->keys[i].resp_data != NULL && data != NULL) {
  36. memcpy(queue->keys[i].resp_data, data, min(queue->keys[i].data_len, len));
  37. queue->keys[i].data_len = len;
  38. stop_to_next = true;
  39. }else {
  40. queue->keys[i].data_len = 0;
  41. }
  42. break;
  43. }
  44. }
  45. return stop_to_next;
  46. }
  47. bool wait_queue_key_acked(wait_queue_t *queue, u16 key){
  48. return wait_queue_key_acked_response(queue, key, NULL, 0);
  49. }
  50. s32 wait_queue_wait_key(wait_queue_t *queue, s32 index, s32 timeout) {
  51. volatile response_t *resp_key = queue->keys + index;
  52. while((resp_key->key != ACKED_KEY) && (timeout-- >= 0)){
  53. co_task_delay(1);
  54. }
  55. if (resp_key->key == ACKED_KEY){
  56. return resp_key->data_len;
  57. }
  58. return -1;
  59. }
  60. void wait_queue_delete_key(wait_queue_t *queue, s32 index) {
  61. queue->keys[index].key = 0;
  62. queue->keys[index].data_len = 0;
  63. queue->keys[index].resp_data = NULL;
  64. }