Line data Source code
1 : /*
2 : * Copyright 2015, Google Inc.
3 : * All rights reserved.
4 : *
5 : * Redistribution and use in source and binary forms, with or without
6 : * modification, are permitted provided that the following conditions are
7 : * met:
8 : *
9 : * * Redistributions of source code must retain the above copyright
10 : * notice, this list of conditions and the following disclaimer.
11 : * * Redistributions in binary form must reproduce the above
12 : * copyright notice, this list of conditions and the following disclaimer
13 : * in the documentation and/or other materials provided with the
14 : * distribution.
15 : * * Neither the name of Google Inc. nor the names of its
16 : * contributors may be used to endorse or promote products derived from
17 : * this software without specific prior written permission.
18 : *
19 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 : * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 : * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 : * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 : *
31 : */
32 :
33 : #include <grpc++/completion_queue.h>
34 :
35 : #include <memory>
36 :
37 : #include <grpc/grpc.h>
38 : #include <grpc/support/log.h>
39 : #include <grpc++/support/time.h>
40 :
41 : namespace grpc {
42 :
43 209731 : CompletionQueue::CompletionQueue() {
44 209733 : cq_ = grpc_completion_queue_create(nullptr);
45 209732 : }
46 :
47 209493 : CompletionQueue::CompletionQueue(grpc_completion_queue* take) : cq_(take) {}
48 :
49 419109 : CompletionQueue::~CompletionQueue() { grpc_completion_queue_destroy(cq_); }
50 :
51 209703 : void CompletionQueue::Shutdown() { grpc_completion_queue_shutdown(cq_); }
52 :
53 8476967 : CompletionQueue::NextStatus CompletionQueue::AsyncNextInternal(
54 : void** tag, bool* ok, gpr_timespec deadline) {
55 : for (;;) {
56 8476967 : auto ev = grpc_completion_queue_next(cq_, deadline, nullptr);
57 8475701 : switch (ev.type) {
58 : case GRPC_QUEUE_TIMEOUT:
59 5490695 : return TIMEOUT;
60 : case GRPC_QUEUE_SHUTDOWN:
61 209992 : return SHUTDOWN;
62 : case GRPC_OP_COMPLETE:
63 8168833 : auto cq_tag = static_cast<CompletionQueueTag*>(ev.tag);
64 8168833 : *ok = ev.success != 0;
65 8168833 : *tag = cq_tag;
66 8168833 : if (cq_tag->FinalizeResult(tag, ok)) {
67 5087459 : return GOT_EVENT;
68 : }
69 3082661 : break;
70 : }
71 3082915 : }
72 : }
73 :
74 847173 : bool CompletionQueue::Pluck(CompletionQueueTag* tag) {
75 847173 : auto deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
76 847381 : auto ev = grpc_completion_queue_pluck(cq_, tag, deadline, nullptr);
77 847382 : bool ok = ev.success != 0;
78 847382 : void* ignored = tag;
79 847382 : GPR_ASSERT(tag->FinalizeResult(&ignored, &ok));
80 847349 : GPR_ASSERT(ignored == tag);
81 : // Ignore mutations by FinalizeResult: Pluck returns the C API status
82 847349 : return ev.success != 0;
83 : }
84 :
85 105621 : void CompletionQueue::TryPluck(CompletionQueueTag* tag) {
86 105621 : auto deadline = gpr_time_0(GPR_CLOCK_REALTIME);
87 105621 : auto ev = grpc_completion_queue_pluck(cq_, tag, deadline, nullptr);
88 211202 : if (ev.type == GRPC_QUEUE_TIMEOUT) return;
89 5 : bool ok = ev.success != 0;
90 5 : void* ignored = tag;
91 : // the tag must be swallowed if using TryPluck
92 5 : GPR_ASSERT(!tag->FinalizeResult(&ignored, &ok));
93 : }
94 :
95 : } // namespace grpc
|