slice/slice_buffer.cc
Go to the documentation of this file.
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 
20 
22 
23 #include <string.h>
24 
25 #include <cstdint>
26 #include <utility>
27 
28 #include <grpc/slice.h>
29 #include <grpc/slice_buffer.h>
30 #include <grpc/support/alloc.h>
31 #include <grpc/support/log.h>
32 
35 
36 namespace grpc_core {
37 
40 }
41 
43  return grpc_slice_buffer_add_indexed(&slice_buffer_, slice.TakeCSlice());
44 }
45 
48 }
49 
52 }
53 
56 }
57 
60  result.reserve(slice_buffer_.length);
61  for (size_t i = 0; i < slice_buffer_.count; i++) {
62  result.append(reinterpret_cast<const char*>(
65  }
66  return result;
67 }
68 
69 } // namespace grpc_core
70 
71 /* grow a buffer; requires GRPC_SLICE_BUFFER_INLINE_ELEMENTS > 1 */
72 #define GROW(x) (3 * (x) / 2)
73 
74 /* Typically, we do not actually need to embiggen (by calling
75  * memmove/malloc/realloc) - only if we were up against the full capacity of the
76  * slice buffer. If do_embiggen is inlined, the compiler clobbers multiple
77  * registers pointlessly in the common case. */
79  const size_t slice_count,
80  const size_t slice_offset) {
81  if (slice_offset != 0) {
82  /* Make room by moving elements if there's still space unused */
83  memmove(sb->base_slices, sb->slices, sb->count * sizeof(grpc_slice));
84  sb->slices = sb->base_slices;
85  } else {
86  /* Allocate more memory if no more space is available */
87  const size_t new_capacity = GROW(sb->capacity);
88  sb->capacity = new_capacity;
89  if (sb->base_slices == sb->inlined) {
90  sb->base_slices = static_cast<grpc_slice*>(
91  gpr_malloc(new_capacity * sizeof(grpc_slice)));
92  memcpy(sb->base_slices, sb->inlined, slice_count * sizeof(grpc_slice));
93  } else {
94  sb->base_slices = static_cast<grpc_slice*>(
95  gpr_realloc(sb->base_slices, new_capacity * sizeof(grpc_slice)));
96  }
97 
98  sb->slices = sb->base_slices + slice_offset;
99  }
100 }
101 
103  if (sb->count == 0) {
104  sb->slices = sb->base_slices;
105  return;
106  }
107 
108  /* How far away from sb->base_slices is sb->slices pointer */
109  size_t slice_offset = static_cast<size_t>(sb->slices - sb->base_slices);
110  size_t slice_count = sb->count + slice_offset;
111  if (GPR_UNLIKELY(slice_count == sb->capacity)) {
112  do_embiggen(sb, slice_count, slice_offset);
113  }
114 }
115 
117  sb->count = 0;
118  sb->length = 0;
120  sb->base_slices = sb->slices = sb->inlined;
121 }
122 
125  if (sb->base_slices != sb->inlined) {
126  gpr_free(sb->base_slices);
127  // As a precaution, set sb->base_slices to equal sb->inlined
128  // to prevent a double free attempt if grpc_slice_buffer_destroy_internal
129  // is invoked two times on the same slice buffer.
130  sb->base_slices = sb->slices = sb->inlined;
131  }
132 }
133 
135  grpc_slice* back;
136  uint8_t* out;
137 
138  sb->length += n;
139 
140  if (sb->count == 0) goto add_first;
141  back = &sb->slices[sb->count - 1];
142  if (back->refcount) goto add_new;
143  if ((back->data.inlined.length + n) > sizeof(back->data.inlined.bytes)) {
144  goto add_new;
145  }
146  out = back->data.inlined.bytes + back->data.inlined.length;
147  back->data.inlined.length =
148  static_cast<uint8_t>(back->data.inlined.length + n);
149  return out;
150 
151 add_new:
152  maybe_embiggen(sb);
153 add_first:
154  back = &sb->slices[sb->count];
155  sb->count++;
156  back->refcount = nullptr;
157  back->data.inlined.length = static_cast<uint8_t>(n);
158  return back->data.inlined.bytes;
159 }
160 
162  size_t out = sb->count;
163  maybe_embiggen(sb);
164  sb->slices[out] = s;
165  sb->length += GRPC_SLICE_LENGTH(s);
166  sb->count = out + 1;
167  return out;
168 }
169 
171  size_t n = sb->count;
172  grpc_slice* back = nullptr;
173  if (n != 0) {
174  back = &sb->slices[n - 1];
175  }
176  if (s.refcount != nullptr && back != nullptr &&
177  s.refcount == back->refcount &&
179  // Merge the two slices into one because they are contiguous and share the
180  // same refcount object.
182  sb->length += GRPC_SLICE_LENGTH(s);
183  // Unref the merged slice.
185  // early out
186  return;
187  }
188 
189  if (!s.refcount && n) {
190  /* if both the last slice in the slice buffer and the slice being added
191  are inlined (that is, that they carry their data inside the slice data
192  structure), and the back slice is not full, then concatenate directly
193  into the back slice, preventing many small slices being passed into
194  writes */
195  if (!back->refcount &&
197  if (s.data.inlined.length + back->data.inlined.length <=
199  memcpy(back->data.inlined.bytes + back->data.inlined.length,
200  s.data.inlined.bytes, s.data.inlined.length);
201  back->data.inlined.length = static_cast<uint8_t>(
202  back->data.inlined.length + s.data.inlined.length);
203  } else {
204  size_t cp1 = GRPC_SLICE_INLINED_SIZE - back->data.inlined.length;
205  memcpy(back->data.inlined.bytes + back->data.inlined.length,
206  s.data.inlined.bytes, cp1);
208  maybe_embiggen(sb);
209  back = &sb->slices[n];
210  sb->count = n + 1;
211  back->refcount = nullptr;
212  back->data.inlined.length =
213  static_cast<uint8_t>(s.data.inlined.length - cp1);
214  memcpy(back->data.inlined.bytes, s.data.inlined.bytes + cp1,
215  s.data.inlined.length - cp1);
216  }
217  sb->length += s.data.inlined.length;
218  return; /* early out */
219  }
220  }
222 }
223 
225  size_t i;
226  for (i = 0; i < n; i++) {
227  grpc_slice_buffer_add(sb, s[i]);
228  }
229 }
230 
232  if (sb->count != 0) {
233  size_t count = --sb->count;
234  sb->length -= GRPC_SLICE_LENGTH(sb->slices[count]);
235  }
236 }
237 
239  size_t i;
240  for (i = 0; i < sb->count; i++) {
242  }
243 
244  sb->count = 0;
245  sb->length = 0;
246  sb->slices = sb->base_slices;
247 }
248 
250  size_t a_offset = static_cast<size_t>(a->slices - a->base_slices);
251  size_t b_offset = static_cast<size_t>(b->slices - b->base_slices);
252 
253  size_t a_count = a->count + a_offset;
254  size_t b_count = b->count + b_offset;
255 
256  if (a->base_slices == a->inlined) {
257  if (b->base_slices == b->inlined) {
258  /* swap contents of inlined buffer */
260  memcpy(temp, a->base_slices, a_count * sizeof(grpc_slice));
261  memcpy(a->base_slices, b->base_slices, b_count * sizeof(grpc_slice));
262  memcpy(b->base_slices, temp, a_count * sizeof(grpc_slice));
263  } else {
264  /* a is inlined, b is not - copy a inlined into b, fix pointers */
265  a->base_slices = b->base_slices;
266  b->base_slices = b->inlined;
267  memcpy(b->base_slices, a->inlined, a_count * sizeof(grpc_slice));
268  }
269  } else if (b->base_slices == b->inlined) {
270  /* b is inlined, a is not - copy b inlined int a, fix pointers */
271  b->base_slices = a->base_slices;
272  a->base_slices = a->inlined;
273  memcpy(a->base_slices, b->inlined, b_count * sizeof(grpc_slice));
274  } else {
275  /* no inlining: easy swap */
276  std::swap(a->base_slices, b->base_slices);
277  }
278 
279  /* Update the slices pointers (cannot do a std::swap on slices fields here).
280  * Also note that since the base_slices pointers are already swapped we need
281  * use 'b_offset' for 'a->base_slices' and vice versa */
282  a->slices = a->base_slices + b_offset;
283  b->slices = b->base_slices + a_offset;
284 
285  /* base_slices and slices fields are correctly set. Swap all other fields */
286  std::swap(a->count, b->count);
287  std::swap(a->capacity, b->capacity);
288  std::swap(a->length, b->length);
289 }
290 
293  /* anything to move? */
294  if (src->count == 0) {
295  return;
296  }
297  /* anything in dst? */
298  if (dst->count == 0) {
300  return;
301  }
302  /* both buffers have data - copy, and reset src */
303  grpc_slice_buffer_addn(dst, src->slices, src->count);
304  src->count = 0;
305  src->length = 0;
306 }
307 
308 template <bool incref>
311  GPR_ASSERT(src->length >= n);
312  if (src->length == n) {
314  return;
315  }
316 
317  size_t output_len = dst->length + n;
318  size_t new_input_len = src->length - n;
319 
320  while (src->count > 0) {
322  size_t slice_len = GRPC_SLICE_LENGTH(slice);
323  if (n > slice_len) {
325  n -= slice_len;
326  } else if (n == slice_len) {
328  break;
329  } else if (incref) { /* n < slice_len */
334  break;
335  } else { /* n < slice_len */
340  break;
341  }
342  }
343  GPR_ASSERT(dst->length == output_len);
344  GPR_ASSERT(src->length == new_input_len);
345  GPR_ASSERT(src->count > 0);
346 }
347 
350  slice_buffer_move_first_maybe_ref<true>(src, n, dst);
351 }
352 
355  slice_buffer_move_first_maybe_ref<false>(src, n, dst);
356 }
357 
359  void* dst) {
360  char* dstp = static_cast<char*>(dst);
361  GPR_ASSERT(src->length >= n);
362 
363  while (n > 0) {
365  size_t slice_len = GRPC_SLICE_LENGTH(slice);
366  if (slice_len > n) {
369  src, grpc_slice_sub_no_ref(slice, n, slice_len));
370  n = 0;
371  } else if (slice_len == n) {
374  n = 0;
375  } else {
376  memcpy(dstp, GRPC_SLICE_START_PTR(slice), slice_len);
377  dstp += slice_len;
378  n -= slice_len;
380  }
381  }
382 }
383 
385  void* dst) {
386  uint8_t* dstp = static_cast<uint8_t*>(dst);
387  GPR_ASSERT(src->length >= n);
388 
389  for (size_t i = 0; i < src->count; i++) {
390  grpc_slice slice = src->slices[i];
391  size_t slice_len = GRPC_SLICE_LENGTH(slice);
392  if (slice_len >= n) {
394  return;
395  }
396  memcpy(dstp, GRPC_SLICE_START_PTR(slice), slice_len);
397  dstp += slice_len;
398  n -= slice_len;
399  }
400 }
401 
403  grpc_slice_buffer* garbage) {
404  GPR_ASSERT(n <= sb->length);
405  sb->length -= n;
406  for (;;) {
407  size_t idx = sb->count - 1;
408  grpc_slice slice = sb->slices[idx];
409  size_t slice_len = GRPC_SLICE_LENGTH(slice);
410  if (slice_len > n) {
411  sb->slices[idx] = grpc_slice_split_head(&slice, slice_len - n);
412  if (garbage) {
414  } else {
416  }
417  return;
418  } else if (slice_len == n) {
419  if (garbage) {
421  } else {
423  }
424  sb->count = idx;
425  return;
426  } else {
427  if (garbage) {
429  } else {
431  }
432  n -= slice_len;
433  sb->count = idx;
434  }
435  }
436 }
437 
440  GPR_ASSERT(sb->count > 0);
441  slice = sb->slices[0];
442  sb->slices++;
443  sb->count--;
445 
446  return slice;
447 }
448 
450  GPR_DEBUG_ASSERT(sb->count > 0);
451  sb->length -= GRPC_SLICE_LENGTH(sb->slices[0]);
453  sb->slices++;
454  if (--sb->count == 0) {
455  sb->slices = sb->base_slices;
456  }
457 }
458 
460  size_t end) {
461  // TODO(soheil): Introduce a ptr version for sub.
462  sb->length -= GRPC_SLICE_LENGTH(sb->slices[0]);
463  sb->slices[0] = grpc_slice_sub_no_ref(sb->slices[0], begin, end);
464  sb->length += end - begin;
465 }
466 
468  grpc_slice slice) {
469  sb->slices--;
470  sb->slices[0] = slice;
471  sb->count++;
473 }
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
maybe_embiggen
static void maybe_embiggen(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:102
dst
static const char dst[]
Definition: test-fs-copyfile.c:37
fix_build_deps.temp
temp
Definition: fix_build_deps.py:488
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
log.h
grpc_slice::refcount
struct grpc_slice_refcount * refcount
Definition: include/grpc/impl/codegen/slice.h:66
grpc_slice_ref_internal
const grpc_slice & grpc_slice_ref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:32
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
begin
char * begin
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1007
slice.h
grpc_slice::grpc_slice_data::grpc_slice_refcounted::length
size_t length
Definition: include/grpc/impl/codegen/slice.h:69
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::Slice
Definition: src/core/lib/slice/slice.h:282
string.h
grpc_slice_buffer::slices
grpc_slice * slices
Definition: include/grpc/impl/codegen/slice.h:89
grpc_slice_buffer_add
void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice s)
Definition: slice/slice_buffer.cc:170
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
grpc_slice_buffer_move_into
void grpc_slice_buffer_move_into(grpc_slice_buffer *src, grpc_slice_buffer *dst)
Definition: slice/slice_buffer.cc:291
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
grpc_slice_buffer_take_first
grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:438
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
grpc_slice_buffer_swap
void grpc_slice_buffer_swap(grpc_slice_buffer *a, grpc_slice_buffer *b)
Definition: slice/slice_buffer.cc:249
grpc_slice_sub_no_ref
GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end)
Definition: slice/slice.cc:264
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
grpc_slice_buffer_tiny_add
uint8_t * grpc_slice_buffer_tiny_add(grpc_slice_buffer *sb, size_t n)
Definition: slice/slice_buffer.cc:134
grpc_core::SliceBuffer::TakeFirst
Slice TakeFirst()
Removes the first slice in the SliceBuffer and returns it.
Definition: slice/slice_buffer.cc:46
do_embiggen
static void GPR_ATTRIBUTE_NOINLINE do_embiggen(grpc_slice_buffer *sb, const size_t slice_count, const size_t slice_offset)
Definition: slice/slice_buffer.cc:78
grpc_core::SliceBuffer::JoinIntoString
std::string JoinIntoString() const
Concatenate all slices and return the resulting string.
Definition: slice/slice_buffer.cc:58
grpc_core::SliceBuffer::RefSlice
Slice RefSlice(size_t index) const
Definition: slice/slice_buffer.cc:54
GRPC_SLICE_REF_BOTH
@ GRPC_SLICE_REF_BOTH
Definition: include/grpc/slice.h:110
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
slice_buffer_move_first_maybe_ref
static void slice_buffer_move_first_maybe_ref(grpc_slice_buffer *src, size_t n, grpc_slice_buffer *dst)
Definition: slice/slice_buffer.cc:309
grpc_core::SliceBuffer::slice_buffer_
grpc_slice_buffer slice_buffer_
The backing raw slice buffer.
Definition: src/core/lib/slice/slice_buffer.h:128
grpc_slice_buffer_move_first_into_buffer
void grpc_slice_buffer_move_first_into_buffer(grpc_slice_buffer *src, size_t n, void *dst)
Definition: slice/slice_buffer.cc:358
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
gpr_realloc
GPRAPI void * gpr_realloc(void *p, size_t size)
Definition: alloc.cc:56
grpc_slice::grpc_slice_data::grpc_slice_inlined::length
uint8_t length
Definition: include/grpc/impl/codegen/slice.h:73
grpc_slice_buffer_undo_take_first
void grpc_slice_buffer_undo_take_first(grpc_slice_buffer *sb, grpc_slice slice)
Definition: slice/slice_buffer.cc:467
grpc_slice_buffer::count
size_t count
Definition: include/grpc/impl/codegen/slice.h:91
slice
grpc_slice slice
Definition: src/core/lib/surface/server.cc:467
grpc_core::SliceBuffer::AppendIndexed
size_t AppendIndexed(Slice slice)
Definition: slice/slice_buffer.cc:42
GPR_UNLIKELY
#define GPR_UNLIKELY(x)
Definition: impl/codegen/port_platform.h:770
grpc_slice::grpc_slice_data::inlined
struct grpc_slice::grpc_slice_data::grpc_slice_inlined inlined
grpc_slice_buffer::length
size_t length
Definition: include/grpc/impl/codegen/slice.h:96
GRPC_SLICE_START_PTR
#define GRPC_SLICE_START_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:101
slice_buffer.h
grpc_slice_split_tail_maybe_ref
GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice *s, size_t split, grpc_slice_ref_whom ref_whom)
Definition: slice/slice.cc:286
std::swap
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:1226
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
slice_internal.h
grpc_slice_buffer_move_first
void grpc_slice_buffer_move_first(grpc_slice_buffer *src, size_t n, grpc_slice_buffer *dst)
Definition: slice/slice_buffer.cc:348
grpc_slice_buffer_add_indexed
size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer *sb, grpc_slice s)
Definition: slice/slice_buffer.cc:161
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
GRPC_SLICE_END_PTR
#define GRPC_SLICE_END_PTR(slice)
Definition: include/grpc/impl/codegen/slice.h:110
grpc_core::SliceBuffer::Append
void Append(Slice slice)
Definition: slice/slice_buffer.cc:38
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
setup.idx
idx
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:197
GRPC_SLICE_REF_TAIL
@ GRPC_SLICE_REF_TAIL
Definition: include/grpc/slice.h:108
grpc_slice_buffer_trim_end
void grpc_slice_buffer_trim_end(grpc_slice_buffer *sb, size_t n, grpc_slice_buffer *garbage)
Definition: slice/slice_buffer.cc:402
GRPC_SLICE_LENGTH
#define GRPC_SLICE_LENGTH(slice)
Definition: include/grpc/impl/codegen/slice.h:104
grpc_slice_buffer_move_first_no_ref
void grpc_slice_buffer_move_first_no_ref(grpc_slice_buffer *src, size_t n, grpc_slice_buffer *dst)
Definition: slice/slice_buffer.cc:353
grpc_slice::grpc_slice_data::refcounted
struct grpc_slice::grpc_slice_data::grpc_slice_refcounted refcounted
grpc_slice_buffer_pop
void grpc_slice_buffer_pop(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:231
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
grpc_slice_buffer_addn
void grpc_slice_buffer_addn(grpc_slice_buffer *sb, grpc_slice *s, size_t n)
Definition: slice/slice_buffer.cc:224
index
int index
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1184
alloc.h
grpc_slice::data
union grpc_slice::grpc_slice_data data
GRPC_SLICE_BUFFER_INLINE_ELEMENTS
#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS
Definition: include/grpc/impl/codegen/slice.h:79
GRPC_SLICE_INLINED_SIZE
#define GRPC_SLICE_INLINED_SIZE
Definition: include/grpc/impl/codegen/slice.h:49
slice_refcount.h
grpc_slice_split_head
GPRAPI grpc_slice grpc_slice_split_head(grpc_slice *s, size_t split)
Definition: slice/slice.cc:347
grpc_slice::grpc_slice_data::grpc_slice_inlined::bytes
uint8_t bytes[GRPC_SLICE_INLINED_SIZE]
Definition: include/grpc/impl/codegen/slice.h:74
grpc_slice_buffer::base_slices
grpc_slice * base_slices
Definition: include/grpc/impl/codegen/slice.h:86
grpc_slice_buffer_destroy_internal
void grpc_slice_buffer_destroy_internal(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:123
grpc_slice_buffer::inlined
grpc_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS]
Definition: include/grpc/impl/codegen/slice.h:98
grpc_slice_buffer::capacity
size_t capacity
Definition: include/grpc/impl/codegen/slice.h:94
grpc_slice_buffer
Definition: include/grpc/impl/codegen/slice.h:83
GROW
#define GROW(x)
Definition: slice/slice_buffer.cc:72
grpc_core::SliceBuffer::Prepend
void Prepend(Slice slice)
Prepends the slice to the the front of the SliceBuffer.
Definition: slice/slice_buffer.cc:50
length
std::size_t length
Definition: abseil-cpp/absl/time/internal/test_util.cc:57
grpc_slice_buffer_remove_first
void grpc_slice_buffer_remove_first(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:449
grpc_slice_buffer_copy_first_into_buffer
void grpc_slice_buffer_copy_first_into_buffer(grpc_slice_buffer *src, size_t n, void *dst)
Definition: slice/slice_buffer.cc:384
slice_buffer.h
grpc_slice_buffer_reset_and_unref_internal
void grpc_slice_buffer_reset_and_unref_internal(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:238
grpc_slice_buffer_sub_first
void grpc_slice_buffer_sub_first(grpc_slice_buffer *sb, size_t begin, size_t end)
Definition: slice/slice_buffer.cc:459
GPR_ATTRIBUTE_NOINLINE
#define GPR_ATTRIBUTE_NOINLINE
Definition: impl/codegen/port_platform.h:684
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc_slice_buffer_init
void grpc_slice_buffer_init(grpc_slice_buffer *sb)
Definition: slice/slice_buffer.cc:116
grpc_slice_unref_internal
void grpc_slice_unref_internal(const grpc_slice &slice)
Definition: slice_refcount.h:39
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:13