1 /* 2 * nghttp3 3 * 4 * Copyright (c) 2019 nghttp3 contributors 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sublicense, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be 15 * included in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 #ifndef NGHTTP3_TNODE_H 26 #define NGHTTP3_TNODE_H 27 28 #ifdef HAVE_CONFIG_H 29 # include <config.h> 30 #endif /* HAVE_CONFIG_H */ 31 32 #include <nghttp3/nghttp3.h> 33 34 #include "nghttp3_pq.h" 35 36 #define NGHTTP3_TNODE_MAX_CYCLE_GAP (1llu << 24) 37 38 typedef enum nghttp3_node_id_type { 39 NGHTTP3_NODE_ID_TYPE_STREAM = 0x00, 40 NGHTTP3_NODE_ID_TYPE_PUSH = 0x01, 41 } nghttp3_node_id_type; 42 43 typedef struct nghttp3_node_id { 44 nghttp3_node_id_type type; 45 int64_t id; 46 } nghttp3_node_id; 47 48 nghttp3_node_id *nghttp3_node_id_init(nghttp3_node_id *nid, 49 nghttp3_node_id_type type, int64_t id); 50 51 int nghttp3_node_id_eq(const nghttp3_node_id *a, const nghttp3_node_id *b); 52 53 typedef struct nghttp3_tnode { 54 nghttp3_pq_entry pe; 55 size_t num_children; 56 nghttp3_node_id nid; 57 uint64_t seq; 58 uint64_t cycle; 59 /* pri is a stream priority produced by nghttp3_pri_to_uint8. */ 60 uint8_t pri; 61 } nghttp3_tnode; 62 63 void nghttp3_tnode_init(nghttp3_tnode *tnode, const nghttp3_node_id *nid, 64 uint64_t seq, uint8_t pri); 65 66 void nghttp3_tnode_free(nghttp3_tnode *tnode); 67 68 void nghttp3_tnode_unschedule(nghttp3_tnode *tnode, nghttp3_pq *pq); 69 70 /* 71 * nghttp3_tnode_schedule schedules |tnode| using |nwrite| as penalty. 72 * If |tnode| has already been scheduled, it is rescheduled by the 73 * amount of |nwrite|. 74 */ 75 int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, 76 uint64_t nwrite); 77 78 /* 79 * nghttp3_tnode_is_scheduled returns nonzero if |tnode| is scheduled. 80 */ 81 int nghttp3_tnode_is_scheduled(nghttp3_tnode *tnode); 82 83 #endif /* NGHTTP3_TNODE_H */ 84