sender_history.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "../estimator/sender_history.h"
  2. static void free_packet_feedback(skiplist_item_t key, skiplist_item_t val, void* args)
  3. {
  4. packet_feedback_t* packet = val.ptr;
  5. if (packet != NULL)
  6. free(packet);
  7. }
  8. sender_history_t* sender_history_create(uint32_t limited_ms)
  9. {
  10. sender_history_t* hist = (sender_history_t*)calloc(1, sizeof(sender_history_t));
  11. hist->limited_ms = limited_ms;
  12. hist->l = skiplist_create(id64_compare, free_packet_feedback, NULL);
  13. init_unwrapper16(&hist->wrapper);
  14. return hist;
  15. }
  16. void sender_history_destroy(sender_history_t* hist)
  17. {
  18. if (hist == NULL)
  19. return;
  20. if (hist->l != NULL){
  21. skiplist_destroy(hist->l);
  22. hist->l = NULL;
  23. }
  24. free((void *)hist);
  25. }
  26. void sender_history_add(sender_history_t* hist, packet_feedback_t* packet)
  27. {
  28. packet_feedback_t* p;
  29. skiplist_iter_t* it;
  30. skiplist_item_t key, val;
  31. /*È¥³ý¹ýÆÚµÄ·¢ËͼǼ*/
  32. while (skiplist_size(hist->l) > 0){
  33. it = skiplist_first(hist->l);
  34. p = it->val.ptr;
  35. if (p->create_ts + hist->limited_ms < packet->send_ts){
  36. if (it->key.i64 > hist->last_ack_seq_num){
  37. hist->outstanding_bytes = SU_MAX(hist->outstanding_bytes - p->payload_size, 0);
  38. hist->last_ack_seq_num = it->key.i64;
  39. }
  40. skiplist_remove(hist->l, it->key);
  41. }
  42. else
  43. break;
  44. }
  45. p = malloc(sizeof(packet_feedback_t));
  46. *p = *packet;
  47. key.i64 = wrap_uint16(&hist->wrapper, packet->sequence_number);
  48. val.ptr = p;
  49. skiplist_insert(hist->l, key, val);
  50. hist->outstanding_bytes += packet->payload_size;
  51. if (hist->last_ack_seq_num == 0)
  52. hist->last_ack_seq_num = SU_MAX(hist->last_ack_seq_num, packet->sequence_number - 1);
  53. }
  54. int sender_history_get(sender_history_t* hist, uint16_t seq, packet_feedback_t* packet, int remove_flag)
  55. {
  56. skiplist_iter_t* it;
  57. skiplist_item_t key;
  58. packet_feedback_t* p;
  59. int64_t i, seqnumber;
  60. seqnumber = wrap_uint16(&hist->wrapper, seq);
  61. for (i = hist->last_ack_seq_num + 1; i <= seqnumber; i++){
  62. key.i64 = i;
  63. it = skiplist_search(hist->l, key);
  64. if (it != NULL){
  65. p = it->val.ptr;
  66. hist->outstanding_bytes = SU_MAX(hist->outstanding_bytes - p->payload_size, 0);
  67. }
  68. }
  69. hist->last_ack_seq_num = SU_MAX(seqnumber, hist->last_ack_seq_num);
  70. key.i64 = seqnumber;
  71. it = skiplist_search(hist->l, key);
  72. if (it == NULL)
  73. return -1;
  74. p = it->val.ptr;
  75. *packet = *p;
  76. if (remove_flag == 1)
  77. skiplist_remove(hist->l, key);
  78. return 0;
  79. }
  80. size_t sender_history_outstanding_bytes(sender_history_t* hist)
  81. {
  82. return hist->outstanding_bytes;
  83. }