comparison src/event/ngx_event_quic.c @ 8284:2935a11c55b6 quic

Fixed QUIC stream insert and find.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 25 Mar 2020 14:05:40 +0300
parents 4cf00c14f11a
children f85749b60e58
comparison
equal deleted inserted replaced
8283:dadbc66e9fca 8284:2935a11c55b6
115 115
116 116
117 static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp, 117 static void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp,
118 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); 118 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
119 static ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree, 119 static ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree,
120 ngx_uint_t key); 120 uint64_t id);
121 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c, 121 static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c,
122 uint64_t id, size_t rcvbuf_size); 122 uint64_t id, size_t rcvbuf_size);
123 static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, 123 static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf,
124 size_t size); 124 size_t size);
125 static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, 125 static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf,
1445 { 1445 {
1446 ngx_rbtree_node_t **p; 1446 ngx_rbtree_node_t **p;
1447 ngx_quic_stream_t *qn, *qnt; 1447 ngx_quic_stream_t *qn, *qnt;
1448 1448
1449 for ( ;; ) { 1449 for ( ;; ) {
1450 1450 qn = (ngx_quic_stream_t *) node;
1451 if (node->key < temp->key) { 1451 qnt = (ngx_quic_stream_t *) temp;
1452 1452
1453 p = &temp->left; 1453 p = (qn->id < qnt->id) ? &temp->left : &temp->right;
1454
1455 } else if (node->key > temp->key) {
1456
1457 p = &temp->right;
1458
1459 } else { /* node->key == temp->key */
1460
1461 qn = (ngx_quic_stream_t *) &node->color;
1462 qnt = (ngx_quic_stream_t *) &temp->color;
1463
1464 if (qn->c < qnt->c) {
1465 p = &temp->left;
1466 } else {
1467 p = &temp->right;
1468 }
1469 }
1470 1454
1471 if (*p == sentinel) { 1455 if (*p == sentinel) {
1472 break; 1456 break;
1473 } 1457 }
1474 1458
1482 ngx_rbt_red(node); 1466 ngx_rbt_red(node);
1483 } 1467 }
1484 1468
1485 1469
1486 static ngx_quic_stream_t * 1470 static ngx_quic_stream_t *
1487 ngx_quic_find_stream(ngx_rbtree_t *rbtree, ngx_uint_t key) 1471 ngx_quic_find_stream(ngx_rbtree_t *rbtree, uint64_t id)
1488 { 1472 {
1489 ngx_rbtree_node_t *node, *sentinel; 1473 ngx_rbtree_node_t *node, *sentinel;
1474 ngx_quic_stream_t *qn;
1490 1475
1491 node = rbtree->root; 1476 node = rbtree->root;
1492 sentinel = rbtree->sentinel; 1477 sentinel = rbtree->sentinel;
1493 1478
1494 while (node != sentinel) { 1479 while (node != sentinel) {
1495 1480 qn = (ngx_quic_stream_t *) node;
1496 if (key == node->key) { 1481
1497 return (ngx_quic_stream_t *) node; 1482 if (id == qn->id) {
1498 } 1483 return qn;
1499 1484 }
1500 node = (key < node->key) ? node->left : node->right; 1485
1486 node = (id < qn->id) ? node->left : node->right;
1501 } 1487 }
1502 1488
1503 return NULL; 1489 return NULL;
1504 } 1490 }
1505 1491