1 | /** |
---|---|
2 | * Copyright 2021 Alibaba, Inc. and its affiliates. All Rights Reserved. |
3 | * |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at |
7 | * |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * |
10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | * See the License for the specific language governing permissions and |
14 | * limitations under the License. |
15 | |
16 | * \author Haichao.chc |
17 | * \date Oct 2020 |
18 | * \brief Implementation of context pool |
19 | */ |
20 | |
21 | #include "context_pool.h" |
22 | |
23 | namespace proxima { |
24 | namespace be { |
25 | namespace index { |
26 | |
27 | void ContextPool::emplace(IndexContextPtr ctx) { |
28 | std::lock_guard<std::mutex> lock(mutex_); |
29 | contexts_.push(std::move(ctx)); |
30 | } |
31 | |
32 | IndexContextPtr ContextPool::acquire() { |
33 | IndexContextPtr ctx; |
34 | std::unique_lock<std::mutex> lock(mutex_); |
35 | not_empty_cond_.wait(lock, [this] { return !contexts_.empty(); }); |
36 | ctx = std::move(contexts_.front()); |
37 | contexts_.pop(); |
38 | return ctx; |
39 | } |
40 | |
41 | void ContextPool::release(IndexContextPtr ctx) { |
42 | std::lock_guard<std::mutex> lock(mutex_); |
43 | contexts_.push(std::move(ctx)); |
44 | not_empty_cond_.notify_one(); |
45 | } |
46 | |
47 | void ContextPool::clear() { |
48 | std::lock_guard<std::mutex> lock(mutex_); |
49 | std::queue<IndexContextPtr> empty_q; |
50 | contexts_.swap(empty_q); |
51 | } |
52 | |
53 | |
54 | } // end namespace index |
55 | } // namespace be |
56 | } // end namespace proxima |
57 |