blob: a8c188e5a55dd20ab0b485ca70b534ae53630816 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
yang-gf48766d2016-01-15 11:26:31 -08003 * Copyright 2015-2016, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34#include <grpc++/server_builder.h>
35
Craig Tiller0db1bef2015-02-09 13:47:39 -080036#include <grpc/support/cpu.h>
yangg9e21f722014-12-08 15:49:52 -080037#include <grpc/support/log.h>
Craig Tiller14a65f92015-02-09 13:13:14 -080038#include <grpc++/impl/service_type.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080039#include <grpc++/server.h>
Vijay Paie8a7e302015-08-24 10:52:33 -070040#include "src/cpp/server/thread_pool_interface.h"
41#include "src/cpp/server/fixed_size_thread_pool.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080042
43namespace grpc {
44
Yang Gao5f4539f2015-03-06 16:11:16 -080045ServerBuilder::ServerBuilder()
Craig Tiller15f383c2016-01-07 12:45:32 -080046 : max_message_size_(-1), generic_service_(nullptr) {
Craig Tiller71a0f9d2015-09-28 17:22:01 -070047 grpc_compression_options_init(&compression_options_);
David Garcia Quintasbeac88c2015-08-10 13:39:52 -070048}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080049
Craig Tillerf9e6adf2015-05-06 11:45:59 -070050std::unique_ptr<ServerCompletionQueue> ServerBuilder::AddCompletionQueue() {
51 ServerCompletionQueue* cq = new ServerCompletionQueue();
52 cqs_.push_back(cq);
53 return std::unique_ptr<ServerCompletionQueue>(cq);
54}
55
Craig Tiller15f383c2016-01-07 12:45:32 -080056void ServerBuilder::RegisterService(Service* service) {
57 services_.emplace_back(new NamedService(service));
Craig Tiller822d2c72015-07-07 16:08:00 -070058}
59
Craig Tillerd6c98df2015-08-18 09:33:44 -070060void ServerBuilder::RegisterService(const grpc::string& addr,
Craig Tiller15f383c2016-01-07 12:45:32 -080061 Service* service) {
62 services_.emplace_back(new NamedService(addr, service));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080063}
64
Yang Gao49996492015-03-12 16:40:19 -070065void ServerBuilder::RegisterAsyncGenericService(AsyncGenericService* service) {
Yang Gao005eb882015-03-11 22:17:13 -070066 if (generic_service_) {
Yang Gao1c402332015-03-05 16:39:25 -080067 gpr_log(GPR_ERROR,
Yang Gao49996492015-03-12 16:40:19 -070068 "Adding multiple AsyncGenericService is unsupported for now. "
Yang Gao6baa9b62015-03-17 10:49:39 -070069 "Dropping the service %p",
70 service);
Yang Gao1c402332015-03-05 16:39:25 -080071 return;
72 }
Yang Gao005eb882015-03-11 22:17:13 -070073 generic_service_ = service;
Yang Gao1c402332015-03-05 16:39:25 -080074}
75
yang-ga23f17b2015-11-25 10:21:05 -080076void ServerBuilder::SetOption(std::unique_ptr<ServerBuilderOption> option) {
77 options_.push_back(std::move(option));
78}
79
Nicolas Noblecfd60732015-03-18 16:27:43 -070080void ServerBuilder::AddListeningPort(const grpc::string& addr,
81 std::shared_ptr<ServerCredentials> creds,
82 int* selected_port) {
Nicolas Noble30862032015-04-24 18:17:45 -070083 Port port = {addr, creds, selected_port};
84 ports_.push_back(port);
yangg9e21f722014-12-08 15:49:52 -080085}
86
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080087std::unique_ptr<Server> ServerBuilder::BuildAndStart() {
Craig Tiller15f383c2016-01-07 12:45:32 -080088 std::unique_ptr<ThreadPoolInterface> thread_pool;
89 for (auto it = services_.begin(); it != services_.end(); ++it) {
90 if ((*it)->service->has_synchronous_methods()) {
yang-gbef0d872016-01-13 15:27:33 -080091 if (thread_pool == nullptr) {
Craig Tiller15f383c2016-01-07 12:45:32 -080092 thread_pool.reset(CreateDefaultThreadPool());
yang-gbef0d872016-01-13 15:27:33 -080093 break;
Craig Tiller15f383c2016-01-07 12:45:32 -080094 }
95 }
Craig Tiller0db1bef2015-02-09 13:47:39 -080096 }
yang-ga23f17b2015-11-25 10:21:05 -080097 ChannelArguments args;
98 for (auto option = options_.begin(); option != options_.end(); ++option) {
99 (*option)->UpdateArguments(&args);
100 }
101 if (max_message_size_ > 0) {
102 args.SetInt(GRPC_ARG_MAX_MESSAGE_LENGTH, max_message_size_);
103 }
104 args.SetInt(GRPC_COMPRESSION_ALGORITHM_STATE_ARG,
105 compression_options_.enabled_algorithms_bitset);
106 std::unique_ptr<Server> server(
Craig Tiller15f383c2016-01-07 12:45:32 -0800107 new Server(thread_pool.release(), true, max_message_size_, args));
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700108 for (auto cq = cqs_.begin(); cq != cqs_.end(); ++cq) {
Nicolas "Pixel" Nobleebb51402015-07-23 02:41:33 +0200109 grpc_server_register_completion_queue(server->server_, (*cq)->cq(),
110 nullptr);
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700111 }
Vijay Pai82dd80a2015-03-24 10:36:08 -0700112 for (auto service = services_.begin(); service != services_.end();
113 service++) {
Craig Tillerd9b6fcf2015-07-07 16:28:20 -0700114 if (!server->RegisterService((*service)->host.get(), (*service)->service)) {
Craig Tiller0db1bef2015-02-09 13:47:39 -0800115 return nullptr;
116 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800117 }
Yang Gao005eb882015-03-11 22:17:13 -0700118 if (generic_service_) {
Yang Gao49996492015-03-12 16:40:19 -0700119 server->RegisterAsyncGenericService(generic_service_);
yang-g1ac6f452016-01-15 11:46:40 -0800120 } else {
121 for (auto it = services_.begin(); it != services_.end(); ++it) {
122 if ((*it)->service->has_generic_methods()) {
123 gpr_log(GPR_ERROR,
124 "Some methods were marked generic but there is no "
125 "generic service registered.");
126 return nullptr;
127 }
128 }
Yang Gao1c402332015-03-05 16:39:25 -0800129 }
Vijay Pai82dd80a2015-03-24 10:36:08 -0700130 for (auto port = ports_.begin(); port != ports_.end(); port++) {
131 int r = server->AddListeningPort(port->addr, port->creds.get());
Craig Tiller42bc87c2015-02-23 08:50:19 -0800132 if (!r) return nullptr;
Vijay Pai82dd80a2015-03-24 10:36:08 -0700133 if (port->selected_port != nullptr) {
134 *port->selected_port = r;
Craig Tiller0db1bef2015-02-09 13:47:39 -0800135 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800136 }
yang-g61e461e2015-09-03 13:08:59 -0700137 auto cqs_data = cqs_.empty() ? nullptr : &cqs_[0];
138 if (!server->Start(cqs_data, cqs_.size())) {
Craig Tiller0db1bef2015-02-09 13:47:39 -0800139 return nullptr;
140 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800141 return server;
142}
143
Craig Tiller190d3602015-02-18 09:23:38 -0800144} // namespace grpc