/root/doris/be/src/util/faststring.cc
Line | Count | Source |
1 | | // Licensed to the Apache Software Foundation (ASF) under one |
2 | | // or more contributor license agreements. See the NOTICE file |
3 | | // distributed with this work for additional information |
4 | | // regarding copyright ownership. The ASF licenses this file |
5 | | // to you under the Apache License, Version 2.0 (the |
6 | | // "License"); you may not use this file except in compliance |
7 | | // with the License. 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, |
12 | | // software distributed under the License is distributed on an |
13 | | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
14 | | // KIND, either express or implied. See the License for the |
15 | | // specific language governing permissions and limitations |
16 | | // under the License. |
17 | | |
18 | | #include "util/faststring.h" |
19 | | |
20 | | #include <glog/logging.h> |
21 | | |
22 | | #include <memory> |
23 | | |
24 | | namespace doris { |
25 | | |
26 | 2.12k | void faststring::GrowToAtLeast(size_t newcapacity) { |
27 | | // Not enough space, need to reserve more. |
28 | | // Don't reserve exactly enough space for the new string -- that makes it |
29 | | // too easy to write perf bugs where you get O(n^2) append. |
30 | | // Instead, always expand by at least 50%. |
31 | | |
32 | 2.12k | if (newcapacity < capacity_ * 3 / 2) { |
33 | 2.12k | newcapacity = capacity_ * 3 / 2; |
34 | 2.12k | } |
35 | 2.12k | GrowArray(newcapacity); |
36 | 2.12k | } |
37 | | |
38 | 97.8k | void faststring::GrowArray(size_t newcapacity) { |
39 | 97.8k | DCHECK_GE(newcapacity, capacity_); |
40 | 97.8k | std::unique_ptr<uint8_t[]> newdata(reinterpret_cast<uint8_t*>(Allocator::alloc(newcapacity))); |
41 | 97.8k | if (len_ > 0) { |
42 | 55.6k | memcpy(&newdata[0], &data_[0], len_); |
43 | 55.6k | } |
44 | | |
45 | 97.8k | if (data_ != initial_data_) { |
46 | 43.8k | Allocator::free(data_, capacity_); |
47 | 54.0k | } else { |
48 | 54.0k | ASAN_POISON_MEMORY_REGION(initial_data_, arraysize(initial_data_)); |
49 | 54.0k | } |
50 | | |
51 | 97.8k | data_ = newdata.release(); |
52 | 97.8k | capacity_ = newcapacity; |
53 | 97.8k | ASAN_POISON_MEMORY_REGION(data_ + len_, capacity_ - len_); |
54 | 97.8k | } |
55 | | |
56 | 40 | void faststring::ShrinkToFitInternal() { |
57 | 40 | DCHECK_NE(data_, initial_data_); |
58 | 40 | if (len_ <= kInitialCapacity) { |
59 | 29 | ASAN_UNPOISON_MEMORY_REGION(initial_data_, len_); |
60 | 29 | memcpy(initial_data_, &data_[0], len_); |
61 | 29 | Allocator::free(data_, capacity_); |
62 | 29 | data_ = initial_data_; |
63 | 29 | capacity_ = kInitialCapacity; |
64 | 29 | } else { |
65 | 11 | std::unique_ptr<uint8_t[]> newdata(reinterpret_cast<uint8_t*>(Allocator::alloc(len_))); |
66 | 11 | memcpy(&newdata[0], &data_[0], len_); |
67 | 11 | Allocator::free(data_, capacity_); |
68 | 11 | data_ = newdata.release(); |
69 | 11 | capacity_ = len_; |
70 | 11 | } |
71 | 40 | } |
72 | | |
73 | | } // namespace doris |