Home | History | Annotate | Download | only in transport
      1 /*
      2  *
      3  * Copyright 2015 gRPC authors.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  */
     18 
     19 #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_MAP_H
     20 #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_MAP_H
     21 
     22 #include <grpc/support/port_platform.h>
     23 
     24 #include <stddef.h>
     25 
     26 /* Data structure to map a uint32_t to a data object (represented by a void*)
     27 
     28    Represented as a sorted array of keys, and a corresponding array of values.
     29    Lookups are performed with binary search.
     30    Adds are restricted to strictly higher keys than previously seen (this is
     31    guaranteed by http2). */
     32 typedef struct {
     33   uint32_t* keys;
     34   void** values;
     35   size_t count;
     36   size_t free;
     37   size_t capacity;
     38 } grpc_chttp2_stream_map;
     39 
     40 void grpc_chttp2_stream_map_init(grpc_chttp2_stream_map* map,
     41                                  size_t initial_capacity);
     42 void grpc_chttp2_stream_map_destroy(grpc_chttp2_stream_map* map);
     43 
     44 /* Add a new key: given http2 semantics, new keys must always be greater than
     45    existing keys - this is asserted */
     46 void grpc_chttp2_stream_map_add(grpc_chttp2_stream_map* map, uint32_t key,
     47                                 void* value);
     48 
     49 /* Delete an existing key - returns the previous value of the key if it existed,
     50    or NULL otherwise */
     51 void* grpc_chttp2_stream_map_delete(grpc_chttp2_stream_map* map, uint32_t key);
     52 
     53 /* Return an existing key, or NULL if it does not exist */
     54 void* grpc_chttp2_stream_map_find(grpc_chttp2_stream_map* map, uint32_t key);
     55 
     56 /* Return a random entry */
     57 void* grpc_chttp2_stream_map_rand(grpc_chttp2_stream_map* map);
     58 
     59 /* How many (populated) entries are in the stream map? */
     60 size_t grpc_chttp2_stream_map_size(grpc_chttp2_stream_map* map);
     61 
     62 /* Callback on each stream */
     63 void grpc_chttp2_stream_map_for_each(grpc_chttp2_stream_map* map,
     64                                      void (*f)(void* user_data, uint32_t key,
     65                                                void* value),
     66                                      void* user_data);
     67 
     68 #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_STREAM_MAP_H */
     69