remove grpc from thirdparty
This commit is contained in:
@@ -1,98 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/// An Alarm posts the user provided tag to its associated completion queue upon
|
||||
/// expiry or cancellation.
|
||||
#ifndef GRPCXX_ALARM_H
|
||||
#define GRPCXX_ALARM_H
|
||||
|
||||
#include <grpc++/impl/codegen/completion_queue.h>
|
||||
#include <grpc++/impl/codegen/completion_queue_tag.h>
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
#include <grpc++/impl/codegen/time.h>
|
||||
#include <grpc++/impl/grpc_library.h>
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
struct grpc_alarm;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class CompletionQueue;
|
||||
|
||||
/// A thin wrapper around \a grpc_alarm (see / \a / src/core/surface/alarm.h).
|
||||
class Alarm : private GrpcLibraryCodegen {
|
||||
public:
|
||||
/// Create a completion queue alarm instance associated to \a cq.
|
||||
///
|
||||
/// Once the alarm expires (at \a deadline) or it's cancelled (see \a Cancel),
|
||||
/// an event with tag \a tag will be added to \a cq. If the alarm expired, the
|
||||
/// event's success bit will be true, false otherwise (ie, upon cancellation).
|
||||
/// \internal We rely on the presence of \a cq for grpc initialization. If \a
|
||||
/// cq were ever to be removed, a reference to a static
|
||||
/// internal::GrpcLibraryInitializer instance would need to be introduced
|
||||
/// here. \endinternal.
|
||||
template <typename T>
|
||||
Alarm(CompletionQueue* cq, const T& deadline, void* tag)
|
||||
: tag_(tag),
|
||||
alarm_(grpc_alarm_create(cq->cq(), TimePoint<T>(deadline).raw_time(),
|
||||
static_cast<void*>(&tag_))) {}
|
||||
|
||||
/// Alarms aren't copyable.
|
||||
Alarm(const Alarm&) = delete;
|
||||
Alarm& operator=(const Alarm&) = delete;
|
||||
|
||||
/// Alarms are movable.
|
||||
Alarm(Alarm&& rhs) : tag_(rhs.tag_), alarm_(rhs.alarm_) {
|
||||
rhs.alarm_ = nullptr;
|
||||
}
|
||||
Alarm& operator=(Alarm&& rhs) {
|
||||
tag_ = rhs.tag_;
|
||||
alarm_ = rhs.alarm_;
|
||||
rhs.alarm_ = nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Destroy the given completion queue alarm, cancelling it in the process.
|
||||
~Alarm() {
|
||||
if (alarm_ != nullptr) grpc_alarm_destroy(alarm_);
|
||||
}
|
||||
|
||||
/// Cancel a completion queue alarm. Calling this function over an alarm that
|
||||
/// has already fired has no effect.
|
||||
void Cancel() { grpc_alarm_cancel(alarm_); }
|
||||
|
||||
private:
|
||||
class AlarmEntry : public CompletionQueueTag {
|
||||
public:
|
||||
AlarmEntry(void* tag) : tag_(tag) {}
|
||||
bool FinalizeResult(void** tag, bool* status) override {
|
||||
*tag = tag_;
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
void* tag_;
|
||||
};
|
||||
|
||||
AlarmEntry tag_;
|
||||
grpc_alarm* alarm_; // owned
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_ALARM_H
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_CHANNEL_H
|
||||
#define GRPCXX_CHANNEL_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/call.h>
|
||||
#include <grpc++/impl/codegen/channel_interface.h>
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
struct grpc_channel;
|
||||
|
||||
namespace grpc {
|
||||
/// Channels represent a connection to an endpoint. Created by \a CreateChannel.
|
||||
class Channel final : public ChannelInterface,
|
||||
public CallHook,
|
||||
public std::enable_shared_from_this<Channel>,
|
||||
private GrpcLibraryCodegen {
|
||||
public:
|
||||
~Channel();
|
||||
|
||||
/// Get the current channel state. If the channel is in IDLE and
|
||||
/// \a try_to_connect is set to true, try to connect.
|
||||
grpc_connectivity_state GetState(bool try_to_connect) override;
|
||||
|
||||
/// Returns the LB policy name, or the empty string if not yet available.
|
||||
grpc::string GetLoadBalancingPolicyName() const;
|
||||
|
||||
/// Returns the service config in JSON form, or the empty string if
|
||||
/// not available.
|
||||
grpc::string GetServiceConfigJSON() const;
|
||||
|
||||
private:
|
||||
template <class InputMessage, class OutputMessage>
|
||||
friend Status BlockingUnaryCall(ChannelInterface* channel,
|
||||
const RpcMethod& method,
|
||||
ClientContext* context,
|
||||
const InputMessage& request,
|
||||
OutputMessage* result);
|
||||
friend std::shared_ptr<Channel> CreateChannelInternal(
|
||||
const grpc::string& host, grpc_channel* c_channel);
|
||||
Channel(const grpc::string& host, grpc_channel* c_channel);
|
||||
|
||||
Call CreateCall(const RpcMethod& method, ClientContext* context,
|
||||
CompletionQueue* cq) override;
|
||||
void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override;
|
||||
void* RegisterMethod(const char* method) override;
|
||||
|
||||
void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed,
|
||||
gpr_timespec deadline, CompletionQueue* cq,
|
||||
void* tag) override;
|
||||
bool WaitForStateChangeImpl(grpc_connectivity_state last_observed,
|
||||
gpr_timespec deadline) override;
|
||||
|
||||
const grpc::string host_;
|
||||
grpc_channel* const c_channel_; // owned
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_CHANNEL_H
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/// A ClientContext allows the person implementing a service client to:
|
||||
///
|
||||
/// - Add custom metadata key-value pairs that will propagated to the server
|
||||
/// side.
|
||||
/// - Control call settings such as compression and authentication.
|
||||
/// - Initial and trailing metadata coming from the server.
|
||||
/// - Get performance metrics (ie, census).
|
||||
///
|
||||
/// Context settings are only relevant to the call they are invoked with, that
|
||||
/// is to say, they aren't sticky. Some of these settings, such as the
|
||||
/// compression options, can be made persistant at channel construction time
|
||||
/// (see \a grpc::CreateCustomChannel).
|
||||
///
|
||||
/// \warning ClientContext instances should \em not be reused across rpcs.
|
||||
|
||||
#ifndef GRPCXX_CLIENT_CONTEXT_H
|
||||
#define GRPCXX_CLIENT_CONTEXT_H
|
||||
|
||||
#include <grpc++/impl/codegen/client_context.h>
|
||||
|
||||
#endif // GRPCXX_CLIENT_CONTEXT_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_COMPLETION_QUEUE_H
|
||||
#define GRPCXX_COMPLETION_QUEUE_H
|
||||
|
||||
#include <grpc++/impl/codegen/completion_queue.h>
|
||||
|
||||
#endif // GRPCXX_COMPLETION_QUEUE_H
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_CREATE_CHANNEL_H
|
||||
#define GRPCXX_CREATE_CHANNEL_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/channel.h>
|
||||
#include <grpc++/security/credentials.h>
|
||||
#include <grpc++/support/channel_arguments.h>
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Create a new \a Channel pointing to \a target.
|
||||
///
|
||||
/// \param target The URI of the endpoint to connect to.
|
||||
/// \param creds Credentials to use for the created channel. If it does not
|
||||
/// hold an object or is invalid, a lame channel (one on which all operations
|
||||
/// fail) is returned.
|
||||
std::shared_ptr<Channel> CreateChannel(
|
||||
const grpc::string& target,
|
||||
const std::shared_ptr<ChannelCredentials>& creds);
|
||||
|
||||
/// Create a new \em custom \a Channel pointing to \a target.
|
||||
///
|
||||
/// \warning For advanced use and testing ONLY. Override default channel
|
||||
/// arguments only if necessary.
|
||||
///
|
||||
/// \param target The URI of the endpoint to connect to.
|
||||
/// \param creds Credentials to use for the created channel. If it does not
|
||||
/// hold an object or is invalid, a lame channel (one on which all operations
|
||||
/// fail) is returned.
|
||||
/// \param args Options for channel creation.
|
||||
std::shared_ptr<Channel> CreateCustomChannel(
|
||||
const grpc::string& target,
|
||||
const std::shared_ptr<ChannelCredentials>& creds,
|
||||
const ChannelArguments& args);
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_CREATE_CHANNEL_H
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_CREATE_CHANNEL_POSIX_H
|
||||
#define GRPCXX_CREATE_CHANNEL_POSIX_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/channel.h>
|
||||
#include <grpc++/support/channel_arguments.h>
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
#ifdef GPR_SUPPORT_CHANNELS_FROM_FD
|
||||
|
||||
/// Create a new \a Channel communicating over the given file descriptor.
|
||||
///
|
||||
/// \param target The name of the target.
|
||||
/// \param fd The file descriptor representing a socket.
|
||||
std::shared_ptr<Channel> CreateInsecureChannelFromFd(const grpc::string& target,
|
||||
int fd);
|
||||
|
||||
/// Create a new \a Channel communicating over given file descriptor with custom
|
||||
/// channel arguments.
|
||||
///
|
||||
/// \param target The name of the target.
|
||||
/// \param fd The file descriptor representing a socket.
|
||||
/// \param args Options for channel creation.
|
||||
std::shared_ptr<Channel> CreateCustomInsecureChannelFromFd(
|
||||
const grpc::string& target, int fd, const ChannelArguments& args);
|
||||
|
||||
#endif // GPR_SUPPORT_CHANNELS_FROM_FD
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_CREATE_CHANNEL_POSIX_H
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H
|
||||
#define GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/health_check_service_interface.h>
|
||||
#include <grpc++/impl/server_builder_option.h>
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class HealthCheckServiceServerBuilderOption : public ServerBuilderOption {
|
||||
public:
|
||||
/// The ownership of \a hc will be taken and transferred to the grpc server.
|
||||
/// To explicitly disable default service, pass in a nullptr.
|
||||
explicit HealthCheckServiceServerBuilderOption(
|
||||
std::unique_ptr<HealthCheckServiceInterface> hc);
|
||||
~HealthCheckServiceServerBuilderOption() override {}
|
||||
void UpdateArguments(ChannelArguments* args) override;
|
||||
void UpdatePlugins(
|
||||
std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) override;
|
||||
|
||||
private:
|
||||
std::unique_ptr<HealthCheckServiceInterface> hc_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H
|
||||
#define GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H
|
||||
|
||||
#include <grpc++/impl/server_builder_plugin.h>
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
class ServerInitializer;
|
||||
class ProtoServerReflection;
|
||||
} // namespace grpc
|
||||
|
||||
namespace grpc {
|
||||
namespace reflection {
|
||||
|
||||
class ProtoServerReflectionPlugin : public ::grpc::ServerBuilderPlugin {
|
||||
public:
|
||||
ProtoServerReflectionPlugin();
|
||||
::grpc::string name() override;
|
||||
void InitServer(::grpc::ServerInitializer* si) override;
|
||||
void Finish(::grpc::ServerInitializer* si) override;
|
||||
void ChangeArguments(const ::grpc::string& name, void* value) override;
|
||||
bool has_async_methods() const override;
|
||||
bool has_sync_methods() const override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<grpc::ProtoServerReflection> reflection_service_;
|
||||
};
|
||||
|
||||
/// Add proto reflection plugin to \a ServerBuilder.
|
||||
/// This function should be called at the static initialization time.
|
||||
void InitProtoReflectionServerBuilderPlugin();
|
||||
|
||||
} // namespace reflection
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H
|
||||
#define GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H
|
||||
|
||||
#include <grpc++/support/async_stream.h>
|
||||
#include <grpc++/support/byte_buffer.h>
|
||||
|
||||
struct grpc_server;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
typedef ServerAsyncReaderWriter<ByteBuffer, ByteBuffer>
|
||||
GenericServerAsyncReaderWriter;
|
||||
|
||||
class GenericServerContext final : public ServerContext {
|
||||
public:
|
||||
const grpc::string& method() const { return method_; }
|
||||
const grpc::string& host() const { return host_; }
|
||||
|
||||
private:
|
||||
friend class Server;
|
||||
friend class ServerInterface;
|
||||
|
||||
grpc::string method_;
|
||||
grpc::string host_;
|
||||
};
|
||||
|
||||
class AsyncGenericService final {
|
||||
public:
|
||||
AsyncGenericService() : server_(nullptr) {}
|
||||
|
||||
void RequestCall(GenericServerContext* ctx,
|
||||
GenericServerAsyncReaderWriter* reader_writer,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag);
|
||||
|
||||
private:
|
||||
friend class Server;
|
||||
Server* server_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H
|
||||
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_GENERIC_GENERIC_STUB_H
|
||||
#define GRPCXX_GENERIC_GENERIC_STUB_H
|
||||
|
||||
#include <grpc++/support/async_stream.h>
|
||||
#include <grpc++/support/byte_buffer.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class CompletionQueue;
|
||||
typedef ClientAsyncReaderWriter<ByteBuffer, ByteBuffer>
|
||||
GenericClientAsyncReaderWriter;
|
||||
|
||||
/// Generic stubs provide a type-unsafe interface to call gRPC methods
|
||||
/// by name.
|
||||
class GenericStub final {
|
||||
public:
|
||||
explicit GenericStub(std::shared_ptr<ChannelInterface> channel)
|
||||
: channel_(channel) {}
|
||||
|
||||
/// Begin a call to a named method \a method using \a context.
|
||||
/// A tag \a tag will be delivered to \a cq when the call has been started
|
||||
/// (i.e, initial metadata has been sent).
|
||||
/// The return value only indicates whether or not registration of the call
|
||||
/// succeeded (i.e. the call won't proceed if the return value is nullptr).
|
||||
std::unique_ptr<GenericClientAsyncReaderWriter> Call(
|
||||
ClientContext* context, const grpc::string& method, CompletionQueue* cq,
|
||||
void* tag);
|
||||
|
||||
private:
|
||||
std::shared_ptr<ChannelInterface> channel_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_GENERIC_GENERIC_STUB_H
|
||||
@@ -1,68 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/// \mainpage gRPC C++ API
|
||||
///
|
||||
/// The gRPC C++ API mainly consists of the following classes:
|
||||
/// <br>
|
||||
/// - grpc::Channel, which represents the connection to an endpoint. See [the
|
||||
/// gRPC Concepts page](https://grpc.io/docs/guides/concepts.html) for more
|
||||
/// details. Channels are created by the factory function grpc::CreateChannel.
|
||||
///
|
||||
/// - grpc::CompletionQueue, the producer-consumer queue used for all
|
||||
/// asynchronous communication with the gRPC runtime.
|
||||
///
|
||||
/// - grpc::ClientContext and grpc::ServerContext, where optional configuration
|
||||
/// for an RPC can be set, such as setting custom metadata to be conveyed to the
|
||||
/// peer, compression settings, authentication, etc.
|
||||
///
|
||||
/// - grpc::Server, representing a gRPC server, created by grpc::ServerBuilder.
|
||||
///
|
||||
/// Streaming calls are handled with the streaming classes in
|
||||
/// \ref sync_stream.h and
|
||||
/// \ref async_stream.h.
|
||||
///
|
||||
/// Refer to the
|
||||
/// [examples](https://github.com/grpc/grpc/blob/master/examples/cpp)
|
||||
/// for code putting these pieces into play.
|
||||
|
||||
#ifndef GRPCXX_GRPCXX_H
|
||||
#define GRPCXX_GRPCXX_H
|
||||
|
||||
// Pragma for http://include-what-you-use.org/ tool, tells that following
|
||||
// headers are not private for grpc++.h and are part of its interface.
|
||||
// IWYU pragma: begin_exports
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
#include <grpc++/channel.h>
|
||||
#include <grpc++/client_context.h>
|
||||
#include <grpc++/completion_queue.h>
|
||||
#include <grpc++/create_channel.h>
|
||||
#include <grpc++/create_channel_posix.h>
|
||||
#include <grpc++/server.h>
|
||||
#include <grpc++/server_builder.h>
|
||||
#include <grpc++/server_context.h>
|
||||
#include <grpc++/server_posix.h>
|
||||
// IWYU pragma: end_exports
|
||||
|
||||
namespace grpc {
|
||||
/// Return gRPC library version.
|
||||
grpc::string Version();
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_GRPCXX_H
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H
|
||||
#define GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H
|
||||
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
const char kHealthCheckServiceInterfaceArg[] =
|
||||
"grpc.health_check_service_interface";
|
||||
|
||||
/// The gRPC server uses this interface to expose the health checking service
|
||||
/// without depending on protobuf.
|
||||
class HealthCheckServiceInterface {
|
||||
public:
|
||||
virtual ~HealthCheckServiceInterface() {}
|
||||
|
||||
/// Set or change the serving status of the given \a service_name.
|
||||
virtual void SetServingStatus(const grpc::string& service_name,
|
||||
bool serving) = 0;
|
||||
/// Apply to all registered service names.
|
||||
virtual void SetServingStatus(bool serving) = 0;
|
||||
};
|
||||
|
||||
/// Enable/disable the default health checking service. This applies to all C++
|
||||
/// servers created afterwards. For each server, user can override the default
|
||||
/// with a HealthCheckServiceServerBuilderOption.
|
||||
/// NOT thread safe.
|
||||
void EnableDefaultHealthCheckService(bool enable);
|
||||
|
||||
/// Returns whether the default health checking service is enabled.
|
||||
/// NOT thread safe.
|
||||
bool DefaultHealthCheckServiceEnabled();
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CALL_H
|
||||
#define GRPCXX_IMPL_CALL_H
|
||||
|
||||
#include <grpc++/impl/codegen/call.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_CALL_H
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2017 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H
|
||||
#define GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/server_builder_option.h>
|
||||
#include <grpc++/support/channel_arguments.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption(
|
||||
const grpc::string &name, const grpc::string &value);
|
||||
std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption(
|
||||
const grpc::string &name, int value);
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CLIENT_UNARY_CALL_H
|
||||
#define GRPCXX_IMPL_CLIENT_UNARY_CALL_H
|
||||
|
||||
#include <grpc++/impl/codegen/client_unary_call.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_CLIENT_UNARY_CALL_H
|
||||
@@ -1,941 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
|
||||
#define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
|
||||
|
||||
#include <grpc++/impl/codegen/call.h>
|
||||
#include <grpc++/impl/codegen/channel_interface.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/server_context.h>
|
||||
#include <grpc++/impl/codegen/service_type.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class CompletionQueue;
|
||||
|
||||
/// Common interface for all client side asynchronous streaming.
|
||||
class ClientAsyncStreamingInterface {
|
||||
public:
|
||||
virtual ~ClientAsyncStreamingInterface() {}
|
||||
|
||||
/// Request notification of the reading of the initial metadata. Completion
|
||||
/// will be notified by \a tag on the associated completion queue.
|
||||
/// This call is optional, but if it is used, it cannot be used concurrently
|
||||
/// with or after the \a AsyncReaderInterface::Read method.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
virtual void ReadInitialMetadata(void* tag) = 0;
|
||||
|
||||
/// Indicate that the stream is to be finished and request notification for
|
||||
/// when the call has been ended.
|
||||
/// Should not be used concurrently with other operations.
|
||||
///
|
||||
/// It is appropriate to call this method when both:
|
||||
/// * the client side has no more message to send
|
||||
/// (this can be declared implicitly by calling this method, or
|
||||
/// explicitly through an earlier call to the <i>WritesDone</i> method
|
||||
/// of the class in use, e.g. \a ClientAsyncWriterInterface::WritesDone or
|
||||
/// \a ClientAsyncReaderWriterInterface::WritesDone).
|
||||
/// * there are no more messages to be received from the server (this can
|
||||
/// be known implicitly by the calling code, or explicitly from an
|
||||
/// earlier call to \a AsyncReaderInterface::Read that yielded a failed
|
||||
/// result, e.g. cq->Next(&read_tag, &ok) filled in 'ok' with 'false').
|
||||
///
|
||||
/// This function will return when either:
|
||||
/// - all incoming messages have been read and the server has returned
|
||||
/// a status.
|
||||
/// - the server has returned a non-OK status.
|
||||
/// - the call failed for some reason and the library generated a
|
||||
/// status.
|
||||
///
|
||||
/// Note that implementations of this method attempt to receive initial
|
||||
/// metadata from the server if initial metadata hasn't yet been received.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[out] status To be updated with the operation status.
|
||||
virtual void Finish(Status* status, void* tag) = 0;
|
||||
};
|
||||
|
||||
/// An interface that yields a sequence of messages of type \a R.
|
||||
template <class R>
|
||||
class AsyncReaderInterface {
|
||||
public:
|
||||
virtual ~AsyncReaderInterface() {}
|
||||
|
||||
/// Read a message of type \a R into \a msg. Completion will be notified by \a
|
||||
/// tag on the associated completion queue.
|
||||
/// This is thread-safe with respect to \a Write or \a WritesDone methods. It
|
||||
/// should not be called concurrently with other streaming APIs
|
||||
/// on the same stream. It is not meaningful to call it concurrently
|
||||
/// with another \a AsyncReaderInterface::Read on the same stream since reads
|
||||
/// on the same stream are delivered in order.
|
||||
///
|
||||
/// \param[out] msg Where to eventually store the read message.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
///
|
||||
/// Side effect: note that this method attempt to receive initial metadata for
|
||||
/// a stream if it hasn't yet been received.
|
||||
virtual void Read(R* msg, void* tag) = 0;
|
||||
};
|
||||
|
||||
/// An interface that can be fed a sequence of messages of type \a W.
|
||||
template <class W>
|
||||
class AsyncWriterInterface {
|
||||
public:
|
||||
virtual ~AsyncWriterInterface() {}
|
||||
|
||||
/// Request the writing of \a msg with identifying tag \a tag.
|
||||
///
|
||||
/// Only one write may be outstanding at any given time. This means that
|
||||
/// after calling Write, one must wait to receive \a tag from the completion
|
||||
/// queue BEFORE calling Write again.
|
||||
/// This is thread-safe with respect to \a AsyncReaderInterface::Read
|
||||
///
|
||||
/// \param[in] msg The message to be written.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
virtual void Write(const W& msg, void* tag) = 0;
|
||||
|
||||
/// Request the writing of \a msg using WriteOptions \a options with
|
||||
/// identifying tag \a tag.
|
||||
///
|
||||
/// Only one write may be outstanding at any given time. This means that
|
||||
/// after calling Write, one must wait to receive \a tag from the completion
|
||||
/// queue BEFORE calling Write again.
|
||||
/// WriteOptions \a options is used to set the write options of this message.
|
||||
/// This is thread-safe with respect to \a AsyncReaderInterface::Read
|
||||
///
|
||||
/// \param[in] msg The message to be written.
|
||||
/// \param[in] options The WriteOptions to be used to write this message.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
virtual void Write(const W& msg, WriteOptions options, void* tag) = 0;
|
||||
|
||||
/// Request the writing of \a msg and coalesce it with the writing
|
||||
/// of trailing metadata, using WriteOptions \a options with
|
||||
/// identifying tag \a tag.
|
||||
///
|
||||
/// For client, WriteLast is equivalent of performing Write and
|
||||
/// WritesDone in a single step.
|
||||
/// For server, WriteLast buffers the \a msg. The writing of \a msg is held
|
||||
/// until Finish is called, where \a msg and trailing metadata are coalesced
|
||||
/// and write is initiated. Note that WriteLast can only buffer \a msg up to
|
||||
/// the flow control window size. If \a msg size is larger than the window
|
||||
/// size, it will be sent on wire without buffering.
|
||||
///
|
||||
/// \param[in] msg The message to be written.
|
||||
/// \param[in] options The WriteOptions to be used to write this message.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
void WriteLast(const W& msg, WriteOptions options, void* tag) {
|
||||
Write(msg, options.set_last_message(), tag);
|
||||
}
|
||||
};
|
||||
|
||||
template <class R>
|
||||
class ClientAsyncReaderInterface : public ClientAsyncStreamingInterface,
|
||||
public AsyncReaderInterface<R> {};
|
||||
|
||||
/// Async client-side API for doing server-streaming RPCs,
|
||||
/// where the incoming message stream coming from the server has
|
||||
/// messages of type \a R.
|
||||
template <class R>
|
||||
class ClientAsyncReader final : public ClientAsyncReaderInterface<R> {
|
||||
public:
|
||||
/// Create a stream and write the first request out.
|
||||
/// \a tag will be notified on \a cq when the call has been started and
|
||||
/// \a request has been written out.
|
||||
/// Note that \a context will be used to fill in custom initial metadata
|
||||
/// used to send to the server when starting the call.
|
||||
template <class W>
|
||||
static ClientAsyncReader* Create(ChannelInterface* channel,
|
||||
CompletionQueue* cq, const RpcMethod& method,
|
||||
ClientContext* context, const W& request,
|
||||
void* tag) {
|
||||
Call call = channel->CreateCall(method, context, cq);
|
||||
return new (g_core_codegen_interface->grpc_call_arena_alloc(
|
||||
call.call(), sizeof(ClientAsyncReader)))
|
||||
ClientAsyncReader(call, context, request, tag);
|
||||
}
|
||||
|
||||
// always allocated against a call arena, no memory free required
|
||||
static void operator delete(void* ptr, std::size_t size) {
|
||||
assert(size == sizeof(ClientAsyncReader));
|
||||
}
|
||||
|
||||
/// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata
|
||||
/// method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - upon receiving initial metadata from the server,
|
||||
/// the \a ClientContext associated with this call is updated, and the
|
||||
/// calling code can access the received metadata through the
|
||||
/// \a ClientContext.
|
||||
void ReadInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
meta_ops_.set_output_tag(tag);
|
||||
meta_ops_.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&meta_ops_);
|
||||
}
|
||||
|
||||
void Read(R* msg, void* tag) override {
|
||||
read_ops_.set_output_tag(tag);
|
||||
if (!context_->initial_metadata_received_) {
|
||||
read_ops_.RecvInitialMetadata(context_);
|
||||
}
|
||||
read_ops_.RecvMessage(msg);
|
||||
call_.PerformOps(&read_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ClientAsyncStreamingInterface.Finish method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible initial and trailing metadata received from the server.
|
||||
void Finish(Status* status, void* tag) override {
|
||||
finish_ops_.set_output_tag(tag);
|
||||
if (!context_->initial_metadata_received_) {
|
||||
finish_ops_.RecvInitialMetadata(context_);
|
||||
}
|
||||
finish_ops_.ClientRecvStatus(context_, status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
template <class W>
|
||||
ClientAsyncReader(Call call, ClientContext* context, const W& request,
|
||||
void* tag)
|
||||
: context_(context), call_(call) {
|
||||
init_ops_.set_output_tag(tag);
|
||||
init_ops_.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok());
|
||||
init_ops_.ClientSendClose();
|
||||
call_.PerformOps(&init_ops_);
|
||||
}
|
||||
|
||||
ClientContext* context_;
|
||||
Call call_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
|
||||
init_ops_;
|
||||
CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_;
|
||||
};
|
||||
|
||||
/// Common interface for client side asynchronous writing.
|
||||
template <class W>
|
||||
class ClientAsyncWriterInterface : public ClientAsyncStreamingInterface,
|
||||
public AsyncWriterInterface<W> {
|
||||
public:
|
||||
/// Signal the client is done with the writes (half-close the client stream).
|
||||
/// Thread-safe with respect to \a AsyncReaderInterface::Read
|
||||
///
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
virtual void WritesDone(void* tag) = 0;
|
||||
};
|
||||
|
||||
/// Async API on the client side for doing client-streaming RPCs,
|
||||
/// where the outgoing message stream going to the server contains
|
||||
/// messages of type \a W.
|
||||
template <class W>
|
||||
class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> {
|
||||
public:
|
||||
/// Create a stream and write the first request out.
|
||||
/// \a tag will be notified on \a cq when the call has been started (i.e.
|
||||
/// intitial metadata sent) and \a request has been written out.
|
||||
/// Note that \a context will be used to fill in custom initial metadata
|
||||
/// used to send to the server when starting the call.
|
||||
/// \a response will be filled in with the single expected response
|
||||
/// message from the server upon a successful call to the \a Finish
|
||||
/// method of this instance.
|
||||
template <class R>
|
||||
static ClientAsyncWriter* Create(ChannelInterface* channel,
|
||||
CompletionQueue* cq, const RpcMethod& method,
|
||||
ClientContext* context, R* response,
|
||||
void* tag) {
|
||||
Call call = channel->CreateCall(method, context, cq);
|
||||
return new (g_core_codegen_interface->grpc_call_arena_alloc(
|
||||
call.call(), sizeof(ClientAsyncWriter)))
|
||||
ClientAsyncWriter(call, context, response, tag);
|
||||
}
|
||||
|
||||
// always allocated against a call arena, no memory free required
|
||||
static void operator delete(void* ptr, std::size_t size) {
|
||||
assert(size == sizeof(ClientAsyncWriter));
|
||||
}
|
||||
|
||||
/// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata method for
|
||||
/// semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - upon receiving initial metadata from the server, the \a ClientContext
|
||||
/// associated with this call is updated, and the calling code can access
|
||||
/// the received metadata through the \a ClientContext.
|
||||
void ReadInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
meta_ops_.set_output_tag(tag);
|
||||
meta_ops_.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&meta_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, WriteOptions options, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
write_ops_.ClientSendClose();
|
||||
}
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
void WritesDone(void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
write_ops_.ClientSendClose();
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ClientAsyncStreamingInterface.Finish method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible initial and trailing metadata received from the server.
|
||||
/// - attempts to fill in the \a response parameter passed to this class's
|
||||
/// constructor with the server's response message.
|
||||
void Finish(Status* status, void* tag) override {
|
||||
finish_ops_.set_output_tag(tag);
|
||||
if (!context_->initial_metadata_received_) {
|
||||
finish_ops_.RecvInitialMetadata(context_);
|
||||
}
|
||||
finish_ops_.ClientRecvStatus(context_, status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
template <class R>
|
||||
ClientAsyncWriter(Call call, ClientContext* context, R* response, void* tag)
|
||||
: context_(context), call_(call) {
|
||||
finish_ops_.RecvMessage(response);
|
||||
finish_ops_.AllowNoMessage();
|
||||
// if corked bit is set in context, we buffer up the initial metadata to
|
||||
// coalesce with later message to be sent. No op is performed.
|
||||
if (context_->initial_metadata_corked_) {
|
||||
write_ops_.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
} else {
|
||||
write_ops_.set_output_tag(tag);
|
||||
write_ops_.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
}
|
||||
|
||||
ClientContext* context_;
|
||||
Call call_;
|
||||
CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
|
||||
write_ops_;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage,
|
||||
CallOpClientRecvStatus>
|
||||
finish_ops_;
|
||||
};
|
||||
|
||||
/// Async client-side interface for bi-directional streaming,
|
||||
/// where the client-to-server message stream has messages of type \a W,
|
||||
/// and the server-to-client message stream has messages of type \a R.
|
||||
template <class W, class R>
|
||||
class ClientAsyncReaderWriterInterface : public ClientAsyncStreamingInterface,
|
||||
public AsyncWriterInterface<W>,
|
||||
public AsyncReaderInterface<R> {
|
||||
public:
|
||||
/// Signal the client is done with the writes (half-close the client stream).
|
||||
/// Thread-safe with respect to \a AsyncReaderInterface::Read
|
||||
///
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
virtual void WritesDone(void* tag) = 0;
|
||||
};
|
||||
|
||||
/// Async client-side interface for bi-directional streaming,
|
||||
/// where the outgoing message stream going to the server
|
||||
/// has messages of type \a W, and the incoming message stream coming
|
||||
/// from the server has messages of type \a R.
|
||||
template <class W, class R>
|
||||
class ClientAsyncReaderWriter final
|
||||
: public ClientAsyncReaderWriterInterface<W, R> {
|
||||
public:
|
||||
/// Create a stream and write the first request out.
|
||||
/// \a tag will be notified on \a cq when the call has been started (i.e.
|
||||
/// intitial metadata sent).
|
||||
/// Note that \a context will be used to fill in custom initial metadata
|
||||
/// used to send to the server when starting the call.
|
||||
static ClientAsyncReaderWriter* Create(ChannelInterface* channel,
|
||||
CompletionQueue* cq,
|
||||
const RpcMethod& method,
|
||||
ClientContext* context, void* tag) {
|
||||
Call call = channel->CreateCall(method, context, cq);
|
||||
|
||||
return new (g_core_codegen_interface->grpc_call_arena_alloc(
|
||||
call.call(), sizeof(ClientAsyncReaderWriter)))
|
||||
ClientAsyncReaderWriter(call, context, tag);
|
||||
}
|
||||
|
||||
// always allocated against a call arena, no memory free required
|
||||
static void operator delete(void* ptr, std::size_t size) {
|
||||
assert(size == sizeof(ClientAsyncReaderWriter));
|
||||
}
|
||||
|
||||
/// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata method
|
||||
/// for semantics of this method.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - upon receiving initial metadata from the server, the \a ClientContext
|
||||
/// is updated with it, and then the receiving initial metadata can
|
||||
/// be accessed through this \a ClientContext.
|
||||
void ReadInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
meta_ops_.set_output_tag(tag);
|
||||
meta_ops_.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&meta_ops_);
|
||||
}
|
||||
|
||||
void Read(R* msg, void* tag) override {
|
||||
read_ops_.set_output_tag(tag);
|
||||
if (!context_->initial_metadata_received_) {
|
||||
read_ops_.RecvInitialMetadata(context_);
|
||||
}
|
||||
read_ops_.RecvMessage(msg);
|
||||
call_.PerformOps(&read_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, WriteOptions options, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
write_ops_.ClientSendClose();
|
||||
}
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
void WritesDone(void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
write_ops_.ClientSendClose();
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ClientAsyncStreamingInterface.Finish method for semantics.
|
||||
/// Side effect
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible initial and trailing metadata sent from the server.
|
||||
void Finish(Status* status, void* tag) override {
|
||||
finish_ops_.set_output_tag(tag);
|
||||
if (!context_->initial_metadata_received_) {
|
||||
finish_ops_.RecvInitialMetadata(context_);
|
||||
}
|
||||
finish_ops_.ClientRecvStatus(context_, status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
ClientAsyncReaderWriter(Call call, ClientContext* context, void* tag)
|
||||
: context_(context), call_(call) {
|
||||
if (context_->initial_metadata_corked_) {
|
||||
// if corked bit is set in context, we buffer up the initial metadata to
|
||||
// coalesce with later message to be sent. No op is performed.
|
||||
write_ops_.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
} else {
|
||||
write_ops_.set_output_tag(tag);
|
||||
write_ops_.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
}
|
||||
|
||||
ClientContext* context_;
|
||||
Call call_;
|
||||
CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
|
||||
write_ops_;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_;
|
||||
};
|
||||
|
||||
template <class W, class R>
|
||||
class ServerAsyncReaderInterface : public ServerAsyncStreamingInterface,
|
||||
public AsyncReaderInterface<R> {
|
||||
public:
|
||||
/// Indicate that the stream is to be finished with a certain status code
|
||||
/// and also send out \a msg response to the client.
|
||||
/// Request notification for when the server has sent the response and the
|
||||
/// appropriate signals to the client to end the call.
|
||||
/// Should not be used concurrently with other operations.
|
||||
///
|
||||
/// It is appropriate to call this method when:
|
||||
/// * all messages from the client have been received (either known
|
||||
/// implictly, or explicitly because a previous
|
||||
/// \a AsyncReaderInterface::Read operation with a non-ok result,
|
||||
/// e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false').
|
||||
///
|
||||
/// This operation will end when the server has finished sending out initial
|
||||
/// metadata (if not sent already), response message, and status, or if
|
||||
/// some failure occurred when trying to do so.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[in] status To be sent to the client as the result of this call.
|
||||
/// \param[in] msg To be sent to the client as the response for this call.
|
||||
virtual void Finish(const W& msg, const Status& status, void* tag) = 0;
|
||||
|
||||
/// Indicate that the stream is to be finished with a certain
|
||||
/// non-OK status code.
|
||||
/// Request notification for when the server has sent the appropriate
|
||||
/// signals to the client to end the call.
|
||||
/// Should not be used concurrently with other operations.
|
||||
///
|
||||
/// This call is meant to end the call with some error, and can be called at
|
||||
/// any point that the server would like to "fail" the call (though note
|
||||
/// this shouldn't be called concurrently with any other "sending" call, like
|
||||
/// \a AsyncWriterInterface::Write).
|
||||
///
|
||||
/// This operation will end when the server has finished sending out initial
|
||||
/// metadata (if not sent already), and status, or if some failure occurred
|
||||
/// when trying to do so.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[in] status To be sent to the client as the result of this call.
|
||||
/// - Note: \a status must have a non-OK code.
|
||||
virtual void FinishWithError(const Status& status, void* tag) = 0;
|
||||
};
|
||||
|
||||
/// Async server-side API for doing client-streaming RPCs,
|
||||
/// where the incoming message stream from the client has messages of type \a R,
|
||||
/// and the single response message sent from the server is type \a W.
|
||||
template <class W, class R>
|
||||
class ServerAsyncReader final : public ServerAsyncReaderInterface<W, R> {
|
||||
public:
|
||||
explicit ServerAsyncReader(ServerContext* ctx)
|
||||
: call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
|
||||
|
||||
/// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - The initial metadata that will be sent to the client from this op will
|
||||
/// be taken from the \a ServerContext associated with the call.
|
||||
void SendInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
meta_ops_.set_output_tag(tag);
|
||||
meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
meta_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_.PerformOps(&meta_ops_);
|
||||
}
|
||||
|
||||
void Read(R* msg, void* tag) override {
|
||||
read_ops_.set_output_tag(tag);
|
||||
read_ops_.RecvMessage(msg);
|
||||
call_.PerformOps(&read_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ServerAsyncReaderInterface.Read method for semantics
|
||||
///
|
||||
/// Side effect:
|
||||
/// - also sends initial metadata if not alreay sent.
|
||||
/// - uses the \a ServerContext associated with this call to send possible
|
||||
/// initial and trailing metadata.
|
||||
///
|
||||
/// Note: \a msg is not sent if \a status has a non-OK code.
|
||||
void Finish(const W& msg, const Status& status, void* tag) override {
|
||||
finish_ops_.set_output_tag(tag);
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
finish_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
// The response is dropped if the status is not OK.
|
||||
if (status.ok()) {
|
||||
finish_ops_.ServerSendStatus(ctx_->trailing_metadata_,
|
||||
finish_ops_.SendMessage(msg));
|
||||
} else {
|
||||
finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
}
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ServerAsyncReaderInterface.Read method for semantics
|
||||
///
|
||||
/// Side effect:
|
||||
/// - also sends initial metadata if not alreay sent.
|
||||
/// - uses the \a ServerContext associated with this call to send possible
|
||||
/// initial and trailing metadata.
|
||||
void FinishWithError(const Status& status, void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!status.ok());
|
||||
finish_ops_.set_output_tag(tag);
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
finish_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
void BindCall(Call* call) override { call_ = *call; }
|
||||
|
||||
Call call_;
|
||||
ServerContext* ctx_;
|
||||
CallOpSet<CallOpSendInitialMetadata> meta_ops_;
|
||||
CallOpSet<CallOpRecvMessage<R>> read_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpServerSendStatus>
|
||||
finish_ops_;
|
||||
};
|
||||
|
||||
template <class W>
|
||||
class ServerAsyncWriterInterface : public ServerAsyncStreamingInterface,
|
||||
public AsyncWriterInterface<W> {
|
||||
public:
|
||||
/// Indicate that the stream is to be finished with a certain status code.
|
||||
/// Request notification for when the server has sent the appropriate
|
||||
/// signals to the client to end the call.
|
||||
/// Should not be used concurrently with other operations.
|
||||
///
|
||||
/// It is appropriate to call this method when either:
|
||||
/// * all messages from the client have been received (either known
|
||||
/// implictly, or explicitly because a previous \a
|
||||
/// AsyncReaderInterface::Read operation with a non-ok
|
||||
/// result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'.
|
||||
/// * it is desired to end the call early with some non-OK status code.
|
||||
///
|
||||
/// This operation will end when the server has finished sending out initial
|
||||
/// metadata (if not sent already), response message, and status, or if
|
||||
/// some failure occurred when trying to do so.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[in] status To be sent to the client as the result of this call.
|
||||
virtual void Finish(const Status& status, void* tag) = 0;
|
||||
|
||||
/// Request the writing of \a msg and coalesce it with trailing metadata which
|
||||
/// contains \a status, using WriteOptions options with
|
||||
/// identifying tag \a tag.
|
||||
///
|
||||
/// WriteAndFinish is equivalent of performing WriteLast and Finish
|
||||
/// in a single step.
|
||||
///
|
||||
/// \param[in] msg The message to be written.
|
||||
/// \param[in] options The WriteOptions to be used to write this message.
|
||||
/// \param[in] status The Status that server returns to client.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
virtual void WriteAndFinish(const W& msg, WriteOptions options,
|
||||
const Status& status, void* tag) = 0;
|
||||
};
|
||||
|
||||
/// Async server-side API for doing server streaming RPCs,
|
||||
/// where the outgoing message stream from the server has messages of type \a W.
|
||||
template <class W>
|
||||
class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> {
|
||||
public:
|
||||
explicit ServerAsyncWriter(ServerContext* ctx)
|
||||
: call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
|
||||
|
||||
/// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - The initial metadata that will be sent to the client from this op will
|
||||
/// be taken from the \a ServerContext associated with the call.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
void SendInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
meta_ops_.set_output_tag(tag);
|
||||
meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
meta_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_.PerformOps(&meta_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
EnsureInitialMetadataSent(&write_ops_);
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, WriteOptions options, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
}
|
||||
|
||||
EnsureInitialMetadataSent(&write_ops_);
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ServerAsyncWriterInterface.WriteAndFinish method for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - the \a ServerContext associated with this call is used
|
||||
/// for sending trailing (and initial) metadata to the client.
|
||||
///
|
||||
/// Note: \a status must have an OK code.
|
||||
void WriteAndFinish(const W& msg, WriteOptions options, const Status& status,
|
||||
void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
EnsureInitialMetadataSent(&write_ops_);
|
||||
options.set_buffer_hint();
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok());
|
||||
write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ServerAsyncWriterInterface.Finish method for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - the \a ServerContext associated with this call is used for sending
|
||||
/// trailing (and initial if not already sent) metadata to the client.
|
||||
///
|
||||
/// Note: there are no restrictions are the code of
|
||||
/// \a status,it may be non-OK
|
||||
void Finish(const Status& status, void* tag) override {
|
||||
finish_ops_.set_output_tag(tag);
|
||||
EnsureInitialMetadataSent(&finish_ops_);
|
||||
finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
void BindCall(Call* call) override { call_ = *call; }
|
||||
|
||||
template <class T>
|
||||
void EnsureInitialMetadataSent(T* ops) {
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
ops->SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ops->set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
Call call_;
|
||||
ServerContext* ctx_;
|
||||
CallOpSet<CallOpSendInitialMetadata> meta_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpServerSendStatus>
|
||||
write_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
|
||||
};
|
||||
|
||||
/// Server-side interface for asynchronous bi-directional streaming.
|
||||
template <class W, class R>
|
||||
class ServerAsyncReaderWriterInterface : public ServerAsyncStreamingInterface,
|
||||
public AsyncWriterInterface<W>,
|
||||
public AsyncReaderInterface<R> {
|
||||
public:
|
||||
/// Indicate that the stream is to be finished with a certain status code.
|
||||
/// Request notification for when the server has sent the appropriate
|
||||
/// signals to the client to end the call.
|
||||
/// Should not be used concurrently with other operations.
|
||||
///
|
||||
/// It is appropriate to call this method when either:
|
||||
/// * all messages from the client have been received (either known
|
||||
/// implictly, or explicitly because a previous \a
|
||||
/// AsyncReaderInterface::Read operation
|
||||
/// with a non-ok result (e.g., cq->Next(&read_tag, &ok) filled in 'ok'
|
||||
/// with 'false'.
|
||||
/// * it is desired to end the call early with some non-OK status code.
|
||||
///
|
||||
/// This operation will end when the server has finished sending out initial
|
||||
/// metadata (if not sent already), response message, and status, or if some
|
||||
/// failure occurred when trying to do so.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[in] status To be sent to the client as the result of this call.
|
||||
virtual void Finish(const Status& status, void* tag) = 0;
|
||||
|
||||
/// Request the writing of \a msg and coalesce it with trailing metadata which
|
||||
/// contains \a status, using WriteOptions options with
|
||||
/// identifying tag \a tag.
|
||||
///
|
||||
/// WriteAndFinish is equivalent of performing WriteLast and Finish in a
|
||||
/// single step.
|
||||
///
|
||||
/// \param[in] msg The message to be written.
|
||||
/// \param[in] options The WriteOptions to be used to write this message.
|
||||
/// \param[in] status The Status that server returns to client.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
virtual void WriteAndFinish(const W& msg, WriteOptions options,
|
||||
const Status& status, void* tag) = 0;
|
||||
};
|
||||
|
||||
/// Async server-side API for doing bidirectional streaming RPCs,
|
||||
/// where the incoming message stream coming from the client has messages of
|
||||
/// type \a R, and the outgoing message stream coming from the server has
|
||||
/// messages of type \a W.
|
||||
template <class W, class R>
|
||||
class ServerAsyncReaderWriter final
|
||||
: public ServerAsyncReaderWriterInterface<W, R> {
|
||||
public:
|
||||
explicit ServerAsyncReaderWriter(ServerContext* ctx)
|
||||
: call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
|
||||
|
||||
/// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - The initial metadata that will be sent to the client from this op will
|
||||
/// be taken from the \a ServerContext associated with the call.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
void SendInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
meta_ops_.set_output_tag(tag);
|
||||
meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
meta_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_.PerformOps(&meta_ops_);
|
||||
}
|
||||
|
||||
void Read(R* msg, void* tag) override {
|
||||
read_ops_.set_output_tag(tag);
|
||||
read_ops_.RecvMessage(msg);
|
||||
call_.PerformOps(&read_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
EnsureInitialMetadataSent(&write_ops_);
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
void Write(const W& msg, WriteOptions options, void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
}
|
||||
EnsureInitialMetadataSent(&write_ops_);
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok());
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ServerAsyncReaderWriterInterface.WriteAndFinish
|
||||
/// method for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - the \a ServerContext associated with this call is used
|
||||
/// for sending trailing (and initial) metadata to the client.
|
||||
///
|
||||
/// Note: \a status must have an OK code.
|
||||
void WriteAndFinish(const W& msg, WriteOptions options, const Status& status,
|
||||
void* tag) override {
|
||||
write_ops_.set_output_tag(tag);
|
||||
EnsureInitialMetadataSent(&write_ops_);
|
||||
options.set_buffer_hint();
|
||||
GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok());
|
||||
write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
call_.PerformOps(&write_ops_);
|
||||
}
|
||||
|
||||
/// See the \a ServerAsyncReaderWriterInterface.Finish method for semantics.
|
||||
///
|
||||
/// Implicit input parameter:
|
||||
/// - the \a ServerContext associated with this call is used for sending
|
||||
/// trailing (and initial if not already sent) metadata to the client.
|
||||
///
|
||||
/// Note: there are no restrictions are the code of \a status,
|
||||
/// it may be non-OK
|
||||
void Finish(const Status& status, void* tag) override {
|
||||
finish_ops_.set_output_tag(tag);
|
||||
EnsureInitialMetadataSent(&finish_ops_);
|
||||
|
||||
finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class ::grpc::Server;
|
||||
|
||||
void BindCall(Call* call) override { call_ = *call; }
|
||||
|
||||
template <class T>
|
||||
void EnsureInitialMetadataSent(T* ops) {
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
ops->SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ops->set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
Call call_;
|
||||
ServerContext* ctx_;
|
||||
CallOpSet<CallOpSendInitialMetadata> meta_ops_;
|
||||
CallOpSet<CallOpRecvMessage<R>> read_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpServerSendStatus>
|
||||
write_ops_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
|
||||
@@ -1,269 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H
|
||||
#define GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <grpc++/impl/codegen/call.h>
|
||||
#include <grpc++/impl/codegen/channel_interface.h>
|
||||
#include <grpc++/impl/codegen/client_context.h>
|
||||
#include <grpc++/impl/codegen/server_context.h>
|
||||
#include <grpc++/impl/codegen/service_type.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class CompletionQueue;
|
||||
extern CoreCodegenInterface* g_core_codegen_interface;
|
||||
|
||||
/// An interface relevant for async client side unary RPCS (which send
|
||||
/// one request message to a server and receive one response message).
|
||||
template <class R>
|
||||
class ClientAsyncResponseReaderInterface {
|
||||
public:
|
||||
virtual ~ClientAsyncResponseReaderInterface() {}
|
||||
|
||||
/// Request notification of the reading of initial metadata. Completion
|
||||
/// will be notified by \a tag on the associated completion queue.
|
||||
/// This call is optional, but if it is used, it cannot be used concurrently
|
||||
/// with or after the \a Finish method.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
virtual void ReadInitialMetadata(void* tag) = 0;
|
||||
|
||||
/// Request to receive the server's response \a msg and final \a status for
|
||||
/// the call, and to notify \a tag on this call's completion queue when
|
||||
/// finished.
|
||||
///
|
||||
/// This function will return when either:
|
||||
/// - when the server's response message and status have been received.
|
||||
/// - when the server has returned a non-OK status (no message expected in
|
||||
/// this case).
|
||||
/// - when the call failed for some reason and the library generated a
|
||||
/// non-OK status.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[out] status To be updated with the operation status.
|
||||
/// \param[out] msg To be filled in with the server's response message.
|
||||
virtual void Finish(R* msg, Status* status, void* tag) = 0;
|
||||
};
|
||||
|
||||
/// Async API for client-side unary RPCs, where the message response
|
||||
/// received from the server is of type \a R.
|
||||
template <class R>
|
||||
class ClientAsyncResponseReader final
|
||||
: public ClientAsyncResponseReaderInterface<R> {
|
||||
public:
|
||||
/// Start a call and write the request out.
|
||||
/// \a tag will be notified on \a cq when the call has been started (i.e.
|
||||
/// intitial metadata sent) and \a request has been written out.
|
||||
/// Note that \a context will be used to fill in custom initial metadata
|
||||
/// used to send to the server when starting the call.
|
||||
template <class W>
|
||||
static ClientAsyncResponseReader* Create(ChannelInterface* channel,
|
||||
CompletionQueue* cq,
|
||||
const RpcMethod& method,
|
||||
ClientContext* context,
|
||||
const W& request) {
|
||||
Call call = channel->CreateCall(method, context, cq);
|
||||
return new (g_core_codegen_interface->grpc_call_arena_alloc(
|
||||
call.call(), sizeof(ClientAsyncResponseReader)))
|
||||
ClientAsyncResponseReader(call, context, request);
|
||||
}
|
||||
|
||||
// always allocated against a call arena, no memory free required
|
||||
static void operator delete(void* ptr, std::size_t size) {
|
||||
assert(size == sizeof(ClientAsyncResponseReader));
|
||||
}
|
||||
|
||||
/// See \a ClientAsyncResponseReaderInterface::ReadInitialMetadata for
|
||||
/// semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible initial and trailing metadata sent from the server.
|
||||
void ReadInitialMetadata(void* tag) {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
meta_buf.set_output_tag(tag);
|
||||
meta_buf.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&meta_buf);
|
||||
}
|
||||
|
||||
/// See \a ClientAysncResponseReaderInterface::Finish for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible initial and trailing metadata sent from the server.
|
||||
void Finish(R* msg, Status* status, void* tag) {
|
||||
finish_buf.set_output_tag(tag);
|
||||
if (!context_->initial_metadata_received_) {
|
||||
finish_buf.RecvInitialMetadata(context_);
|
||||
}
|
||||
finish_buf.RecvMessage(msg);
|
||||
finish_buf.AllowNoMessage();
|
||||
finish_buf.ClientRecvStatus(context_, status);
|
||||
call_.PerformOps(&finish_buf);
|
||||
}
|
||||
|
||||
private:
|
||||
ClientContext* const context_;
|
||||
Call call_;
|
||||
|
||||
template <class W>
|
||||
ClientAsyncResponseReader(Call call, ClientContext* context, const W& request)
|
||||
: context_(context), call_(call) {
|
||||
init_buf.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(init_buf.SendMessage(request).ok());
|
||||
init_buf.ClientSendClose();
|
||||
call_.PerformOps(&init_buf);
|
||||
}
|
||||
|
||||
// disable operator new
|
||||
static void* operator new(std::size_t size);
|
||||
static void* operator new(std::size_t size, void* p) { return p; }
|
||||
|
||||
SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpClientSendClose>
|
||||
init_buf;
|
||||
CallOpSet<CallOpRecvInitialMetadata> meta_buf;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>,
|
||||
CallOpClientRecvStatus>
|
||||
finish_buf;
|
||||
};
|
||||
|
||||
/// Async server-side API for handling unary calls, where the single
|
||||
/// response message sent to the client is of type \a W.
|
||||
template <class W>
|
||||
class ServerAsyncResponseWriter final : public ServerAsyncStreamingInterface {
|
||||
public:
|
||||
explicit ServerAsyncResponseWriter(ServerContext* ctx)
|
||||
: call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
|
||||
|
||||
/// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// The initial metadata that will be sent to the client from this op will
|
||||
/// be taken from the \a ServerContext associated with the call.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
void SendInitialMetadata(void* tag) override {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
meta_buf_.set_output_tag(tag);
|
||||
meta_buf_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
meta_buf_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_.PerformOps(&meta_buf_);
|
||||
}
|
||||
|
||||
/// Indicate that the stream is to be finished and request notification
|
||||
/// when the server has sent the appropriate signals to the client to
|
||||
/// end the call. Should not be used concurrently with other operations.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[in] status To be sent to the client as the result of the call.
|
||||
/// \param[in] msg Message to be sent to the client.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - also sends initial metadata if not already sent (using the
|
||||
/// \a ServerContext associated with this call).
|
||||
///
|
||||
/// Note: if \a status has a non-OK code, then \a msg will not be sent,
|
||||
/// and the client will receive only the status with possible trailing
|
||||
/// metadata.
|
||||
void Finish(const W& msg, const Status& status, void* tag) {
|
||||
finish_buf_.set_output_tag(tag);
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
finish_buf_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
finish_buf_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
// The response is dropped if the status is not OK.
|
||||
if (status.ok()) {
|
||||
finish_buf_.ServerSendStatus(ctx_->trailing_metadata_,
|
||||
finish_buf_.SendMessage(msg));
|
||||
} else {
|
||||
finish_buf_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
}
|
||||
call_.PerformOps(&finish_buf_);
|
||||
}
|
||||
|
||||
/// Indicate that the stream is to be finished with a non-OK status,
|
||||
/// and request notification for when the server has finished sending the
|
||||
/// appropriate signals to the client to end the call.
|
||||
/// Should not be used concurrently with other operations.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
/// \param[in] status To be sent to the client as the result of the call.
|
||||
/// - Note: \a status must have a non-OK code.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - also sends initial metadata if not already sent (using the
|
||||
/// \a ServerContext associated with this call).
|
||||
void FinishWithError(const Status& status, void* tag) {
|
||||
GPR_CODEGEN_ASSERT(!status.ok());
|
||||
finish_buf_.set_output_tag(tag);
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
finish_buf_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
finish_buf_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
finish_buf_.ServerSendStatus(ctx_->trailing_metadata_, status);
|
||||
call_.PerformOps(&finish_buf_);
|
||||
}
|
||||
|
||||
private:
|
||||
void BindCall(Call* call) override { call_ = *call; }
|
||||
|
||||
Call call_;
|
||||
ServerContext* ctx_;
|
||||
CallOpSet<CallOpSendInitialMetadata> meta_buf_;
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpServerSendStatus>
|
||||
finish_buf_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
namespace std {
|
||||
template <class R>
|
||||
class default_delete<grpc::ClientAsyncResponseReader<R>> {
|
||||
public:
|
||||
void operator()(void* p) {}
|
||||
};
|
||||
template <class R>
|
||||
class default_delete<grpc::ClientAsyncResponseReaderInterface<R>> {
|
||||
public:
|
||||
void operator()(void* p) {}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H
|
||||
@@ -1,681 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CALL_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CALL_H
|
||||
|
||||
#include <assert.h>
|
||||
#include <cstring>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/codegen/call_hook.h>
|
||||
#include <grpc++/impl/codegen/client_context.h>
|
||||
#include <grpc++/impl/codegen/completion_queue_tag.h>
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/serialization_traits.h>
|
||||
#include <grpc++/impl/codegen/slice.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc++/impl/codegen/string_ref.h>
|
||||
|
||||
#include <grpc/impl/codegen/atm.h>
|
||||
#include <grpc/impl/codegen/compression_types.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
struct grpc_byte_buffer;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class ByteBuffer;
|
||||
class Call;
|
||||
class CallHook;
|
||||
class CompletionQueue;
|
||||
extern CoreCodegenInterface* g_core_codegen_interface;
|
||||
|
||||
const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin";
|
||||
|
||||
// TODO(yangg) if the map is changed before we send, the pointers will be a
|
||||
// mess. Make sure it does not happen.
|
||||
inline grpc_metadata* FillMetadataArray(
|
||||
const std::multimap<grpc::string, grpc::string>& metadata,
|
||||
size_t* metadata_count, const grpc::string& optional_error_details) {
|
||||
*metadata_count = metadata.size() + (optional_error_details.empty() ? 0 : 1);
|
||||
if (*metadata_count == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
grpc_metadata* metadata_array =
|
||||
(grpc_metadata*)(g_core_codegen_interface->gpr_malloc(
|
||||
(*metadata_count) * sizeof(grpc_metadata)));
|
||||
size_t i = 0;
|
||||
for (auto iter = metadata.cbegin(); iter != metadata.cend(); ++iter, ++i) {
|
||||
metadata_array[i].key = SliceReferencingString(iter->first);
|
||||
metadata_array[i].value = SliceReferencingString(iter->second);
|
||||
}
|
||||
if (!optional_error_details.empty()) {
|
||||
metadata_array[i].key =
|
||||
g_core_codegen_interface->grpc_slice_from_static_buffer(
|
||||
kBinaryErrorDetailsKey, sizeof(kBinaryErrorDetailsKey) - 1);
|
||||
metadata_array[i].value = SliceReferencingString(optional_error_details);
|
||||
}
|
||||
return metadata_array;
|
||||
}
|
||||
|
||||
/// Per-message write options.
|
||||
class WriteOptions {
|
||||
public:
|
||||
WriteOptions() : flags_(0), last_message_(false) {}
|
||||
WriteOptions(const WriteOptions& other)
|
||||
: flags_(other.flags_), last_message_(other.last_message_) {}
|
||||
|
||||
/// Clear all flags.
|
||||
inline void Clear() { flags_ = 0; }
|
||||
|
||||
/// Returns raw flags bitset.
|
||||
inline uint32_t flags() const { return flags_; }
|
||||
|
||||
/// Sets flag for the disabling of compression for the next message write.
|
||||
///
|
||||
/// \sa GRPC_WRITE_NO_COMPRESS
|
||||
inline WriteOptions& set_no_compression() {
|
||||
SetBit(GRPC_WRITE_NO_COMPRESS);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Clears flag for the disabling of compression for the next message write.
|
||||
///
|
||||
/// \sa GRPC_WRITE_NO_COMPRESS
|
||||
inline WriteOptions& clear_no_compression() {
|
||||
ClearBit(GRPC_WRITE_NO_COMPRESS);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Get value for the flag indicating whether compression for the next
|
||||
/// message write is forcefully disabled.
|
||||
///
|
||||
/// \sa GRPC_WRITE_NO_COMPRESS
|
||||
inline bool get_no_compression() const {
|
||||
return GetBit(GRPC_WRITE_NO_COMPRESS);
|
||||
}
|
||||
|
||||
/// Sets flag indicating that the write may be buffered and need not go out on
|
||||
/// the wire immediately.
|
||||
///
|
||||
/// \sa GRPC_WRITE_BUFFER_HINT
|
||||
inline WriteOptions& set_buffer_hint() {
|
||||
SetBit(GRPC_WRITE_BUFFER_HINT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Clears flag indicating that the write may be buffered and need not go out
|
||||
/// on the wire immediately.
|
||||
///
|
||||
/// \sa GRPC_WRITE_BUFFER_HINT
|
||||
inline WriteOptions& clear_buffer_hint() {
|
||||
ClearBit(GRPC_WRITE_BUFFER_HINT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Get value for the flag indicating that the write may be buffered and need
|
||||
/// not go out on the wire immediately.
|
||||
///
|
||||
/// \sa GRPC_WRITE_BUFFER_HINT
|
||||
inline bool get_buffer_hint() const { return GetBit(GRPC_WRITE_BUFFER_HINT); }
|
||||
|
||||
/// corked bit: aliases set_buffer_hint currently, with the intent that
|
||||
/// set_buffer_hint will be removed in the future
|
||||
inline WriteOptions& set_corked() {
|
||||
SetBit(GRPC_WRITE_BUFFER_HINT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline WriteOptions& clear_corked() {
|
||||
ClearBit(GRPC_WRITE_BUFFER_HINT);
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline bool is_corked() const { return GetBit(GRPC_WRITE_BUFFER_HINT); }
|
||||
|
||||
/// last-message bit: indicates this is the last message in a stream
|
||||
/// client-side: makes Write the equivalent of performing Write, WritesDone
|
||||
/// in a single step
|
||||
/// server-side: hold the Write until the service handler returns (sync api)
|
||||
/// or until Finish is called (async api)
|
||||
inline WriteOptions& set_last_message() {
|
||||
last_message_ = true;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Clears flag indicating that this is the last message in a stream,
|
||||
/// disabling coalescing.
|
||||
inline WriteOptions& clear_last_messsage() {
|
||||
last_message_ = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Get value for the flag indicating that this is the last message, and
|
||||
/// should be coalesced with trailing metadata.
|
||||
///
|
||||
/// \sa GRPC_WRITE_LAST_MESSAGE
|
||||
bool is_last_message() const { return last_message_; }
|
||||
|
||||
WriteOptions& operator=(const WriteOptions& rhs) {
|
||||
flags_ = rhs.flags_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
void SetBit(const uint32_t mask) { flags_ |= mask; }
|
||||
|
||||
void ClearBit(const uint32_t mask) { flags_ &= ~mask; }
|
||||
|
||||
bool GetBit(const uint32_t mask) const { return (flags_ & mask) != 0; }
|
||||
|
||||
uint32_t flags_;
|
||||
bool last_message_;
|
||||
};
|
||||
|
||||
/// Default argument for CallOpSet. I is unused by the class, but can be
|
||||
/// used for generating multiple names for the same thing.
|
||||
template <int I>
|
||||
class CallNoOp {
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {}
|
||||
void FinishOp(bool* status) {}
|
||||
};
|
||||
|
||||
class CallOpSendInitialMetadata {
|
||||
public:
|
||||
CallOpSendInitialMetadata() : send_(false) {
|
||||
maybe_compression_level_.is_set = false;
|
||||
}
|
||||
|
||||
void SendInitialMetadata(
|
||||
const std::multimap<grpc::string, grpc::string>& metadata,
|
||||
uint32_t flags) {
|
||||
maybe_compression_level_.is_set = false;
|
||||
send_ = true;
|
||||
flags_ = flags;
|
||||
initial_metadata_ =
|
||||
FillMetadataArray(metadata, &initial_metadata_count_, "");
|
||||
}
|
||||
|
||||
void set_compression_level(grpc_compression_level level) {
|
||||
maybe_compression_level_.is_set = true;
|
||||
maybe_compression_level_.level = level;
|
||||
}
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (!send_) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
||||
op->flags = flags_;
|
||||
op->reserved = NULL;
|
||||
op->data.send_initial_metadata.count = initial_metadata_count_;
|
||||
op->data.send_initial_metadata.metadata = initial_metadata_;
|
||||
op->data.send_initial_metadata.maybe_compression_level.is_set =
|
||||
maybe_compression_level_.is_set;
|
||||
if (maybe_compression_level_.is_set) {
|
||||
op->data.send_initial_metadata.maybe_compression_level.level =
|
||||
maybe_compression_level_.level;
|
||||
}
|
||||
}
|
||||
void FinishOp(bool* status) {
|
||||
if (!send_) return;
|
||||
g_core_codegen_interface->gpr_free(initial_metadata_);
|
||||
send_ = false;
|
||||
}
|
||||
|
||||
bool send_;
|
||||
uint32_t flags_;
|
||||
size_t initial_metadata_count_;
|
||||
grpc_metadata* initial_metadata_;
|
||||
struct {
|
||||
bool is_set;
|
||||
grpc_compression_level level;
|
||||
} maybe_compression_level_;
|
||||
};
|
||||
|
||||
class CallOpSendMessage {
|
||||
public:
|
||||
CallOpSendMessage() : send_buf_(nullptr), own_buf_(false) {}
|
||||
|
||||
/// Send \a message using \a options for the write. The \a options are cleared
|
||||
/// after use.
|
||||
template <class M>
|
||||
Status SendMessage(const M& message,
|
||||
WriteOptions options) GRPC_MUST_USE_RESULT;
|
||||
|
||||
template <class M>
|
||||
Status SendMessage(const M& message) GRPC_MUST_USE_RESULT;
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (send_buf_ == nullptr) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_SEND_MESSAGE;
|
||||
op->flags = write_options_.flags();
|
||||
op->reserved = NULL;
|
||||
op->data.send_message.send_message = send_buf_;
|
||||
// Flags are per-message: clear them after use.
|
||||
write_options_.Clear();
|
||||
}
|
||||
void FinishOp(bool* status) {
|
||||
if (own_buf_) g_core_codegen_interface->grpc_byte_buffer_destroy(send_buf_);
|
||||
send_buf_ = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
grpc_byte_buffer* send_buf_;
|
||||
WriteOptions write_options_;
|
||||
bool own_buf_;
|
||||
};
|
||||
|
||||
template <class M>
|
||||
Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) {
|
||||
write_options_ = options;
|
||||
return SerializationTraits<M>::Serialize(message, &send_buf_, &own_buf_);
|
||||
}
|
||||
|
||||
template <class M>
|
||||
Status CallOpSendMessage::SendMessage(const M& message) {
|
||||
return SendMessage(message, WriteOptions());
|
||||
}
|
||||
|
||||
template <class R>
|
||||
class CallOpRecvMessage {
|
||||
public:
|
||||
CallOpRecvMessage()
|
||||
: got_message(false),
|
||||
message_(nullptr),
|
||||
allow_not_getting_message_(false) {}
|
||||
|
||||
void RecvMessage(R* message) { message_ = message; }
|
||||
|
||||
// Do not change status if no message is received.
|
||||
void AllowNoMessage() { allow_not_getting_message_ = true; }
|
||||
|
||||
bool got_message;
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (message_ == nullptr) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_RECV_MESSAGE;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op->data.recv_message.recv_message = &recv_buf_;
|
||||
}
|
||||
|
||||
void FinishOp(bool* status) {
|
||||
if (message_ == nullptr) return;
|
||||
if (recv_buf_) {
|
||||
if (*status) {
|
||||
got_message = *status =
|
||||
SerializationTraits<R>::Deserialize(recv_buf_, message_).ok();
|
||||
} else {
|
||||
got_message = false;
|
||||
g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_);
|
||||
}
|
||||
} else {
|
||||
got_message = false;
|
||||
if (!allow_not_getting_message_) {
|
||||
*status = false;
|
||||
}
|
||||
}
|
||||
message_ = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
R* message_;
|
||||
grpc_byte_buffer* recv_buf_;
|
||||
bool allow_not_getting_message_;
|
||||
};
|
||||
|
||||
namespace CallOpGenericRecvMessageHelper {
|
||||
class DeserializeFunc {
|
||||
public:
|
||||
virtual Status Deserialize(grpc_byte_buffer* buf) = 0;
|
||||
virtual ~DeserializeFunc() {}
|
||||
};
|
||||
|
||||
template <class R>
|
||||
class DeserializeFuncType final : public DeserializeFunc {
|
||||
public:
|
||||
DeserializeFuncType(R* message) : message_(message) {}
|
||||
Status Deserialize(grpc_byte_buffer* buf) override {
|
||||
return SerializationTraits<R>::Deserialize(buf, message_);
|
||||
}
|
||||
|
||||
~DeserializeFuncType() override {}
|
||||
|
||||
private:
|
||||
R* message_; // Not a managed pointer because management is external to this
|
||||
};
|
||||
} // namespace CallOpGenericRecvMessageHelper
|
||||
|
||||
class CallOpGenericRecvMessage {
|
||||
public:
|
||||
CallOpGenericRecvMessage()
|
||||
: got_message(false), allow_not_getting_message_(false) {}
|
||||
|
||||
template <class R>
|
||||
void RecvMessage(R* message) {
|
||||
// Use an explicit base class pointer to avoid resolution error in the
|
||||
// following unique_ptr::reset for some old implementations.
|
||||
CallOpGenericRecvMessageHelper::DeserializeFunc* func =
|
||||
new CallOpGenericRecvMessageHelper::DeserializeFuncType<R>(message);
|
||||
deserialize_.reset(func);
|
||||
}
|
||||
|
||||
// Do not change status if no message is received.
|
||||
void AllowNoMessage() { allow_not_getting_message_ = true; }
|
||||
|
||||
bool got_message;
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (!deserialize_) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_RECV_MESSAGE;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op->data.recv_message.recv_message = &recv_buf_;
|
||||
}
|
||||
|
||||
void FinishOp(bool* status) {
|
||||
if (!deserialize_) return;
|
||||
if (recv_buf_) {
|
||||
if (*status) {
|
||||
got_message = true;
|
||||
*status = deserialize_->Deserialize(recv_buf_).ok();
|
||||
} else {
|
||||
got_message = false;
|
||||
g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_);
|
||||
}
|
||||
} else {
|
||||
got_message = false;
|
||||
if (!allow_not_getting_message_) {
|
||||
*status = false;
|
||||
}
|
||||
}
|
||||
deserialize_.reset();
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<CallOpGenericRecvMessageHelper::DeserializeFunc> deserialize_;
|
||||
grpc_byte_buffer* recv_buf_;
|
||||
bool allow_not_getting_message_;
|
||||
};
|
||||
|
||||
class CallOpClientSendClose {
|
||||
public:
|
||||
CallOpClientSendClose() : send_(false) {}
|
||||
|
||||
void ClientSendClose() { send_ = true; }
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (!send_) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
}
|
||||
void FinishOp(bool* status) { send_ = false; }
|
||||
|
||||
private:
|
||||
bool send_;
|
||||
};
|
||||
|
||||
class CallOpServerSendStatus {
|
||||
public:
|
||||
CallOpServerSendStatus() : send_status_available_(false) {}
|
||||
|
||||
void ServerSendStatus(
|
||||
const std::multimap<grpc::string, grpc::string>& trailing_metadata,
|
||||
const Status& status) {
|
||||
send_error_details_ = status.error_details();
|
||||
trailing_metadata_ = FillMetadataArray(
|
||||
trailing_metadata, &trailing_metadata_count_, send_error_details_);
|
||||
send_status_available_ = true;
|
||||
send_status_code_ = static_cast<grpc_status_code>(status.error_code());
|
||||
send_error_message_ = status.error_message();
|
||||
}
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (!send_status_available_) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
|
||||
op->data.send_status_from_server.trailing_metadata_count =
|
||||
trailing_metadata_count_;
|
||||
op->data.send_status_from_server.trailing_metadata = trailing_metadata_;
|
||||
op->data.send_status_from_server.status = send_status_code_;
|
||||
error_message_slice_ = SliceReferencingString(send_error_message_);
|
||||
op->data.send_status_from_server.status_details =
|
||||
send_error_message_.empty() ? nullptr : &error_message_slice_;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
}
|
||||
|
||||
void FinishOp(bool* status) {
|
||||
if (!send_status_available_) return;
|
||||
g_core_codegen_interface->gpr_free(trailing_metadata_);
|
||||
send_status_available_ = false;
|
||||
}
|
||||
|
||||
private:
|
||||
bool send_status_available_;
|
||||
grpc_status_code send_status_code_;
|
||||
grpc::string send_error_details_;
|
||||
grpc::string send_error_message_;
|
||||
size_t trailing_metadata_count_;
|
||||
grpc_metadata* trailing_metadata_;
|
||||
grpc_slice error_message_slice_;
|
||||
};
|
||||
|
||||
class CallOpRecvInitialMetadata {
|
||||
public:
|
||||
CallOpRecvInitialMetadata() : metadata_map_(nullptr) {}
|
||||
|
||||
void RecvInitialMetadata(ClientContext* context) {
|
||||
context->initial_metadata_received_ = true;
|
||||
metadata_map_ = &context->recv_initial_metadata_;
|
||||
}
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (metadata_map_ == nullptr) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_RECV_INITIAL_METADATA;
|
||||
op->data.recv_initial_metadata.recv_initial_metadata = metadata_map_->arr();
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
}
|
||||
|
||||
void FinishOp(bool* status) {
|
||||
if (metadata_map_ == nullptr) return;
|
||||
metadata_map_->FillMap();
|
||||
metadata_map_ = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
MetadataMap* metadata_map_;
|
||||
};
|
||||
|
||||
class CallOpClientRecvStatus {
|
||||
public:
|
||||
CallOpClientRecvStatus() : recv_status_(nullptr) {}
|
||||
|
||||
void ClientRecvStatus(ClientContext* context, Status* status) {
|
||||
metadata_map_ = &context->trailing_metadata_;
|
||||
recv_status_ = status;
|
||||
error_message_ = g_core_codegen_interface->grpc_empty_slice();
|
||||
}
|
||||
|
||||
protected:
|
||||
void AddOp(grpc_op* ops, size_t* nops) {
|
||||
if (recv_status_ == nullptr) return;
|
||||
grpc_op* op = &ops[(*nops)++];
|
||||
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
||||
op->data.recv_status_on_client.trailing_metadata = metadata_map_->arr();
|
||||
op->data.recv_status_on_client.status = &status_code_;
|
||||
op->data.recv_status_on_client.status_details = &error_message_;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
}
|
||||
|
||||
void FinishOp(bool* status) {
|
||||
if (recv_status_ == nullptr) return;
|
||||
metadata_map_->FillMap();
|
||||
grpc::string binary_error_details;
|
||||
auto iter = metadata_map_->map()->find(kBinaryErrorDetailsKey);
|
||||
if (iter != metadata_map_->map()->end()) {
|
||||
binary_error_details =
|
||||
grpc::string(iter->second.begin(), iter->second.length());
|
||||
}
|
||||
*recv_status_ = Status(static_cast<StatusCode>(status_code_),
|
||||
grpc::string(GRPC_SLICE_START_PTR(error_message_),
|
||||
GRPC_SLICE_END_PTR(error_message_)),
|
||||
binary_error_details);
|
||||
g_core_codegen_interface->grpc_slice_unref(error_message_);
|
||||
recv_status_ = nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
MetadataMap* metadata_map_;
|
||||
Status* recv_status_;
|
||||
grpc_status_code status_code_;
|
||||
grpc_slice error_message_;
|
||||
};
|
||||
|
||||
/// An abstract collection of call ops, used to generate the
|
||||
/// grpc_call_op structure to pass down to the lower layers,
|
||||
/// and as it is-a CompletionQueueTag, also massages the final
|
||||
/// completion into the correct form for consumption in the C++
|
||||
/// API.
|
||||
class CallOpSetInterface : public CompletionQueueTag {
|
||||
public:
|
||||
/// Fills in grpc_op, starting from ops[*nops] and moving
|
||||
/// upwards.
|
||||
virtual void FillOps(grpc_call* call, grpc_op* ops, size_t* nops) = 0;
|
||||
};
|
||||
|
||||
/// Primary implementaiton of CallOpSetInterface.
|
||||
/// Since we cannot use variadic templates, we declare slots up to
|
||||
/// the maximum count of ops we'll need in a set. We leverage the
|
||||
/// empty base class optimization to slim this class (especially
|
||||
/// when there are many unused slots used). To avoid duplicate base classes,
|
||||
/// the template parmeter for CallNoOp is varied by argument position.
|
||||
template <class Op1 = CallNoOp<1>, class Op2 = CallNoOp<2>,
|
||||
class Op3 = CallNoOp<3>, class Op4 = CallNoOp<4>,
|
||||
class Op5 = CallNoOp<5>, class Op6 = CallNoOp<6>>
|
||||
class CallOpSet : public CallOpSetInterface,
|
||||
public Op1,
|
||||
public Op2,
|
||||
public Op3,
|
||||
public Op4,
|
||||
public Op5,
|
||||
public Op6 {
|
||||
public:
|
||||
CallOpSet() : return_tag_(this) {}
|
||||
void FillOps(grpc_call* call, grpc_op* ops, size_t* nops) override {
|
||||
this->Op1::AddOp(ops, nops);
|
||||
this->Op2::AddOp(ops, nops);
|
||||
this->Op3::AddOp(ops, nops);
|
||||
this->Op4::AddOp(ops, nops);
|
||||
this->Op5::AddOp(ops, nops);
|
||||
this->Op6::AddOp(ops, nops);
|
||||
g_core_codegen_interface->grpc_call_ref(call);
|
||||
call_ = call;
|
||||
}
|
||||
|
||||
bool FinalizeResult(void** tag, bool* status) override {
|
||||
this->Op1::FinishOp(status);
|
||||
this->Op2::FinishOp(status);
|
||||
this->Op3::FinishOp(status);
|
||||
this->Op4::FinishOp(status);
|
||||
this->Op5::FinishOp(status);
|
||||
this->Op6::FinishOp(status);
|
||||
*tag = return_tag_;
|
||||
|
||||
g_core_codegen_interface->grpc_call_unref(call_);
|
||||
return true;
|
||||
}
|
||||
|
||||
void set_output_tag(void* return_tag) { return_tag_ = return_tag; }
|
||||
|
||||
private:
|
||||
void* return_tag_;
|
||||
grpc_call* call_;
|
||||
};
|
||||
|
||||
/// A CallOpSet that does not post completions to the completion queue.
|
||||
///
|
||||
/// Allows hiding some completions that the C core must generate from
|
||||
/// C++ users.
|
||||
template <class Op1 = CallNoOp<1>, class Op2 = CallNoOp<2>,
|
||||
class Op3 = CallNoOp<3>, class Op4 = CallNoOp<4>,
|
||||
class Op5 = CallNoOp<5>, class Op6 = CallNoOp<6>>
|
||||
class SneakyCallOpSet : public CallOpSet<Op1, Op2, Op3, Op4, Op5, Op6> {
|
||||
public:
|
||||
bool FinalizeResult(void** tag, bool* status) override {
|
||||
typedef CallOpSet<Op1, Op2, Op3, Op4, Op5, Op6> Base;
|
||||
return Base::FinalizeResult(tag, status) && false;
|
||||
}
|
||||
};
|
||||
|
||||
/// Straightforward wrapping of the C call object
|
||||
class Call final {
|
||||
public:
|
||||
/** call is owned by the caller */
|
||||
Call(grpc_call* call, CallHook* call_hook, CompletionQueue* cq)
|
||||
: call_hook_(call_hook),
|
||||
cq_(cq),
|
||||
call_(call),
|
||||
max_receive_message_size_(-1) {}
|
||||
|
||||
Call(grpc_call* call, CallHook* call_hook, CompletionQueue* cq,
|
||||
int max_receive_message_size)
|
||||
: call_hook_(call_hook),
|
||||
cq_(cq),
|
||||
call_(call),
|
||||
max_receive_message_size_(max_receive_message_size) {}
|
||||
|
||||
void PerformOps(CallOpSetInterface* ops) {
|
||||
call_hook_->PerformOpsOnCall(ops, this);
|
||||
}
|
||||
|
||||
grpc_call* call() const { return call_; }
|
||||
CompletionQueue* cq() const { return cq_; }
|
||||
|
||||
int max_receive_message_size() const { return max_receive_message_size_; }
|
||||
|
||||
private:
|
||||
CallHook* call_hook_;
|
||||
CompletionQueue* cq_;
|
||||
grpc_call* call_;
|
||||
int max_receive_message_size_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CALL_H
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CALL_HOOK_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CALL_HOOK_H
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class CallOpSetInterface;
|
||||
class Call;
|
||||
|
||||
/// This is an interface that Channel and Server implement to allow them to hook
|
||||
/// performing ops.
|
||||
class CallHook {
|
||||
public:
|
||||
virtual ~CallHook() {}
|
||||
virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CALL_HOOK_H
|
||||
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H
|
||||
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc++/impl/codegen/time.h>
|
||||
#include <grpc/impl/codegen/connectivity_state.h>
|
||||
|
||||
namespace grpc {
|
||||
class Call;
|
||||
class ClientContext;
|
||||
class RpcMethod;
|
||||
class CallOpSetInterface;
|
||||
class CompletionQueue;
|
||||
|
||||
template <class R>
|
||||
class ClientReader;
|
||||
template <class W>
|
||||
class ClientWriter;
|
||||
template <class W, class R>
|
||||
class ClientReaderWriter;
|
||||
template <class R>
|
||||
class ClientAsyncReader;
|
||||
template <class W>
|
||||
class ClientAsyncWriter;
|
||||
template <class W, class R>
|
||||
class ClientAsyncReaderWriter;
|
||||
template <class R>
|
||||
class ClientAsyncResponseReader;
|
||||
|
||||
/// Codegen interface for \a grpc::Channel.
|
||||
class ChannelInterface {
|
||||
public:
|
||||
virtual ~ChannelInterface() {}
|
||||
/// Get the current channel state. If the channel is in IDLE and
|
||||
/// \a try_to_connect is set to true, try to connect.
|
||||
virtual grpc_connectivity_state GetState(bool try_to_connect) = 0;
|
||||
|
||||
/// Return the \a tag on \a cq when the channel state is changed or \a
|
||||
/// deadline expires. \a GetState needs to called to get the current state.
|
||||
template <typename T>
|
||||
void NotifyOnStateChange(grpc_connectivity_state last_observed, T deadline,
|
||||
CompletionQueue* cq, void* tag) {
|
||||
TimePoint<T> deadline_tp(deadline);
|
||||
NotifyOnStateChangeImpl(last_observed, deadline_tp.raw_time(), cq, tag);
|
||||
}
|
||||
|
||||
/// Blocking wait for channel state change or \a deadline expiration.
|
||||
/// \a GetState needs to called to get the current state.
|
||||
template <typename T>
|
||||
bool WaitForStateChange(grpc_connectivity_state last_observed, T deadline) {
|
||||
TimePoint<T> deadline_tp(deadline);
|
||||
return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time());
|
||||
}
|
||||
|
||||
/// Wait for this channel to be connected
|
||||
template <typename T>
|
||||
bool WaitForConnected(T deadline) {
|
||||
grpc_connectivity_state state;
|
||||
while ((state = GetState(true)) != GRPC_CHANNEL_READY) {
|
||||
if (!WaitForStateChange(state, deadline)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
template <class R>
|
||||
friend class ::grpc::ClientReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ClientWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ClientReaderWriter;
|
||||
template <class R>
|
||||
friend class ::grpc::ClientAsyncReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ClientAsyncWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ClientAsyncReaderWriter;
|
||||
template <class R>
|
||||
friend class ::grpc::ClientAsyncResponseReader;
|
||||
template <class InputMessage, class OutputMessage>
|
||||
friend Status BlockingUnaryCall(ChannelInterface* channel,
|
||||
const RpcMethod& method,
|
||||
ClientContext* context,
|
||||
const InputMessage& request,
|
||||
OutputMessage* result);
|
||||
friend class ::grpc::RpcMethod;
|
||||
virtual Call CreateCall(const RpcMethod& method, ClientContext* context,
|
||||
CompletionQueue* cq) = 0;
|
||||
virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0;
|
||||
virtual void* RegisterMethod(const char* method) = 0;
|
||||
virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed,
|
||||
gpr_timespec deadline,
|
||||
CompletionQueue* cq, void* tag) = 0;
|
||||
virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed,
|
||||
gpr_timespec deadline) = 0;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H
|
||||
@@ -1,414 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/// A ClientContext allows the person implementing a service client to:
|
||||
///
|
||||
/// - Add custom metadata key-value pairs that will propagated to the server
|
||||
/// side.
|
||||
/// - Control call settings such as compression and authentication.
|
||||
/// - Initial and trailing metadata coming from the server.
|
||||
/// - Get performance metrics (ie, census).
|
||||
///
|
||||
/// Context settings are only relevant to the call they are invoked with, that
|
||||
/// is to say, they aren't sticky. Some of these settings, such as the
|
||||
/// compression options, can be made persistent at channel construction time
|
||||
/// (see \a grpc::CreateCustomChannel).
|
||||
///
|
||||
/// \warning ClientContext instances should \em not be reused across rpcs.
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/create_auth_context.h>
|
||||
#include <grpc++/impl/codegen/metadata_map.h>
|
||||
#include <grpc++/impl/codegen/security/auth_context.h>
|
||||
#include <grpc++/impl/codegen/slice.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc++/impl/codegen/string_ref.h>
|
||||
#include <grpc++/impl/codegen/time.h>
|
||||
#include <grpc/impl/codegen/compression_types.h>
|
||||
#include <grpc/impl/codegen/propagation_bits.h>
|
||||
|
||||
struct census_context;
|
||||
struct grpc_call;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class Channel;
|
||||
class ChannelInterface;
|
||||
class CompletionQueue;
|
||||
class CallCredentials;
|
||||
class RpcMethod;
|
||||
template <class R>
|
||||
class ClientReader;
|
||||
template <class W>
|
||||
class ClientWriter;
|
||||
template <class W, class R>
|
||||
class ClientReaderWriter;
|
||||
template <class R>
|
||||
class ClientAsyncReader;
|
||||
template <class W>
|
||||
class ClientAsyncWriter;
|
||||
template <class W, class R>
|
||||
class ClientAsyncReaderWriter;
|
||||
template <class R>
|
||||
class ClientAsyncResponseReader;
|
||||
class ServerContext;
|
||||
|
||||
/// Options for \a ClientContext::FromServerContext specifying which traits from
|
||||
/// the \a ServerContext to propagate (copy) from it into a new \a
|
||||
/// ClientContext.
|
||||
///
|
||||
/// \see ClientContext::FromServerContext
|
||||
class PropagationOptions {
|
||||
public:
|
||||
PropagationOptions() : propagate_(GRPC_PROPAGATE_DEFAULTS) {}
|
||||
|
||||
PropagationOptions& enable_deadline_propagation() {
|
||||
propagate_ |= GRPC_PROPAGATE_DEADLINE;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& disable_deadline_propagation() {
|
||||
propagate_ &= ~GRPC_PROPAGATE_DEADLINE;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& enable_census_stats_propagation() {
|
||||
propagate_ |= GRPC_PROPAGATE_CENSUS_STATS_CONTEXT;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& disable_census_stats_propagation() {
|
||||
propagate_ &= ~GRPC_PROPAGATE_CENSUS_STATS_CONTEXT;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& enable_census_tracing_propagation() {
|
||||
propagate_ |= GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& disable_census_tracing_propagation() {
|
||||
propagate_ &= ~GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& enable_cancellation_propagation() {
|
||||
propagate_ |= GRPC_PROPAGATE_CANCELLATION;
|
||||
return *this;
|
||||
}
|
||||
|
||||
PropagationOptions& disable_cancellation_propagation() {
|
||||
propagate_ &= ~GRPC_PROPAGATE_CANCELLATION;
|
||||
return *this;
|
||||
}
|
||||
|
||||
uint32_t c_bitmask() const { return propagate_; }
|
||||
|
||||
private:
|
||||
uint32_t propagate_;
|
||||
};
|
||||
|
||||
namespace testing {
|
||||
class InteropClientContextInspector;
|
||||
} // namespace testing
|
||||
|
||||
/// A ClientContext allows the person implementing a service client to:
|
||||
///
|
||||
/// - Add custom metadata key-value pairs that will propagated to the server
|
||||
/// side.
|
||||
/// - Control call settings such as compression and authentication.
|
||||
/// - Initial and trailing metadata coming from the server.
|
||||
/// - Get performance metrics (ie, census).
|
||||
///
|
||||
/// Context settings are only relevant to the call they are invoked with, that
|
||||
/// is to say, they aren't sticky. Some of these settings, such as the
|
||||
/// compression options, can be made persistent at channel construction time
|
||||
/// (see \a grpc::CreateCustomChannel).
|
||||
///
|
||||
/// \warning ClientContext instances should \em not be reused across rpcs.
|
||||
class ClientContext {
|
||||
public:
|
||||
ClientContext();
|
||||
~ClientContext();
|
||||
|
||||
/// Create a new \a ClientContext as a child of an incoming server call,
|
||||
/// according to \a options (\see PropagationOptions).
|
||||
///
|
||||
/// \param server_context The source server context to use as the basis for
|
||||
/// constructing the client context.
|
||||
/// \param options The options controlling what to copy from the \a
|
||||
/// server_context.
|
||||
///
|
||||
/// \return A newly constructed \a ClientContext instance based on \a
|
||||
/// server_context, with traits propagated (copied) according to \a options.
|
||||
static std::unique_ptr<ClientContext> FromServerContext(
|
||||
const ServerContext& server_context,
|
||||
PropagationOptions options = PropagationOptions());
|
||||
|
||||
/// Add the (\a meta_key, \a meta_value) pair to the metadata associated with
|
||||
/// a client call. These are made available at the server side by the \a
|
||||
/// grpc::ServerContext::client_metadata() method.
|
||||
///
|
||||
/// \warning This method should only be called before invoking the rpc.
|
||||
///
|
||||
/// \param meta_key The metadata key. If \a meta_value is binary data, it must
|
||||
/// end in "-bin".
|
||||
/// \param meta_value The metadata value. If its value is binary, the key name
|
||||
/// must end in "-bin".
|
||||
void AddMetadata(const grpc::string& meta_key,
|
||||
const grpc::string& meta_value);
|
||||
|
||||
/// Return a collection of initial metadata key-value pairs. Note that keys
|
||||
/// may happen more than once (ie, a \a std::multimap is returned).
|
||||
///
|
||||
/// \warning This method should only be called after initial metadata has been
|
||||
/// received. For streaming calls, see \a
|
||||
/// ClientReaderInterface::WaitForInitialMetadata().
|
||||
///
|
||||
/// \return A multimap of initial metadata key-value pairs from the server.
|
||||
const std::multimap<grpc::string_ref, grpc::string_ref>&
|
||||
GetServerInitialMetadata() const {
|
||||
GPR_CODEGEN_ASSERT(initial_metadata_received_);
|
||||
return *recv_initial_metadata_.map();
|
||||
}
|
||||
|
||||
/// Return a collection of trailing metadata key-value pairs. Note that keys
|
||||
/// may happen more than once (ie, a \a std::multimap is returned).
|
||||
///
|
||||
/// \warning This method is only callable once the stream has finished.
|
||||
///
|
||||
/// \return A multimap of metadata trailing key-value pairs from the server.
|
||||
const std::multimap<grpc::string_ref, grpc::string_ref>&
|
||||
GetServerTrailingMetadata() const {
|
||||
// TODO(yangg) check finished
|
||||
return *trailing_metadata_.map();
|
||||
}
|
||||
|
||||
/// Set the deadline for the client call.
|
||||
///
|
||||
/// \warning This method should only be called before invoking the rpc.
|
||||
///
|
||||
/// \param deadline the deadline for the client call. Units are determined by
|
||||
/// the type used.
|
||||
template <typename T>
|
||||
void set_deadline(const T& deadline) {
|
||||
TimePoint<T> deadline_tp(deadline);
|
||||
deadline_ = deadline_tp.raw_time();
|
||||
}
|
||||
|
||||
/// EXPERIMENTAL: Indicate that this request is idempotent.
|
||||
/// By default, RPCs are assumed to <i>not</i> be idempotent.
|
||||
///
|
||||
/// If true, the gRPC library assumes that it's safe to initiate
|
||||
/// this RPC multiple times.
|
||||
void set_idempotent(bool idempotent) { idempotent_ = idempotent; }
|
||||
|
||||
/// EXPERIMENTAL: Set this request to be cacheable.
|
||||
/// If set, grpc is free to use the HTTP GET verb for sending the request,
|
||||
/// with the possibility of receiving a cached response.
|
||||
void set_cacheable(bool cacheable) { cacheable_ = cacheable; }
|
||||
|
||||
/// EXPERIMENTAL: Trigger wait-for-ready or not on this request.
|
||||
/// See https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md.
|
||||
/// If set, if an RPC is made when a channel's connectivity state is
|
||||
/// TRANSIENT_FAILURE or CONNECTING, the call will not "fail fast",
|
||||
/// and the channel will wait until the channel is READY before making the
|
||||
/// call.
|
||||
void set_wait_for_ready(bool wait_for_ready) {
|
||||
wait_for_ready_ = wait_for_ready;
|
||||
wait_for_ready_explicitly_set_ = true;
|
||||
}
|
||||
|
||||
/// DEPRECATED: Use set_wait_for_ready() instead.
|
||||
void set_fail_fast(bool fail_fast) { set_wait_for_ready(!fail_fast); }
|
||||
|
||||
/// Return the deadline for the client call.
|
||||
std::chrono::system_clock::time_point deadline() const {
|
||||
return Timespec2Timepoint(deadline_);
|
||||
}
|
||||
|
||||
/// Return a \a gpr_timespec representation of the client call's deadline.
|
||||
gpr_timespec raw_deadline() const { return deadline_; }
|
||||
|
||||
/// Set the per call authority header (see
|
||||
/// https://tools.ietf.org/html/rfc7540#section-8.1.2.3).
|
||||
void set_authority(const grpc::string& authority) { authority_ = authority; }
|
||||
|
||||
/// Return the authentication context for this client call.
|
||||
///
|
||||
/// \see grpc::AuthContext.
|
||||
std::shared_ptr<const AuthContext> auth_context() const {
|
||||
if (auth_context_.get() == nullptr) {
|
||||
auth_context_ = CreateAuthContext(call_);
|
||||
}
|
||||
return auth_context_;
|
||||
}
|
||||
|
||||
/// Set credentials for the client call.
|
||||
///
|
||||
/// A credentials object encapsulates all the state needed by a client to
|
||||
/// authenticate with a server and make various assertions, e.g., about the
|
||||
/// client’s identity, role, or whether it is authorized to make a particular
|
||||
/// call.
|
||||
///
|
||||
/// \see https://grpc.io/docs/guides/auth.html
|
||||
void set_credentials(const std::shared_ptr<CallCredentials>& creds) {
|
||||
creds_ = creds;
|
||||
}
|
||||
|
||||
/// Return the compression algorithm to be used by the client call.
|
||||
grpc_compression_algorithm compression_algorithm() const {
|
||||
return compression_algorithm_;
|
||||
}
|
||||
|
||||
/// Set \a algorithm to be the compression algorithm used for the client call.
|
||||
///
|
||||
/// \param algorithm The compression algorithm used for the client call.
|
||||
void set_compression_algorithm(grpc_compression_algorithm algorithm);
|
||||
|
||||
/// Flag whether the initial metadata should be \a corked
|
||||
///
|
||||
/// If \a corked is true, then the initial metadata will be coalesced with the
|
||||
/// write of first message in the stream.
|
||||
///
|
||||
/// \param corked The flag indicating whether the initial metadata is to be
|
||||
/// corked or not.
|
||||
void set_initial_metadata_corked(bool corked) {
|
||||
initial_metadata_corked_ = corked;
|
||||
}
|
||||
|
||||
/// Return the peer uri in a string.
|
||||
///
|
||||
/// \warning This value is never authenticated or subject to any security
|
||||
/// related code. It must not be used for any authentication related
|
||||
/// functionality. Instead, use auth_context.
|
||||
///
|
||||
/// \return The call's peer URI.
|
||||
grpc::string peer() const;
|
||||
|
||||
/// Get and set census context.
|
||||
void set_census_context(struct census_context* ccp) { census_context_ = ccp; }
|
||||
struct census_context* census_context() const {
|
||||
return census_context_;
|
||||
}
|
||||
|
||||
/// Send a best-effort out-of-band cancel on the call associated with
|
||||
/// this client context. The call could be in any stage; e.g., if it is
|
||||
/// already finished, it may still return success.
|
||||
///
|
||||
/// There is no guarantee the call will be cancelled.
|
||||
void TryCancel();
|
||||
|
||||
/// Global Callbacks
|
||||
///
|
||||
/// Can be set exactly once per application to install hooks whenever
|
||||
/// a client context is constructed and destructed.
|
||||
class GlobalCallbacks {
|
||||
public:
|
||||
virtual ~GlobalCallbacks() {}
|
||||
virtual void DefaultConstructor(ClientContext* context) = 0;
|
||||
virtual void Destructor(ClientContext* context) = 0;
|
||||
};
|
||||
static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
|
||||
|
||||
/// Should be used for framework-level extensions only.
|
||||
/// Applications never need to call this method.
|
||||
grpc_call* c_call() { return call_; }
|
||||
|
||||
private:
|
||||
// Disallow copy and assign.
|
||||
ClientContext(const ClientContext&);
|
||||
ClientContext& operator=(const ClientContext&);
|
||||
|
||||
friend class ::grpc::testing::InteropClientContextInspector;
|
||||
friend class CallOpClientRecvStatus;
|
||||
friend class CallOpRecvInitialMetadata;
|
||||
friend class Channel;
|
||||
template <class R>
|
||||
friend class ::grpc::ClientReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ClientWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ClientReaderWriter;
|
||||
template <class R>
|
||||
friend class ::grpc::ClientAsyncReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ClientAsyncWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ClientAsyncReaderWriter;
|
||||
template <class R>
|
||||
friend class ::grpc::ClientAsyncResponseReader;
|
||||
template <class InputMessage, class OutputMessage>
|
||||
friend Status BlockingUnaryCall(ChannelInterface* channel,
|
||||
const RpcMethod& method,
|
||||
ClientContext* context,
|
||||
const InputMessage& request,
|
||||
OutputMessage* result);
|
||||
|
||||
grpc_call* call() const { return call_; }
|
||||
void set_call(grpc_call* call, const std::shared_ptr<Channel>& channel);
|
||||
|
||||
uint32_t initial_metadata_flags() const {
|
||||
return (idempotent_ ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST : 0) |
|
||||
(wait_for_ready_ ? GRPC_INITIAL_METADATA_WAIT_FOR_READY : 0) |
|
||||
(cacheable_ ? GRPC_INITIAL_METADATA_CACHEABLE_REQUEST : 0) |
|
||||
(wait_for_ready_explicitly_set_
|
||||
? GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET
|
||||
: 0) |
|
||||
(initial_metadata_corked_ ? GRPC_INITIAL_METADATA_CORKED : 0);
|
||||
}
|
||||
|
||||
grpc::string authority() { return authority_; }
|
||||
|
||||
bool initial_metadata_received_;
|
||||
bool wait_for_ready_;
|
||||
bool wait_for_ready_explicitly_set_;
|
||||
bool idempotent_;
|
||||
bool cacheable_;
|
||||
std::shared_ptr<Channel> channel_;
|
||||
std::mutex mu_;
|
||||
grpc_call* call_;
|
||||
bool call_canceled_;
|
||||
gpr_timespec deadline_;
|
||||
grpc::string authority_;
|
||||
std::shared_ptr<CallCredentials> creds_;
|
||||
mutable std::shared_ptr<const AuthContext> auth_context_;
|
||||
struct census_context* census_context_;
|
||||
std::multimap<grpc::string, grpc::string> send_initial_metadata_;
|
||||
MetadataMap recv_initial_metadata_;
|
||||
MetadataMap trailing_metadata_;
|
||||
|
||||
grpc_call* propagate_from_call_;
|
||||
PropagationOptions propagation_options_;
|
||||
|
||||
grpc_compression_algorithm compression_algorithm_;
|
||||
bool initial_metadata_corked_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H
|
||||
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H
|
||||
|
||||
#include <grpc++/impl/codegen/call.h>
|
||||
#include <grpc++/impl/codegen/channel_interface.h>
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class Channel;
|
||||
class ClientContext;
|
||||
class CompletionQueue;
|
||||
class RpcMethod;
|
||||
|
||||
/// Wrapper that performs a blocking unary call
|
||||
template <class InputMessage, class OutputMessage>
|
||||
Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method,
|
||||
ClientContext* context, const InputMessage& request,
|
||||
OutputMessage* result) {
|
||||
CompletionQueue cq(grpc_completion_queue_attributes{
|
||||
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
|
||||
GRPC_CQ_DEFAULT_POLLING}); // Pluckable completion queue
|
||||
Call call(channel->CreateCall(method, context, &cq));
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpRecvInitialMetadata, CallOpRecvMessage<OutputMessage>,
|
||||
CallOpClientSendClose, CallOpClientRecvStatus>
|
||||
ops;
|
||||
Status status = ops.SendMessage(request);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
}
|
||||
ops.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
ops.RecvInitialMetadata(context);
|
||||
ops.RecvMessage(result);
|
||||
ops.ClientSendClose();
|
||||
ops.ClientRecvStatus(context, &status);
|
||||
call.PerformOps(&ops);
|
||||
if (cq.Pluck(&ops)) {
|
||||
if (!ops.got_message && status.ok()) {
|
||||
return Status(StatusCode::UNIMPLEMENTED,
|
||||
"No message returned for unary request");
|
||||
}
|
||||
} else {
|
||||
GPR_CODEGEN_ASSERT(!status.ok());
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H
|
||||
@@ -1,295 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015-2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/// A completion queue implements a concurrent producer-consumer queue, with
|
||||
/// two main API-exposed methods: \a Next and \a AsyncNext. These
|
||||
/// methods are the essential component of the gRPC C++ asynchronous API.
|
||||
/// There is also a \a Shutdown method to indicate that a given completion queue
|
||||
/// will no longer have regular events. This must be called before the
|
||||
/// completion queue is destroyed.
|
||||
/// All completion queue APIs are thread-safe and may be used concurrently with
|
||||
/// any other completion queue API invocation; it is acceptable to have
|
||||
/// multiple threads calling \a Next or \a AsyncNext on the same or different
|
||||
/// completion queues, or to call these methods concurrently with a \a Shutdown
|
||||
/// elsewhere.
|
||||
/// \remark{All other API calls on completion queue should be completed before
|
||||
/// a completion queue destructor is called.}
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H
|
||||
#define GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H
|
||||
|
||||
#include <grpc++/impl/codegen/completion_queue_tag.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc++/impl/codegen/time.h>
|
||||
#include <grpc/impl/codegen/atm.h>
|
||||
|
||||
struct grpc_completion_queue;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
template <class R>
|
||||
class ClientReader;
|
||||
template <class W>
|
||||
class ClientWriter;
|
||||
template <class W, class R>
|
||||
class ClientReaderWriter;
|
||||
template <class R>
|
||||
class ServerReader;
|
||||
template <class W>
|
||||
class ServerWriter;
|
||||
namespace internal {
|
||||
template <class W, class R>
|
||||
class ServerReaderWriterBody;
|
||||
}
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class RpcMethodHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class ClientStreamingHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class ServerStreamingHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class BidiStreamingHandler;
|
||||
class UnknownMethodHandler;
|
||||
|
||||
class Channel;
|
||||
class ChannelInterface;
|
||||
class ClientContext;
|
||||
class CompletionQueueTag;
|
||||
class CompletionQueue;
|
||||
class RpcMethod;
|
||||
class Server;
|
||||
class ServerBuilder;
|
||||
class ServerContext;
|
||||
|
||||
extern CoreCodegenInterface* g_core_codegen_interface;
|
||||
|
||||
/// A thin wrapper around \ref grpc_completion_queue (see \ref
|
||||
/// src/core/lib/surface/completion_queue.h).
|
||||
/// See \ref doc/cpp/perf_notes.md for notes on best practices for high
|
||||
/// performance servers.
|
||||
class CompletionQueue : private GrpcLibraryCodegen {
|
||||
public:
|
||||
/// Default constructor. Implicitly creates a \a grpc_completion_queue
|
||||
/// instance.
|
||||
CompletionQueue()
|
||||
: CompletionQueue(grpc_completion_queue_attributes{
|
||||
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, GRPC_CQ_DEFAULT_POLLING}) {}
|
||||
|
||||
/// Wrap \a take, taking ownership of the instance.
|
||||
///
|
||||
/// \param take The completion queue instance to wrap. Ownership is taken.
|
||||
explicit CompletionQueue(grpc_completion_queue* take);
|
||||
|
||||
/// Destructor. Destroys the owned wrapped completion queue / instance.
|
||||
~CompletionQueue() {
|
||||
g_core_codegen_interface->grpc_completion_queue_destroy(cq_);
|
||||
}
|
||||
|
||||
/// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT.
|
||||
enum NextStatus {
|
||||
SHUTDOWN, ///< The completion queue has been shutdown.
|
||||
GOT_EVENT, ///< Got a new event; \a tag will be filled in with its
|
||||
///< associated value; \a ok indicating its success.
|
||||
TIMEOUT ///< deadline was reached.
|
||||
};
|
||||
|
||||
/// Read from the queue, blocking up to \a deadline (or the queue's shutdown).
|
||||
/// Both \a tag and \a ok are updated upon success (if an event is available
|
||||
/// within the \a deadline). A \a tag points to an arbitrary location usually
|
||||
/// employed to uniquely identify an event.
|
||||
///
|
||||
/// \param tag[out] Upon sucess, updated to point to the event's tag.
|
||||
/// \param ok[out] Upon sucess, true if read a regular event, false otherwise.
|
||||
/// \param deadline[in] How long to block in wait for an event.
|
||||
///
|
||||
/// \return The type of event read.
|
||||
template <typename T>
|
||||
NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) {
|
||||
TimePoint<T> deadline_tp(deadline);
|
||||
return AsyncNextInternal(tag, ok, deadline_tp.raw_time());
|
||||
}
|
||||
|
||||
/// Read from the queue, blocking until an event is available or the queue is
|
||||
/// shutting down.
|
||||
///
|
||||
/// \param tag[out] Updated to point to the read event's tag.
|
||||
/// \param ok[out] true if read a regular event, false otherwise.
|
||||
///
|
||||
/// \return true if read a regular event, false if the queue is shutting down.
|
||||
bool Next(void** tag, bool* ok) {
|
||||
return (AsyncNextInternal(tag, ok, g_core_codegen_interface->gpr_inf_future(
|
||||
GPR_CLOCK_REALTIME)) != SHUTDOWN);
|
||||
}
|
||||
|
||||
/// Request the shutdown of the queue.
|
||||
///
|
||||
/// \warning This method must be called at some point if this completion queue
|
||||
/// is accessed with Next or AsyncNext. Once invoked, \a Next
|
||||
/// will start to return false and \a AsyncNext will return \a
|
||||
/// NextStatus::SHUTDOWN. Only once either one of these methods does that
|
||||
/// (that is, once the queue has been \em drained) can an instance of this
|
||||
/// class be destroyed. Also note that applications must ensure that
|
||||
/// no work is enqueued on this completion queue after this method is called.
|
||||
void Shutdown();
|
||||
|
||||
/// Returns a \em raw pointer to the underlying \a grpc_completion_queue
|
||||
/// instance.
|
||||
///
|
||||
/// \warning Remember that the returned instance is owned. No transfer of
|
||||
/// owership is performed.
|
||||
grpc_completion_queue* cq() { return cq_; }
|
||||
|
||||
/// Manage state of avalanching operations : completion queue tags that
|
||||
/// trigger other completion queue operations. The underlying core completion
|
||||
/// queue should not really shutdown until all avalanching operations have
|
||||
/// been finalized. Note that we maintain the requirement that an avalanche
|
||||
/// registration must take place before CQ shutdown (which must be maintained
|
||||
/// elsehwere)
|
||||
void InitialAvalanching() {
|
||||
gpr_atm_rel_store(&avalanches_in_flight_, static_cast<gpr_atm>(1));
|
||||
}
|
||||
void RegisterAvalanching() {
|
||||
gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_,
|
||||
static_cast<gpr_atm>(1));
|
||||
}
|
||||
void CompleteAvalanching();
|
||||
|
||||
protected:
|
||||
/// Private constructor of CompletionQueue only visible to friend classes
|
||||
CompletionQueue(const grpc_completion_queue_attributes& attributes) {
|
||||
cq_ = g_core_codegen_interface->grpc_completion_queue_create(
|
||||
g_core_codegen_interface->grpc_completion_queue_factory_lookup(
|
||||
&attributes),
|
||||
&attributes, NULL);
|
||||
InitialAvalanching(); // reserve this for the future shutdown
|
||||
}
|
||||
|
||||
private:
|
||||
// Friend synchronous wrappers so that they can access Pluck(), which is
|
||||
// a semi-private API geared towards the synchronous implementation.
|
||||
template <class R>
|
||||
friend class ::grpc::ClientReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ClientWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ClientReaderWriter;
|
||||
template <class R>
|
||||
friend class ::grpc::ServerReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ServerWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::internal::ServerReaderWriterBody;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
friend class RpcMethodHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
friend class ClientStreamingHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
friend class ServerStreamingHandler;
|
||||
template <class Streamer, bool WriteNeeded>
|
||||
friend class TemplatedBidiStreamingHandler;
|
||||
friend class UnknownMethodHandler;
|
||||
friend class ::grpc::Server;
|
||||
friend class ::grpc::ServerContext;
|
||||
template <class InputMessage, class OutputMessage>
|
||||
friend Status BlockingUnaryCall(ChannelInterface* channel,
|
||||
const RpcMethod& method,
|
||||
ClientContext* context,
|
||||
const InputMessage& request,
|
||||
OutputMessage* result);
|
||||
|
||||
NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline);
|
||||
|
||||
/// Wraps \a grpc_completion_queue_pluck.
|
||||
/// \warning Must not be mixed with calls to \a Next.
|
||||
bool Pluck(CompletionQueueTag* tag) {
|
||||
auto deadline =
|
||||
g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME);
|
||||
auto ev = g_core_codegen_interface->grpc_completion_queue_pluck(
|
||||
cq_, tag, deadline, nullptr);
|
||||
bool ok = ev.success != 0;
|
||||
void* ignored = tag;
|
||||
GPR_CODEGEN_ASSERT(tag->FinalizeResult(&ignored, &ok));
|
||||
GPR_CODEGEN_ASSERT(ignored == tag);
|
||||
// Ignore mutations by FinalizeResult: Pluck returns the C API status
|
||||
return ev.success != 0;
|
||||
}
|
||||
|
||||
/// Performs a single polling pluck on \a tag.
|
||||
/// \warning Must not be mixed with calls to \a Next.
|
||||
///
|
||||
/// TODO: sreek - This calls tag->FinalizeResult() even if the cq_ is already
|
||||
/// shutdown. This is most likely a bug and if it is a bug, then change this
|
||||
/// implementation to simple call the other TryPluck function with a zero
|
||||
/// timeout. i.e:
|
||||
/// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME))
|
||||
void TryPluck(CompletionQueueTag* tag) {
|
||||
auto deadline = g_core_codegen_interface->gpr_time_0(GPR_CLOCK_REALTIME);
|
||||
auto ev = g_core_codegen_interface->grpc_completion_queue_pluck(
|
||||
cq_, tag, deadline, nullptr);
|
||||
if (ev.type == GRPC_QUEUE_TIMEOUT) return;
|
||||
bool ok = ev.success != 0;
|
||||
void* ignored = tag;
|
||||
// the tag must be swallowed if using TryPluck
|
||||
GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok));
|
||||
}
|
||||
|
||||
/// Performs a single polling pluck on \a tag. Calls tag->FinalizeResult if
|
||||
/// the pluck() was successful and returned the tag.
|
||||
///
|
||||
/// This exects tag->FinalizeResult (if called) to return 'false' i.e expects
|
||||
/// that the tag is internal not something that is returned to the user.
|
||||
void TryPluck(CompletionQueueTag* tag, gpr_timespec deadline) {
|
||||
auto ev = g_core_codegen_interface->grpc_completion_queue_pluck(
|
||||
cq_, tag, deadline, nullptr);
|
||||
if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool ok = ev.success != 0;
|
||||
void* ignored = tag;
|
||||
GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok));
|
||||
}
|
||||
|
||||
grpc_completion_queue* cq_; // owned
|
||||
|
||||
gpr_atm avalanches_in_flight_;
|
||||
};
|
||||
|
||||
/// A specific type of completion queue used by the processing of notifications
|
||||
/// by servers. Instantiated by \a ServerBuilder.
|
||||
class ServerCompletionQueue : public CompletionQueue {
|
||||
public:
|
||||
bool IsFrequentlyPolled() { return polling_type_ != GRPC_CQ_NON_LISTENING; }
|
||||
|
||||
private:
|
||||
grpc_cq_polling_type polling_type_;
|
||||
friend class ServerBuilder;
|
||||
/// \param is_frequently_polled Informs the GRPC library about whether the
|
||||
/// server completion queue would be actively polled (by calling Next() or
|
||||
/// AsyncNext()). By default all server completion queues are assumed to be
|
||||
/// frequently polled.
|
||||
ServerCompletionQueue(grpc_cq_polling_type polling_type)
|
||||
: CompletionQueue(grpc_completion_queue_attributes{
|
||||
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, polling_type}),
|
||||
polling_type_(polling_type) {}
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H
|
||||
@@ -1,37 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H
|
||||
#define GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// An interface allowing implementors to process and filter event tags.
|
||||
class CompletionQueueTag {
|
||||
public:
|
||||
virtual ~CompletionQueueTag() {}
|
||||
/// Called prior to returning from Next(), return value is the status of the
|
||||
/// operation (return status is the default thing to do). If this function
|
||||
/// returns false, the tag is dropped and not returned from the completion
|
||||
/// queue
|
||||
virtual bool FinalizeResult(void** tag, bool* status) = 0;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CONFIG_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CONFIG_H
|
||||
|
||||
#ifndef GRPC_CUSTOM_STRING
|
||||
#include <string>
|
||||
#define GRPC_CUSTOM_STRING std::string
|
||||
#endif
|
||||
|
||||
/// The following macros are deprecated and appear only for users
|
||||
/// with PB files generated using gRPC 1.0.x plugins. They should
|
||||
/// not be used in new code
|
||||
#define GRPC_OVERRIDE override // deprecated
|
||||
#define GRPC_FINAL final // deprecated
|
||||
|
||||
namespace grpc {
|
||||
|
||||
typedef GRPC_CUSTOM_STRING string;
|
||||
|
||||
using std::to_string;
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CONFIG_H
|
||||
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H
|
||||
|
||||
#ifndef GRPC_CUSTOM_PROTOBUF_INT64
|
||||
#include <google/protobuf/stubs/common.h>
|
||||
#define GRPC_CUSTOM_PROTOBUF_INT64 ::google::protobuf::int64
|
||||
#endif
|
||||
|
||||
#ifndef GRPC_CUSTOM_MESSAGE
|
||||
#ifdef GRPC_USE_PROTO_LITE
|
||||
#include <google/protobuf/message_lite.h>
|
||||
#define GRPC_CUSTOM_MESSAGE ::google::protobuf::MessageLite
|
||||
#else
|
||||
#include <google/protobuf/message.h>
|
||||
#define GRPC_CUSTOM_MESSAGE ::google::protobuf::Message
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef GRPC_CUSTOM_DESCRIPTOR
|
||||
#include <google/protobuf/descriptor.h>
|
||||
#include <google/protobuf/descriptor.pb.h>
|
||||
#define GRPC_CUSTOM_DESCRIPTOR ::google::protobuf::Descriptor
|
||||
#define GRPC_CUSTOM_DESCRIPTORPOOL ::google::protobuf::DescriptorPool
|
||||
#define GRPC_CUSTOM_FIELDDESCRIPTOR ::google::protobuf::FieldDescriptor
|
||||
#define GRPC_CUSTOM_FILEDESCRIPTOR ::google::protobuf::FileDescriptor
|
||||
#define GRPC_CUSTOM_FILEDESCRIPTORPROTO ::google::protobuf::FileDescriptorProto
|
||||
#define GRPC_CUSTOM_METHODDESCRIPTOR ::google::protobuf::MethodDescriptor
|
||||
#define GRPC_CUSTOM_SERVICEDESCRIPTOR ::google::protobuf::ServiceDescriptor
|
||||
#define GRPC_CUSTOM_SOURCELOCATION ::google::protobuf::SourceLocation
|
||||
#endif
|
||||
|
||||
#ifndef GRPC_CUSTOM_DESCRIPTORDATABASE
|
||||
#include <google/protobuf/descriptor_database.h>
|
||||
#define GRPC_CUSTOM_DESCRIPTORDATABASE ::google::protobuf::DescriptorDatabase
|
||||
#define GRPC_CUSTOM_SIMPLEDESCRIPTORDATABASE \
|
||||
::google::protobuf::SimpleDescriptorDatabase
|
||||
#endif
|
||||
|
||||
#ifndef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM
|
||||
#include <google/protobuf/io/coded_stream.h>
|
||||
#include <google/protobuf/io/zero_copy_stream.h>
|
||||
#define GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM \
|
||||
::google::protobuf::io::ZeroCopyOutputStream
|
||||
#define GRPC_CUSTOM_ZEROCOPYINPUTSTREAM \
|
||||
::google::protobuf::io::ZeroCopyInputStream
|
||||
#define GRPC_CUSTOM_CODEDINPUTSTREAM ::google::protobuf::io::CodedInputStream
|
||||
#endif
|
||||
|
||||
namespace grpc {
|
||||
namespace protobuf {
|
||||
|
||||
typedef GRPC_CUSTOM_MESSAGE Message;
|
||||
typedef GRPC_CUSTOM_PROTOBUF_INT64 int64;
|
||||
|
||||
typedef GRPC_CUSTOM_DESCRIPTOR Descriptor;
|
||||
typedef GRPC_CUSTOM_DESCRIPTORPOOL DescriptorPool;
|
||||
typedef GRPC_CUSTOM_DESCRIPTORDATABASE DescriptorDatabase;
|
||||
typedef GRPC_CUSTOM_FIELDDESCRIPTOR FieldDescriptor;
|
||||
typedef GRPC_CUSTOM_FILEDESCRIPTOR FileDescriptor;
|
||||
typedef GRPC_CUSTOM_FILEDESCRIPTORPROTO FileDescriptorProto;
|
||||
typedef GRPC_CUSTOM_METHODDESCRIPTOR MethodDescriptor;
|
||||
typedef GRPC_CUSTOM_SERVICEDESCRIPTOR ServiceDescriptor;
|
||||
typedef GRPC_CUSTOM_SIMPLEDESCRIPTORDATABASE SimpleDescriptorDatabase;
|
||||
typedef GRPC_CUSTOM_SOURCELOCATION SourceLocation;
|
||||
|
||||
namespace io {
|
||||
typedef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM ZeroCopyOutputStream;
|
||||
typedef GRPC_CUSTOM_ZEROCOPYINPUTSTREAM ZeroCopyInputStream;
|
||||
typedef GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream;
|
||||
} // namespace io
|
||||
|
||||
} // namespace protobuf
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H
|
||||
@@ -1,112 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H
|
||||
|
||||
// This file should be compiled as part of grpc++.
|
||||
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc/byte_buffer.h>
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Implementation of the core codegen interface.
|
||||
class CoreCodegen final : public CoreCodegenInterface {
|
||||
private:
|
||||
virtual const grpc_completion_queue_factory*
|
||||
grpc_completion_queue_factory_lookup(
|
||||
const grpc_completion_queue_attributes* attributes) override;
|
||||
virtual grpc_completion_queue* grpc_completion_queue_create(
|
||||
const grpc_completion_queue_factory* factory,
|
||||
const grpc_completion_queue_attributes* attributes,
|
||||
void* reserved) override;
|
||||
grpc_completion_queue* grpc_completion_queue_create_for_next(
|
||||
void* reserved) override;
|
||||
grpc_completion_queue* grpc_completion_queue_create_for_pluck(
|
||||
void* reserved) override;
|
||||
void grpc_completion_queue_destroy(grpc_completion_queue* cq) override;
|
||||
grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag,
|
||||
gpr_timespec deadline,
|
||||
void* reserved) override;
|
||||
|
||||
void* gpr_malloc(size_t size) override;
|
||||
void gpr_free(void* p) override;
|
||||
|
||||
void gpr_mu_init(gpr_mu* mu) override;
|
||||
void gpr_mu_destroy(gpr_mu* mu) override;
|
||||
void gpr_mu_lock(gpr_mu* mu) override;
|
||||
void gpr_mu_unlock(gpr_mu* mu) override;
|
||||
void gpr_cv_init(gpr_cv* cv) override;
|
||||
void gpr_cv_destroy(gpr_cv* cv) override;
|
||||
int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) override;
|
||||
void gpr_cv_signal(gpr_cv* cv) override;
|
||||
void gpr_cv_broadcast(gpr_cv* cv) override;
|
||||
|
||||
grpc_call_error grpc_call_cancel_with_status(grpc_call* call,
|
||||
grpc_status_code status,
|
||||
const char* description,
|
||||
void* reserved) override;
|
||||
void grpc_call_ref(grpc_call* call) override;
|
||||
void grpc_call_unref(grpc_call* call) override;
|
||||
virtual void* grpc_call_arena_alloc(grpc_call* call, size_t length) override;
|
||||
|
||||
void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override;
|
||||
|
||||
int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader,
|
||||
grpc_byte_buffer* buffer) override;
|
||||
void grpc_byte_buffer_reader_destroy(
|
||||
grpc_byte_buffer_reader* reader) override;
|
||||
int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader,
|
||||
grpc_slice* slice) override;
|
||||
|
||||
grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice,
|
||||
size_t nslices) override;
|
||||
grpc_slice grpc_slice_new_with_user_data(void* p, size_t len,
|
||||
void (*destroy)(void*),
|
||||
void* user_data) override;
|
||||
grpc_slice grpc_empty_slice() override;
|
||||
grpc_slice grpc_slice_malloc(size_t length) override;
|
||||
void grpc_slice_unref(grpc_slice slice) override;
|
||||
grpc_slice grpc_slice_ref(grpc_slice slice) override;
|
||||
grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) override;
|
||||
grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) override;
|
||||
void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) override;
|
||||
void grpc_slice_buffer_pop(grpc_slice_buffer* sb) override;
|
||||
grpc_slice grpc_slice_from_static_buffer(const void* buffer,
|
||||
size_t length) override;
|
||||
grpc_slice grpc_slice_from_copied_buffer(const void* buffer,
|
||||
size_t length) override;
|
||||
void grpc_metadata_array_init(grpc_metadata_array* array) override;
|
||||
void grpc_metadata_array_destroy(grpc_metadata_array* array) override;
|
||||
|
||||
gpr_timespec gpr_inf_future(gpr_clock_type type) override;
|
||||
gpr_timespec gpr_time_0(gpr_clock_type type) override;
|
||||
|
||||
virtual const Status& ok() override;
|
||||
virtual const Status& cancelled() override;
|
||||
|
||||
void assert_fail(const char* failed_assertion, const char* file,
|
||||
int line) override;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc/impl/codegen/byte_buffer_reader.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
#include <grpc/impl/codegen/sync.h>
|
||||
|
||||
extern "C" {
|
||||
struct grpc_byte_buffer;
|
||||
}
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Interface between the codegen library and the minimal subset of core
|
||||
/// features required by the generated code.
|
||||
///
|
||||
/// All undocumented methods are simply forwarding the call to their namesakes.
|
||||
/// Please refer to their corresponding documentation for details.
|
||||
///
|
||||
/// \warning This interface should be considered internal and private.
|
||||
class CoreCodegenInterface {
|
||||
public:
|
||||
/// Upon a failed assertion, log the error.
|
||||
virtual void assert_fail(const char* failed_assertion, const char* file,
|
||||
int line) = 0;
|
||||
|
||||
virtual const grpc_completion_queue_factory*
|
||||
grpc_completion_queue_factory_lookup(
|
||||
const grpc_completion_queue_attributes* attributes) = 0;
|
||||
virtual grpc_completion_queue* grpc_completion_queue_create(
|
||||
const grpc_completion_queue_factory* factory,
|
||||
const grpc_completion_queue_attributes* attributes, void* reserved) = 0;
|
||||
virtual grpc_completion_queue* grpc_completion_queue_create_for_next(
|
||||
void* reserved) = 0;
|
||||
virtual grpc_completion_queue* grpc_completion_queue_create_for_pluck(
|
||||
void* reserved) = 0;
|
||||
virtual void grpc_completion_queue_destroy(grpc_completion_queue* cq) = 0;
|
||||
virtual grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq,
|
||||
void* tag,
|
||||
gpr_timespec deadline,
|
||||
void* reserved) = 0;
|
||||
|
||||
virtual void* gpr_malloc(size_t size) = 0;
|
||||
virtual void gpr_free(void* p) = 0;
|
||||
|
||||
virtual void gpr_mu_init(gpr_mu* mu) = 0;
|
||||
virtual void gpr_mu_destroy(gpr_mu* mu) = 0;
|
||||
virtual void gpr_mu_lock(gpr_mu* mu) = 0;
|
||||
virtual void gpr_mu_unlock(gpr_mu* mu) = 0;
|
||||
virtual void gpr_cv_init(gpr_cv* cv) = 0;
|
||||
virtual void gpr_cv_destroy(gpr_cv* cv) = 0;
|
||||
virtual int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu,
|
||||
gpr_timespec abs_deadline) = 0;
|
||||
virtual void gpr_cv_signal(gpr_cv* cv) = 0;
|
||||
virtual void gpr_cv_broadcast(gpr_cv* cv) = 0;
|
||||
|
||||
virtual void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) = 0;
|
||||
|
||||
virtual int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader,
|
||||
grpc_byte_buffer* buffer)
|
||||
GRPC_MUST_USE_RESULT = 0;
|
||||
virtual void grpc_byte_buffer_reader_destroy(
|
||||
grpc_byte_buffer_reader* reader) = 0;
|
||||
virtual int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader,
|
||||
grpc_slice* slice) = 0;
|
||||
|
||||
virtual grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice,
|
||||
size_t nslices) = 0;
|
||||
virtual grpc_slice grpc_slice_new_with_user_data(void* p, size_t len,
|
||||
void (*destroy)(void*),
|
||||
void* user_data) = 0;
|
||||
virtual grpc_call_error grpc_call_cancel_with_status(grpc_call* call,
|
||||
grpc_status_code status,
|
||||
const char* description,
|
||||
void* reserved) = 0;
|
||||
virtual void grpc_call_ref(grpc_call* call) = 0;
|
||||
virtual void grpc_call_unref(grpc_call* call) = 0;
|
||||
virtual void* grpc_call_arena_alloc(grpc_call* call, size_t length) = 0;
|
||||
virtual grpc_slice grpc_empty_slice() = 0;
|
||||
virtual grpc_slice grpc_slice_malloc(size_t length) = 0;
|
||||
virtual void grpc_slice_unref(grpc_slice slice) = 0;
|
||||
virtual grpc_slice grpc_slice_ref(grpc_slice slice) = 0;
|
||||
virtual grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) = 0;
|
||||
virtual grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) = 0;
|
||||
virtual void grpc_slice_buffer_add(grpc_slice_buffer* sb,
|
||||
grpc_slice slice) = 0;
|
||||
virtual void grpc_slice_buffer_pop(grpc_slice_buffer* sb) = 0;
|
||||
virtual grpc_slice grpc_slice_from_static_buffer(const void* buffer,
|
||||
size_t length) = 0;
|
||||
virtual grpc_slice grpc_slice_from_copied_buffer(const void* buffer,
|
||||
size_t length) = 0;
|
||||
|
||||
virtual void grpc_metadata_array_init(grpc_metadata_array* array) = 0;
|
||||
virtual void grpc_metadata_array_destroy(grpc_metadata_array* array) = 0;
|
||||
|
||||
virtual const Status& ok() = 0;
|
||||
virtual const Status& cancelled() = 0;
|
||||
|
||||
virtual gpr_timespec gpr_inf_future(gpr_clock_type type) = 0;
|
||||
virtual gpr_timespec gpr_time_0(gpr_clock_type type) = 0;
|
||||
};
|
||||
|
||||
extern CoreCodegenInterface* g_core_codegen_interface;
|
||||
|
||||
/// Codegen specific version of \a GPR_ASSERT.
|
||||
#define GPR_CODEGEN_ASSERT(x) \
|
||||
do { \
|
||||
if (!(x)) { \
|
||||
grpc::g_core_codegen_interface->assert_fail(#x, __FILE__, __LINE__); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H
|
||||
#define GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/codegen/security/auth_context.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
std::shared_ptr<const AuthContext> CreateAuthContext(grpc_call* call);
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H
|
||||
#define GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H
|
||||
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class GrpcLibraryInterface {
|
||||
public:
|
||||
virtual void init() = 0;
|
||||
virtual void shutdown() = 0;
|
||||
};
|
||||
|
||||
/// Initialized by \a grpc::GrpcLibraryInitializer from
|
||||
/// <grpc++/impl/grpc_library.h>
|
||||
extern GrpcLibraryInterface* g_glip;
|
||||
|
||||
/// Classes that require gRPC to be initialized should inherit from this class.
|
||||
class GrpcLibraryCodegen {
|
||||
public:
|
||||
GrpcLibraryCodegen(bool call_grpc_init = true) : grpc_init_called_(false) {
|
||||
if (call_grpc_init) {
|
||||
GPR_CODEGEN_ASSERT(g_glip &&
|
||||
"gRPC library not initialized. See "
|
||||
"grpc::internal::GrpcLibraryInitializer.");
|
||||
g_glip->init();
|
||||
grpc_init_called_ = true;
|
||||
}
|
||||
}
|
||||
virtual ~GrpcLibraryCodegen() {
|
||||
if (grpc_init_called_) {
|
||||
GPR_CODEGEN_ASSERT(g_glip &&
|
||||
"gRPC library not initialized. See "
|
||||
"grpc::internal::GrpcLibraryInitializer.");
|
||||
g_glip->shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool grpc_init_called_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_METADATA_MAP_H
|
||||
#define GRPCXX_IMPL_CODEGEN_METADATA_MAP_H
|
||||
|
||||
#include <grpc++/impl/codegen/slice.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class MetadataMap {
|
||||
public:
|
||||
MetadataMap() { memset(&arr_, 0, sizeof(arr_)); }
|
||||
|
||||
~MetadataMap() {
|
||||
g_core_codegen_interface->grpc_metadata_array_destroy(&arr_);
|
||||
}
|
||||
|
||||
void FillMap() {
|
||||
for (size_t i = 0; i < arr_.count; i++) {
|
||||
// TODO(yangg) handle duplicates?
|
||||
map_.insert(std::pair<grpc::string_ref, grpc::string_ref>(
|
||||
StringRefFromSlice(&arr_.metadata[i].key),
|
||||
StringRefFromSlice(&arr_.metadata[i].value)));
|
||||
}
|
||||
}
|
||||
|
||||
std::multimap<grpc::string_ref, grpc::string_ref> *map() { return &map_; }
|
||||
const std::multimap<grpc::string_ref, grpc::string_ref> *map() const {
|
||||
return &map_;
|
||||
}
|
||||
grpc_metadata_array *arr() { return &arr_; }
|
||||
|
||||
private:
|
||||
grpc_metadata_array arr_;
|
||||
std::multimap<grpc::string_ref, grpc::string_ref> map_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_METADATA_MAP_H
|
||||
@@ -1,270 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H
|
||||
#define GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H
|
||||
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/rpc_service_method.h>
|
||||
#include <grpc++/impl/codegen/sync_stream.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// A wrapper class of an application provided rpc method handler.
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class RpcMethodHandler : public MethodHandler {
|
||||
public:
|
||||
RpcMethodHandler(std::function<Status(ServiceType*, ServerContext*,
|
||||
const RequestType*, ResponseType*)>
|
||||
func,
|
||||
ServiceType* service)
|
||||
: func_(func), service_(service) {}
|
||||
|
||||
void RunHandler(const HandlerParameter& param) final {
|
||||
RequestType req;
|
||||
Status status =
|
||||
SerializationTraits<RequestType>::Deserialize(param.request, &req);
|
||||
ResponseType rsp;
|
||||
if (status.ok()) {
|
||||
status = func_(service_, param.server_context, &req, &rsp);
|
||||
}
|
||||
|
||||
GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_);
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpServerSendStatus>
|
||||
ops;
|
||||
ops.SendInitialMetadata(param.server_context->initial_metadata_,
|
||||
param.server_context->initial_metadata_flags());
|
||||
if (param.server_context->compression_level_set()) {
|
||||
ops.set_compression_level(param.server_context->compression_level());
|
||||
}
|
||||
if (status.ok()) {
|
||||
status = ops.SendMessage(rsp);
|
||||
}
|
||||
ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
|
||||
param.call->PerformOps(&ops);
|
||||
param.call->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
private:
|
||||
/// Application provided rpc handler function.
|
||||
std::function<Status(ServiceType*, ServerContext*, const RequestType*,
|
||||
ResponseType*)>
|
||||
func_;
|
||||
// The class the above handler function lives in.
|
||||
ServiceType* service_;
|
||||
};
|
||||
|
||||
/// A wrapper class of an application provided client streaming handler.
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class ClientStreamingHandler : public MethodHandler {
|
||||
public:
|
||||
ClientStreamingHandler(
|
||||
std::function<Status(ServiceType*, ServerContext*,
|
||||
ServerReader<RequestType>*, ResponseType*)>
|
||||
func,
|
||||
ServiceType* service)
|
||||
: func_(func), service_(service) {}
|
||||
|
||||
void RunHandler(const HandlerParameter& param) final {
|
||||
ServerReader<RequestType> reader(param.call, param.server_context);
|
||||
ResponseType rsp;
|
||||
Status status = func_(service_, param.server_context, &reader, &rsp);
|
||||
|
||||
GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_);
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpServerSendStatus>
|
||||
ops;
|
||||
ops.SendInitialMetadata(param.server_context->initial_metadata_,
|
||||
param.server_context->initial_metadata_flags());
|
||||
if (param.server_context->compression_level_set()) {
|
||||
ops.set_compression_level(param.server_context->compression_level());
|
||||
}
|
||||
if (status.ok()) {
|
||||
status = ops.SendMessage(rsp);
|
||||
}
|
||||
ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
|
||||
param.call->PerformOps(&ops);
|
||||
param.call->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
private:
|
||||
std::function<Status(ServiceType*, ServerContext*, ServerReader<RequestType>*,
|
||||
ResponseType*)>
|
||||
func_;
|
||||
ServiceType* service_;
|
||||
};
|
||||
|
||||
/// A wrapper class of an application provided server streaming handler.
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class ServerStreamingHandler : public MethodHandler {
|
||||
public:
|
||||
ServerStreamingHandler(
|
||||
std::function<Status(ServiceType*, ServerContext*, const RequestType*,
|
||||
ServerWriter<ResponseType>*)>
|
||||
func,
|
||||
ServiceType* service)
|
||||
: func_(func), service_(service) {}
|
||||
|
||||
void RunHandler(const HandlerParameter& param) final {
|
||||
RequestType req;
|
||||
Status status =
|
||||
SerializationTraits<RequestType>::Deserialize(param.request, &req);
|
||||
|
||||
if (status.ok()) {
|
||||
ServerWriter<ResponseType> writer(param.call, param.server_context);
|
||||
status = func_(service_, param.server_context, &req, &writer);
|
||||
}
|
||||
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops;
|
||||
if (!param.server_context->sent_initial_metadata_) {
|
||||
ops.SendInitialMetadata(param.server_context->initial_metadata_,
|
||||
param.server_context->initial_metadata_flags());
|
||||
if (param.server_context->compression_level_set()) {
|
||||
ops.set_compression_level(param.server_context->compression_level());
|
||||
}
|
||||
}
|
||||
ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
|
||||
param.call->PerformOps(&ops);
|
||||
if (param.server_context->has_pending_ops_) {
|
||||
param.call->cq()->Pluck(¶m.server_context->pending_ops_);
|
||||
}
|
||||
param.call->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
private:
|
||||
std::function<Status(ServiceType*, ServerContext*, const RequestType*,
|
||||
ServerWriter<ResponseType>*)>
|
||||
func_;
|
||||
ServiceType* service_;
|
||||
};
|
||||
|
||||
/// A wrapper class of an application provided bidi-streaming handler.
|
||||
/// This also applies to server-streamed implementation of a unary method
|
||||
/// with the additional requirement that such methods must have done a
|
||||
/// write for status to be ok
|
||||
/// Since this is used by more than 1 class, the service is not passed in.
|
||||
/// Instead, it is expected to be an implicitly-captured argument of func
|
||||
/// (through bind or something along those lines)
|
||||
template <class Streamer, bool WriteNeeded>
|
||||
class TemplatedBidiStreamingHandler : public MethodHandler {
|
||||
public:
|
||||
TemplatedBidiStreamingHandler(
|
||||
std::function<Status(ServerContext*, Streamer*)> func)
|
||||
: func_(func), write_needed_(WriteNeeded) {}
|
||||
|
||||
void RunHandler(const HandlerParameter& param) final {
|
||||
Streamer stream(param.call, param.server_context);
|
||||
Status status = func_(param.server_context, &stream);
|
||||
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops;
|
||||
if (!param.server_context->sent_initial_metadata_) {
|
||||
ops.SendInitialMetadata(param.server_context->initial_metadata_,
|
||||
param.server_context->initial_metadata_flags());
|
||||
if (param.server_context->compression_level_set()) {
|
||||
ops.set_compression_level(param.server_context->compression_level());
|
||||
}
|
||||
if (write_needed_ && status.ok()) {
|
||||
// If we needed a write but never did one, we need to mark the
|
||||
// status as a fail
|
||||
status = Status(StatusCode::INTERNAL,
|
||||
"Service did not provide response message");
|
||||
}
|
||||
}
|
||||
ops.ServerSendStatus(param.server_context->trailing_metadata_, status);
|
||||
param.call->PerformOps(&ops);
|
||||
if (param.server_context->has_pending_ops_) {
|
||||
param.call->cq()->Pluck(¶m.server_context->pending_ops_);
|
||||
}
|
||||
param.call->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
private:
|
||||
std::function<Status(ServerContext*, Streamer*)> func_;
|
||||
const bool write_needed_;
|
||||
};
|
||||
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class BidiStreamingHandler
|
||||
: public TemplatedBidiStreamingHandler<
|
||||
ServerReaderWriter<ResponseType, RequestType>, false> {
|
||||
public:
|
||||
BidiStreamingHandler(
|
||||
std::function<Status(ServiceType*, ServerContext*,
|
||||
ServerReaderWriter<ResponseType, RequestType>*)>
|
||||
func,
|
||||
ServiceType* service)
|
||||
: TemplatedBidiStreamingHandler<
|
||||
ServerReaderWriter<ResponseType, RequestType>, false>(std::bind(
|
||||
func, service, std::placeholders::_1, std::placeholders::_2)) {}
|
||||
};
|
||||
|
||||
template <class RequestType, class ResponseType>
|
||||
class StreamedUnaryHandler
|
||||
: public TemplatedBidiStreamingHandler<
|
||||
ServerUnaryStreamer<RequestType, ResponseType>, true> {
|
||||
public:
|
||||
explicit StreamedUnaryHandler(
|
||||
std::function<Status(ServerContext*,
|
||||
ServerUnaryStreamer<RequestType, ResponseType>*)>
|
||||
func)
|
||||
: TemplatedBidiStreamingHandler<
|
||||
ServerUnaryStreamer<RequestType, ResponseType>, true>(func) {}
|
||||
};
|
||||
|
||||
template <class RequestType, class ResponseType>
|
||||
class SplitServerStreamingHandler
|
||||
: public TemplatedBidiStreamingHandler<
|
||||
ServerSplitStreamer<RequestType, ResponseType>, false> {
|
||||
public:
|
||||
explicit SplitServerStreamingHandler(
|
||||
std::function<Status(ServerContext*,
|
||||
ServerSplitStreamer<RequestType, ResponseType>*)>
|
||||
func)
|
||||
: TemplatedBidiStreamingHandler<
|
||||
ServerSplitStreamer<RequestType, ResponseType>, false>(func) {}
|
||||
};
|
||||
|
||||
/// Handle unknown method by returning UNIMPLEMENTED error.
|
||||
class UnknownMethodHandler : public MethodHandler {
|
||||
public:
|
||||
template <class T>
|
||||
static void FillOps(ServerContext* context, T* ops) {
|
||||
Status status(StatusCode::UNIMPLEMENTED, "");
|
||||
if (!context->sent_initial_metadata_) {
|
||||
ops->SendInitialMetadata(context->initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
if (context->compression_level_set()) {
|
||||
ops->set_compression_level(context->compression_level());
|
||||
}
|
||||
context->sent_initial_metadata_ = true;
|
||||
}
|
||||
ops->ServerSendStatus(context->trailing_metadata_, status);
|
||||
}
|
||||
|
||||
void RunHandler(const HandlerParameter& param) final {
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops;
|
||||
FillOps(param.server_context, &ops);
|
||||
param.call->PerformOps(&ops);
|
||||
param.call->cq()->Pluck(&ops);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H
|
||||
@@ -1,225 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H
|
||||
#define GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include <grpc++/impl/codegen/config_protobuf.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/serialization_traits.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
#include <grpc/impl/codegen/byte_buffer_reader.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
#include <grpc/impl/codegen/slice.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
extern CoreCodegenInterface* g_core_codegen_interface;
|
||||
|
||||
namespace internal {
|
||||
|
||||
class GrpcBufferWriterPeer;
|
||||
|
||||
const int kGrpcBufferWriterMaxBufferLength = 1024 * 1024;
|
||||
|
||||
class GrpcBufferWriter final
|
||||
: public ::grpc::protobuf::io::ZeroCopyOutputStream {
|
||||
public:
|
||||
explicit GrpcBufferWriter(grpc_byte_buffer** bp, int block_size)
|
||||
: block_size_(block_size), byte_count_(0), have_backup_(false) {
|
||||
*bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(NULL, 0);
|
||||
slice_buffer_ = &(*bp)->data.raw.slice_buffer;
|
||||
}
|
||||
|
||||
~GrpcBufferWriter() override {
|
||||
if (have_backup_) {
|
||||
g_core_codegen_interface->grpc_slice_unref(backup_slice_);
|
||||
}
|
||||
}
|
||||
|
||||
bool Next(void** data, int* size) override {
|
||||
if (have_backup_) {
|
||||
slice_ = backup_slice_;
|
||||
have_backup_ = false;
|
||||
} else {
|
||||
slice_ = g_core_codegen_interface->grpc_slice_malloc(block_size_);
|
||||
}
|
||||
*data = GRPC_SLICE_START_PTR(slice_);
|
||||
// On win x64, int is only 32bit
|
||||
GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX);
|
||||
byte_count_ += * size = (int)GRPC_SLICE_LENGTH(slice_);
|
||||
g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_);
|
||||
return true;
|
||||
}
|
||||
|
||||
void BackUp(int count) override {
|
||||
g_core_codegen_interface->grpc_slice_buffer_pop(slice_buffer_);
|
||||
if (count == block_size_) {
|
||||
backup_slice_ = slice_;
|
||||
} else {
|
||||
backup_slice_ = g_core_codegen_interface->grpc_slice_split_tail(
|
||||
&slice_, GRPC_SLICE_LENGTH(slice_) - count);
|
||||
g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_);
|
||||
}
|
||||
// It's dangerous to keep an inlined grpc_slice as the backup slice, since
|
||||
// on a following Next() call, a reference will be returned to this slice
|
||||
// via GRPC_SLICE_START_PTR, which will not be an adddress held by
|
||||
// slice_buffer_.
|
||||
have_backup_ = backup_slice_.refcount != NULL;
|
||||
byte_count_ -= count;
|
||||
}
|
||||
|
||||
grpc::protobuf::int64 ByteCount() const override { return byte_count_; }
|
||||
|
||||
private:
|
||||
friend class GrpcBufferWriterPeer;
|
||||
const int block_size_;
|
||||
int64_t byte_count_;
|
||||
grpc_slice_buffer* slice_buffer_;
|
||||
bool have_backup_;
|
||||
grpc_slice backup_slice_;
|
||||
grpc_slice slice_;
|
||||
};
|
||||
|
||||
class GrpcBufferReader final
|
||||
: public ::grpc::protobuf::io::ZeroCopyInputStream {
|
||||
public:
|
||||
explicit GrpcBufferReader(grpc_byte_buffer* buffer)
|
||||
: byte_count_(0), backup_count_(0), status_() {
|
||||
if (!g_core_codegen_interface->grpc_byte_buffer_reader_init(&reader_,
|
||||
buffer)) {
|
||||
status_ = Status(StatusCode::INTERNAL,
|
||||
"Couldn't initialize byte buffer reader");
|
||||
}
|
||||
}
|
||||
~GrpcBufferReader() override {
|
||||
g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader_);
|
||||
}
|
||||
|
||||
bool Next(const void** data, int* size) override {
|
||||
if (!status_.ok()) {
|
||||
return false;
|
||||
}
|
||||
if (backup_count_ > 0) {
|
||||
*data = GRPC_SLICE_START_PTR(slice_) + GRPC_SLICE_LENGTH(slice_) -
|
||||
backup_count_;
|
||||
GPR_CODEGEN_ASSERT(backup_count_ <= INT_MAX);
|
||||
*size = (int)backup_count_;
|
||||
backup_count_ = 0;
|
||||
return true;
|
||||
}
|
||||
if (!g_core_codegen_interface->grpc_byte_buffer_reader_next(&reader_,
|
||||
&slice_)) {
|
||||
return false;
|
||||
}
|
||||
g_core_codegen_interface->grpc_slice_unref(slice_);
|
||||
*data = GRPC_SLICE_START_PTR(slice_);
|
||||
// On win x64, int is only 32bit
|
||||
GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX);
|
||||
byte_count_ += * size = (int)GRPC_SLICE_LENGTH(slice_);
|
||||
return true;
|
||||
}
|
||||
|
||||
Status status() const { return status_; }
|
||||
|
||||
void BackUp(int count) override { backup_count_ = count; }
|
||||
|
||||
bool Skip(int count) override {
|
||||
const void* data;
|
||||
int size;
|
||||
while (Next(&data, &size)) {
|
||||
if (size >= count) {
|
||||
BackUp(size - count);
|
||||
return true;
|
||||
}
|
||||
// size < count;
|
||||
count -= size;
|
||||
}
|
||||
// error or we have too large count;
|
||||
return false;
|
||||
}
|
||||
|
||||
grpc::protobuf::int64 ByteCount() const override {
|
||||
return byte_count_ - backup_count_;
|
||||
}
|
||||
|
||||
private:
|
||||
int64_t byte_count_;
|
||||
int64_t backup_count_;
|
||||
grpc_byte_buffer_reader reader_;
|
||||
grpc_slice slice_;
|
||||
Status status_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
template <class T>
|
||||
class SerializationTraits<T, typename std::enable_if<std::is_base_of<
|
||||
grpc::protobuf::Message, T>::value>::type> {
|
||||
public:
|
||||
static Status Serialize(const grpc::protobuf::Message& msg,
|
||||
grpc_byte_buffer** bp, bool* own_buffer) {
|
||||
*own_buffer = true;
|
||||
int byte_size = msg.ByteSize();
|
||||
if (byte_size <= internal::kGrpcBufferWriterMaxBufferLength) {
|
||||
grpc_slice slice = g_core_codegen_interface->grpc_slice_malloc(byte_size);
|
||||
GPR_CODEGEN_ASSERT(
|
||||
GRPC_SLICE_END_PTR(slice) ==
|
||||
msg.SerializeWithCachedSizesToArray(GRPC_SLICE_START_PTR(slice)));
|
||||
*bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(&slice, 1);
|
||||
g_core_codegen_interface->grpc_slice_unref(slice);
|
||||
return g_core_codegen_interface->ok();
|
||||
} else {
|
||||
internal::GrpcBufferWriter writer(
|
||||
bp, internal::kGrpcBufferWriterMaxBufferLength);
|
||||
return msg.SerializeToZeroCopyStream(&writer)
|
||||
? g_core_codegen_interface->ok()
|
||||
: Status(StatusCode::INTERNAL, "Failed to serialize message");
|
||||
}
|
||||
}
|
||||
|
||||
static Status Deserialize(grpc_byte_buffer* buffer,
|
||||
grpc::protobuf::Message* msg) {
|
||||
if (buffer == nullptr) {
|
||||
return Status(StatusCode::INTERNAL, "No payload");
|
||||
}
|
||||
Status result = g_core_codegen_interface->ok();
|
||||
{
|
||||
internal::GrpcBufferReader reader(buffer);
|
||||
if (!reader.status().ok()) {
|
||||
return reader.status();
|
||||
}
|
||||
::grpc::protobuf::io::CodedInputStream decoder(&reader);
|
||||
decoder.SetTotalBytesLimit(INT_MAX, INT_MAX);
|
||||
if (!msg->ParseFromCodedStream(&decoder)) {
|
||||
result = Status(StatusCode::INTERNAL, msg->InitializationErrorString());
|
||||
}
|
||||
if (!decoder.ConsumedEntireMessage()) {
|
||||
result = Status(StatusCode::INTERNAL, "Did not read entire message");
|
||||
}
|
||||
}
|
||||
g_core_codegen_interface->grpc_byte_buffer_destroy(buffer);
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_RPC_METHOD_H
|
||||
#define GRPCXX_IMPL_CODEGEN_RPC_METHOD_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/codegen/channel_interface.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Descriptor of an RPC method
|
||||
class RpcMethod {
|
||||
public:
|
||||
enum RpcType {
|
||||
NORMAL_RPC = 0,
|
||||
CLIENT_STREAMING, // request streaming
|
||||
SERVER_STREAMING, // response streaming
|
||||
BIDI_STREAMING
|
||||
};
|
||||
|
||||
RpcMethod(const char* name, RpcType type)
|
||||
: name_(name), method_type_(type), channel_tag_(NULL) {}
|
||||
|
||||
RpcMethod(const char* name, RpcType type,
|
||||
const std::shared_ptr<ChannelInterface>& channel)
|
||||
: name_(name),
|
||||
method_type_(type),
|
||||
channel_tag_(channel->RegisterMethod(name)) {}
|
||||
|
||||
const char* name() const { return name_; }
|
||||
RpcType method_type() const { return method_type_; }
|
||||
void SetMethodType(RpcType type) { method_type_ = type; }
|
||||
void* channel_tag() const { return channel_tag_; }
|
||||
|
||||
private:
|
||||
const char* const name_;
|
||||
RpcType method_type_;
|
||||
void* const channel_tag_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_RPC_METHOD_H
|
||||
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H
|
||||
#define GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H
|
||||
|
||||
#include <climits>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/rpc_method.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
extern "C" {
|
||||
struct grpc_byte_buffer;
|
||||
}
|
||||
|
||||
namespace grpc {
|
||||
class ServerContext;
|
||||
class StreamContextInterface;
|
||||
|
||||
/// Base class for running an RPC handler.
|
||||
class MethodHandler {
|
||||
public:
|
||||
virtual ~MethodHandler() {}
|
||||
struct HandlerParameter {
|
||||
HandlerParameter(Call* c, ServerContext* context, grpc_byte_buffer* req)
|
||||
: call(c), server_context(context), request(req) {}
|
||||
Call* call;
|
||||
ServerContext* server_context;
|
||||
// Handler required to grpc_byte_buffer_destroy this
|
||||
grpc_byte_buffer* request;
|
||||
};
|
||||
virtual void RunHandler(const HandlerParameter& param) = 0;
|
||||
};
|
||||
|
||||
/// Server side rpc method class
|
||||
class RpcServiceMethod : public RpcMethod {
|
||||
public:
|
||||
/// Takes ownership of the handler
|
||||
RpcServiceMethod(const char* name, RpcMethod::RpcType type,
|
||||
MethodHandler* handler)
|
||||
: RpcMethod(name, type), server_tag_(nullptr), handler_(handler) {}
|
||||
|
||||
void set_server_tag(void* tag) { server_tag_ = tag; }
|
||||
void* server_tag() const { return server_tag_; }
|
||||
/// if MethodHandler is nullptr, then this is an async method
|
||||
MethodHandler* handler() const { return handler_.get(); }
|
||||
void ResetHandler() { handler_.reset(); }
|
||||
void SetHandler(MethodHandler* handler) { handler_.reset(handler); }
|
||||
|
||||
private:
|
||||
void* server_tag_;
|
||||
std::unique_ptr<MethodHandler> handler_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H
|
||||
@@ -1,95 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H
|
||||
|
||||
#include <iterator>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/string_ref.h>
|
||||
|
||||
struct grpc_auth_context;
|
||||
struct grpc_auth_property;
|
||||
struct grpc_auth_property_iterator;
|
||||
|
||||
namespace grpc {
|
||||
class SecureAuthContext;
|
||||
|
||||
typedef std::pair<grpc::string_ref, grpc::string_ref> AuthProperty;
|
||||
|
||||
class AuthPropertyIterator
|
||||
: public std::iterator<std::input_iterator_tag, const AuthProperty> {
|
||||
public:
|
||||
~AuthPropertyIterator();
|
||||
AuthPropertyIterator& operator++();
|
||||
AuthPropertyIterator operator++(int);
|
||||
bool operator==(const AuthPropertyIterator& rhs) const;
|
||||
bool operator!=(const AuthPropertyIterator& rhs) const;
|
||||
const AuthProperty operator*();
|
||||
|
||||
protected:
|
||||
AuthPropertyIterator();
|
||||
AuthPropertyIterator(const grpc_auth_property* property,
|
||||
const grpc_auth_property_iterator* iter);
|
||||
|
||||
private:
|
||||
friend class SecureAuthContext;
|
||||
const grpc_auth_property* property_;
|
||||
// The following items form a grpc_auth_property_iterator.
|
||||
const grpc_auth_context* ctx_;
|
||||
size_t index_;
|
||||
const char* name_;
|
||||
};
|
||||
|
||||
/// Class encapsulating the Authentication Information.
|
||||
///
|
||||
/// It includes the secure identity of the peer, the type of secure transport
|
||||
/// used as well as any other properties required by the authorization layer.
|
||||
class AuthContext {
|
||||
public:
|
||||
virtual ~AuthContext() {}
|
||||
|
||||
/// Returns true if the peer is authenticated.
|
||||
virtual bool IsPeerAuthenticated() const = 0;
|
||||
|
||||
/// A peer identity.
|
||||
///
|
||||
/// It is, in general, comprised of one or more properties (in which case they
|
||||
/// have the same name).
|
||||
virtual std::vector<grpc::string_ref> GetPeerIdentity() const = 0;
|
||||
virtual grpc::string GetPeerIdentityPropertyName() const = 0;
|
||||
|
||||
/// Returns all the property values with the given name.
|
||||
virtual std::vector<grpc::string_ref> FindPropertyValues(
|
||||
const grpc::string& name) const = 0;
|
||||
|
||||
/// Iteration over all the properties.
|
||||
virtual AuthPropertyIterator begin() const = 0;
|
||||
virtual AuthPropertyIterator end() const = 0;
|
||||
|
||||
/// Mutation functions: should only be used by an AuthMetadataProcessor.
|
||||
virtual void AddProperty(const grpc::string& key,
|
||||
const grpc::string_ref& value) = 0;
|
||||
virtual bool SetPeerIdentityPropertyName(const grpc::string& name) = 0;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H
|
||||
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Defines how to serialize and deserialize some type.
|
||||
///
|
||||
/// Used for hooking different message serialization API's into GRPC.
|
||||
/// Each SerializationTraits implementation must provide the following
|
||||
/// functions:
|
||||
/// static Status Serialize(const Message& msg,
|
||||
/// grpc_byte_buffer** buffer,
|
||||
/// bool* own_buffer);
|
||||
/// static Status Deserialize(grpc_byte_buffer* buffer,
|
||||
/// Message* msg,
|
||||
/// int max_receive_message_size);
|
||||
///
|
||||
/// Serialize is required to convert message to a grpc_byte_buffer, and
|
||||
/// to store a pointer to that byte buffer at *buffer. *own_buffer should
|
||||
/// be set to true if the caller owns said byte buffer, or false if
|
||||
/// ownership is retained elsewhere.
|
||||
///
|
||||
/// Deserialize is required to convert buffer into the message stored at
|
||||
/// msg. max_receive_message_size is passed in as a bound on the maximum
|
||||
/// number of message bytes Deserialize should accept.
|
||||
///
|
||||
/// Both functions return a Status, allowing them to explain what went
|
||||
/// wrong if required.
|
||||
template <class Message,
|
||||
class UnusedButHereForPartialTemplateSpecialization = void>
|
||||
class SerializationTraits;
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H
|
||||
@@ -1,299 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc/impl/codegen/compression_types.h>
|
||||
|
||||
#include <grpc++/impl/codegen/call.h>
|
||||
#include <grpc++/impl/codegen/completion_queue_tag.h>
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/create_auth_context.h>
|
||||
#include <grpc++/impl/codegen/metadata_map.h>
|
||||
#include <grpc++/impl/codegen/security/auth_context.h>
|
||||
#include <grpc++/impl/codegen/string_ref.h>
|
||||
#include <grpc++/impl/codegen/time.h>
|
||||
|
||||
struct grpc_metadata;
|
||||
struct grpc_call;
|
||||
struct census_context;
|
||||
|
||||
namespace grpc {
|
||||
class ClientContext;
|
||||
template <class W, class R>
|
||||
class ServerAsyncReader;
|
||||
template <class W>
|
||||
class ServerAsyncWriter;
|
||||
template <class W>
|
||||
class ServerAsyncResponseWriter;
|
||||
template <class W, class R>
|
||||
class ServerAsyncReaderWriter;
|
||||
template <class R>
|
||||
class ServerReader;
|
||||
template <class W>
|
||||
class ServerWriter;
|
||||
namespace internal {
|
||||
template <class W, class R>
|
||||
class ServerReaderWriterBody;
|
||||
}
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class RpcMethodHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class ClientStreamingHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class ServerStreamingHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
class BidiStreamingHandler;
|
||||
class UnknownMethodHandler;
|
||||
|
||||
class Call;
|
||||
class CallOpBuffer;
|
||||
class CompletionQueue;
|
||||
class Server;
|
||||
class ServerInterface;
|
||||
|
||||
namespace testing {
|
||||
class InteropServerContextInspector;
|
||||
class ServerContextTestSpouse;
|
||||
} // namespace testing
|
||||
|
||||
/// A ServerContext allows the person implementing a service handler to:
|
||||
///
|
||||
/// - Add custom initial and trailing metadata key-value pairs that will
|
||||
/// propagated to the client side.
|
||||
/// - Control call settings such as compression and authentication.
|
||||
/// - Access metadata coming from the client.
|
||||
/// - Get performance metrics (ie, census).
|
||||
///
|
||||
/// Context settings are only relevant to the call handler they are supplied to,
|
||||
/// that is to say, they aren't sticky across multiple calls. Some of these
|
||||
/// settings, such as the compression options, can be made persistant at server
|
||||
/// construction time by specifying the approriate \a ChannelArguments
|
||||
/// to a \a grpc::ServerBuilder, via \a ServerBuilder::AddChannelArgument.
|
||||
///
|
||||
/// \warning ServerContext instances should \em not be reused across rpcs.
|
||||
class ServerContext {
|
||||
public:
|
||||
ServerContext(); // for async calls
|
||||
~ServerContext();
|
||||
|
||||
/// Return the deadline for the server call.
|
||||
std::chrono::system_clock::time_point deadline() const {
|
||||
return Timespec2Timepoint(deadline_);
|
||||
}
|
||||
|
||||
/// Return a \a gpr_timespec representation of the server call's deadline.
|
||||
gpr_timespec raw_deadline() const { return deadline_; }
|
||||
|
||||
/// Add the (\a meta_key, \a meta_value) pair to the initial metadata
|
||||
/// associated with a server call. These are made available at the client side
|
||||
/// by the \a grpc::ClientContext::GetServerInitialMetadata() method.
|
||||
///
|
||||
/// \warning This method should only be called before sending initial metadata
|
||||
/// to the client (which can happen explicitly, or implicitly when sending a
|
||||
/// a response message or status to the client).
|
||||
///
|
||||
/// \param meta_key The metadata key. If \a meta_value is binary data, it must
|
||||
/// end in "-bin".
|
||||
/// \param meta_value The metadata value. If its value is binary, the key name
|
||||
/// must end in "-bin".
|
||||
void AddInitialMetadata(const grpc::string& key, const grpc::string& value);
|
||||
|
||||
/// Add the (\a meta_key, \a meta_value) pair to the initial metadata
|
||||
/// associated with a server call. These are made available at the client
|
||||
/// side by the \a grpc::ClientContext::GetServerTrailingMetadata() method.
|
||||
///
|
||||
/// \warning This method should only be called before sending trailing
|
||||
/// metadata to the client (which happens when the call is finished and a
|
||||
/// status is sent to the client).
|
||||
///
|
||||
/// \param meta_key The metadata key. If \a meta_value is binary data,
|
||||
/// it must end in "-bin".
|
||||
/// \param meta_value The metadata value. If its value is binary, the key name
|
||||
/// must end in "-bin".
|
||||
void AddTrailingMetadata(const grpc::string& key, const grpc::string& value);
|
||||
|
||||
/// IsCancelled is always safe to call when using sync API.
|
||||
/// When using async API, it is only safe to call IsCancelled after
|
||||
/// the AsyncNotifyWhenDone tag has been delivered.
|
||||
bool IsCancelled() const;
|
||||
|
||||
/// Cancel the Call from the server. This is a best-effort API and
|
||||
/// depending on when it is called, the RPC may still appear successful to
|
||||
/// the client.
|
||||
/// For example, if TryCancel() is called on a separate thread, it might race
|
||||
/// with the server handler which might return success to the client before
|
||||
/// TryCancel() was even started by the thread.
|
||||
///
|
||||
/// It is the caller's responsibility to prevent such races and ensure that if
|
||||
/// TryCancel() is called, the serverhandler must return Status::CANCELLED.
|
||||
/// The only exception is that if the serverhandler is already returning an
|
||||
/// error status code, it is ok to not return Status::CANCELLED even if
|
||||
/// TryCancel() was called.
|
||||
void TryCancel() const;
|
||||
|
||||
/// Return a collection of initial metadata key-value pairs sent from the
|
||||
/// client. Note that keys may happen more than
|
||||
/// once (ie, a \a std::multimap is returned).
|
||||
///
|
||||
/// It is safe to use this method after initial metadata has been received,
|
||||
/// Calls always begin with the client sending initial metadata, so this is
|
||||
/// safe to access as soon as the call has begun on the server side.
|
||||
///
|
||||
/// \return A multimap of initial metadata key-value pairs from the server.
|
||||
const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata()
|
||||
const {
|
||||
return *client_metadata_.map();
|
||||
}
|
||||
|
||||
/// Return the compression algorithm to be used by the server call.
|
||||
grpc_compression_level compression_level() const {
|
||||
return compression_level_;
|
||||
}
|
||||
|
||||
/// Set \a algorithm to be the compression algorithm used for the server call.
|
||||
///
|
||||
/// \param algorithm The compression algorithm used for the server call.
|
||||
void set_compression_level(grpc_compression_level level) {
|
||||
compression_level_set_ = true;
|
||||
compression_level_ = level;
|
||||
}
|
||||
|
||||
/// Return a bool indicating whether the compression level for this call
|
||||
/// has been set (either implicitly or through a previous call to
|
||||
/// \a set_compression_level.
|
||||
bool compression_level_set() const { return compression_level_set_; }
|
||||
|
||||
/// Return the compression algorithm to be used by the server call.
|
||||
grpc_compression_algorithm compression_algorithm() const {
|
||||
return compression_algorithm_;
|
||||
}
|
||||
/// Set \a algorithm to be the compression algorithm used for the server call.
|
||||
///
|
||||
/// \param algorithm The compression algorithm used for the server call.
|
||||
void set_compression_algorithm(grpc_compression_algorithm algorithm);
|
||||
|
||||
/// Set the load reporting costs in \a cost_data for the call.
|
||||
void SetLoadReportingCosts(const std::vector<grpc::string>& cost_data);
|
||||
|
||||
/// Return the authentication context for this server call.
|
||||
///
|
||||
/// \see grpc::AuthContext.
|
||||
std::shared_ptr<const AuthContext> auth_context() const {
|
||||
if (auth_context_.get() == nullptr) {
|
||||
auth_context_ = CreateAuthContext(call_);
|
||||
}
|
||||
return auth_context_;
|
||||
}
|
||||
|
||||
/// Return the peer uri in a string.
|
||||
/// WARNING: this value is never authenticated or subject to any security
|
||||
/// related code. It must not be used for any authentication related
|
||||
/// functionality. Instead, use auth_context.
|
||||
grpc::string peer() const;
|
||||
|
||||
/// Get the census context associated with this server call.
|
||||
const struct census_context* census_context() const;
|
||||
|
||||
/// Async only. Has to be called before the rpc starts.
|
||||
/// Returns the tag in completion queue when the rpc finishes.
|
||||
/// IsCancelled() can then be called to check whether the rpc was cancelled.
|
||||
void AsyncNotifyWhenDone(void* tag) {
|
||||
has_notify_when_done_tag_ = true;
|
||||
async_notify_when_done_tag_ = tag;
|
||||
}
|
||||
|
||||
/// Should be used for framework-level extensions only.
|
||||
/// Applications never need to call this method.
|
||||
grpc_call* c_call() { return call_; }
|
||||
|
||||
private:
|
||||
friend class ::grpc::testing::InteropServerContextInspector;
|
||||
friend class ::grpc::testing::ServerContextTestSpouse;
|
||||
friend class ::grpc::ServerInterface;
|
||||
friend class ::grpc::Server;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ServerAsyncReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ServerAsyncWriter;
|
||||
template <class W>
|
||||
friend class ::grpc::ServerAsyncResponseWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::ServerAsyncReaderWriter;
|
||||
template <class R>
|
||||
friend class ::grpc::ServerReader;
|
||||
template <class W>
|
||||
friend class ::grpc::ServerWriter;
|
||||
template <class W, class R>
|
||||
friend class ::grpc::internal::ServerReaderWriterBody;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
friend class RpcMethodHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
friend class ClientStreamingHandler;
|
||||
template <class ServiceType, class RequestType, class ResponseType>
|
||||
friend class ServerStreamingHandler;
|
||||
template <class Streamer, bool WriteNeeded>
|
||||
friend class TemplatedBidiStreamingHandler;
|
||||
friend class UnknownMethodHandler;
|
||||
friend class ::grpc::ClientContext;
|
||||
|
||||
/// Prevent copying.
|
||||
ServerContext(const ServerContext&);
|
||||
ServerContext& operator=(const ServerContext&);
|
||||
|
||||
class CompletionOp;
|
||||
|
||||
void BeginCompletionOp(Call* call);
|
||||
/// Return the tag queued by BeginCompletionOp()
|
||||
CompletionQueueTag* GetCompletionOpTag();
|
||||
|
||||
ServerContext(gpr_timespec deadline, grpc_metadata_array* arr);
|
||||
|
||||
void set_call(grpc_call* call) { call_ = call; }
|
||||
|
||||
uint32_t initial_metadata_flags() const { return 0; }
|
||||
|
||||
CompletionOp* completion_op_;
|
||||
bool has_notify_when_done_tag_;
|
||||
void* async_notify_when_done_tag_;
|
||||
|
||||
gpr_timespec deadline_;
|
||||
grpc_call* call_;
|
||||
CompletionQueue* cq_;
|
||||
bool sent_initial_metadata_;
|
||||
mutable std::shared_ptr<const AuthContext> auth_context_;
|
||||
MetadataMap client_metadata_;
|
||||
std::multimap<grpc::string, grpc::string> initial_metadata_;
|
||||
std::multimap<grpc::string, grpc::string> trailing_metadata_;
|
||||
|
||||
bool compression_level_set_;
|
||||
grpc_compression_level compression_level_;
|
||||
grpc_compression_algorithm compression_algorithm_;
|
||||
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage> pending_ops_;
|
||||
bool has_pending_ops_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H
|
||||
@@ -1,270 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H
|
||||
|
||||
#include <grpc++/impl/codegen/call_hook.h>
|
||||
#include <grpc++/impl/codegen/completion_queue_tag.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/rpc_service_method.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class AsyncGenericService;
|
||||
class Channel;
|
||||
class GenericServerContext;
|
||||
class RpcService;
|
||||
class ServerAsyncStreamingInterface;
|
||||
class ServerCompletionQueue;
|
||||
class ServerContext;
|
||||
class ServerCredentials;
|
||||
class Service;
|
||||
class ThreadPoolInterface;
|
||||
|
||||
extern CoreCodegenInterface* g_core_codegen_interface;
|
||||
|
||||
/// Models a gRPC server.
|
||||
///
|
||||
/// Servers are configured and started via \a grpc::ServerBuilder.
|
||||
class ServerInterface : public CallHook {
|
||||
public:
|
||||
virtual ~ServerInterface() {}
|
||||
|
||||
/// Shutdown the server, blocking until all rpc processing finishes.
|
||||
/// Forcefully terminate pending calls after \a deadline expires.
|
||||
///
|
||||
/// All completion queue associated with the server (for example, for async
|
||||
/// serving) must be shutdown *after* this method has returned:
|
||||
/// See \a ServerBuilder::AddCompletionQueue for details.
|
||||
///
|
||||
/// \param deadline How long to wait until pending rpcs are forcefully
|
||||
/// terminated.
|
||||
template <class T>
|
||||
void Shutdown(const T& deadline) {
|
||||
ShutdownInternal(TimePoint<T>(deadline).raw_time());
|
||||
}
|
||||
|
||||
/// Shutdown the server, waiting for all rpc processing to finish.
|
||||
///
|
||||
/// All completion queue associated with the server (for example, for async
|
||||
/// serving) must be shutdown *after* this method has returned:
|
||||
/// See \a ServerBuilder::AddCompletionQueue for details.
|
||||
void Shutdown() {
|
||||
ShutdownInternal(
|
||||
g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_MONOTONIC));
|
||||
}
|
||||
|
||||
/// Block waiting for all work to complete.
|
||||
///
|
||||
/// \warning The server must be either shutting down or some other thread must
|
||||
/// call \a Shutdown for this function to ever return.
|
||||
virtual void Wait() = 0;
|
||||
|
||||
protected:
|
||||
friend class Service;
|
||||
|
||||
/// Register a service. This call does not take ownership of the service.
|
||||
/// The service must exist for the lifetime of the Server instance.
|
||||
virtual bool RegisterService(const grpc::string* host, Service* service) = 0;
|
||||
|
||||
/// Register a generic service. This call does not take ownership of the
|
||||
/// service. The service must exist for the lifetime of the Server instance.
|
||||
virtual void RegisterAsyncGenericService(AsyncGenericService* service) = 0;
|
||||
|
||||
/// Tries to bind \a server to the given \a addr.
|
||||
///
|
||||
/// It can be invoked multiple times.
|
||||
///
|
||||
/// \param addr The address to try to bind to the server (eg, localhost:1234,
|
||||
/// 192.168.1.1:31416, [::1]:27182, etc.).
|
||||
/// \params creds The credentials associated with the server.
|
||||
///
|
||||
/// \return bound port number on sucess, 0 on failure.
|
||||
///
|
||||
/// \warning It's an error to call this method on an already started server.
|
||||
virtual int AddListeningPort(const grpc::string& addr,
|
||||
ServerCredentials* creds) = 0;
|
||||
|
||||
/// Start the server.
|
||||
///
|
||||
/// \param cqs Completion queues for handling asynchronous services. The
|
||||
/// caller is required to keep all completion queues live until the server is
|
||||
/// destroyed.
|
||||
/// \param num_cqs How many completion queues does \a cqs hold.
|
||||
virtual void Start(ServerCompletionQueue** cqs, size_t num_cqs) = 0;
|
||||
|
||||
virtual void ShutdownInternal(gpr_timespec deadline) = 0;
|
||||
|
||||
virtual int max_receive_message_size() const = 0;
|
||||
|
||||
virtual grpc_server* server() = 0;
|
||||
|
||||
virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0;
|
||||
|
||||
class BaseAsyncRequest : public CompletionQueueTag {
|
||||
public:
|
||||
BaseAsyncRequest(ServerInterface* server, ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq, void* tag,
|
||||
bool delete_on_finalize);
|
||||
virtual ~BaseAsyncRequest();
|
||||
|
||||
bool FinalizeResult(void** tag, bool* status) override;
|
||||
|
||||
protected:
|
||||
ServerInterface* const server_;
|
||||
ServerContext* const context_;
|
||||
ServerAsyncStreamingInterface* const stream_;
|
||||
CompletionQueue* const call_cq_;
|
||||
void* const tag_;
|
||||
const bool delete_on_finalize_;
|
||||
grpc_call* call_;
|
||||
};
|
||||
|
||||
class RegisteredAsyncRequest : public BaseAsyncRequest {
|
||||
public:
|
||||
RegisteredAsyncRequest(ServerInterface* server, ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq, void* tag);
|
||||
|
||||
// uses BaseAsyncRequest::FinalizeResult
|
||||
|
||||
protected:
|
||||
void IssueRequest(void* registered_method, grpc_byte_buffer** payload,
|
||||
ServerCompletionQueue* notification_cq);
|
||||
};
|
||||
|
||||
class NoPayloadAsyncRequest final : public RegisteredAsyncRequest {
|
||||
public:
|
||||
NoPayloadAsyncRequest(void* registered_method, ServerInterface* server,
|
||||
ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag)
|
||||
: RegisteredAsyncRequest(server, context, stream, call_cq, tag) {
|
||||
IssueRequest(registered_method, nullptr, notification_cq);
|
||||
}
|
||||
|
||||
// uses RegisteredAsyncRequest::FinalizeResult
|
||||
};
|
||||
|
||||
template <class Message>
|
||||
class PayloadAsyncRequest final : public RegisteredAsyncRequest {
|
||||
public:
|
||||
PayloadAsyncRequest(void* registered_method, ServerInterface* server,
|
||||
ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag,
|
||||
Message* request)
|
||||
: RegisteredAsyncRequest(server, context, stream, call_cq, tag),
|
||||
registered_method_(registered_method),
|
||||
server_(server),
|
||||
context_(context),
|
||||
stream_(stream),
|
||||
call_cq_(call_cq),
|
||||
notification_cq_(notification_cq),
|
||||
tag_(tag),
|
||||
request_(request) {
|
||||
IssueRequest(registered_method, &payload_, notification_cq);
|
||||
}
|
||||
|
||||
bool FinalizeResult(void** tag, bool* status) override {
|
||||
if (*status) {
|
||||
if (payload_ == nullptr ||
|
||||
!SerializationTraits<Message>::Deserialize(payload_, request_)
|
||||
.ok()) {
|
||||
// If deserialization fails, we cancel the call and instantiate
|
||||
// a new instance of ourselves to request another call. We then
|
||||
// return false, which prevents the call from being returned to
|
||||
// the application.
|
||||
g_core_codegen_interface->grpc_call_cancel_with_status(
|
||||
call_, GRPC_STATUS_INTERNAL, "Unable to parse request", nullptr);
|
||||
g_core_codegen_interface->grpc_call_unref(call_);
|
||||
new PayloadAsyncRequest(registered_method_, server_, context_,
|
||||
stream_, call_cq_, notification_cq_, tag_,
|
||||
request_);
|
||||
delete this;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return RegisteredAsyncRequest::FinalizeResult(tag, status);
|
||||
}
|
||||
|
||||
private:
|
||||
void* const registered_method_;
|
||||
ServerInterface* const server_;
|
||||
ServerContext* const context_;
|
||||
ServerAsyncStreamingInterface* const stream_;
|
||||
CompletionQueue* const call_cq_;
|
||||
ServerCompletionQueue* const notification_cq_;
|
||||
void* const tag_;
|
||||
Message* const request_;
|
||||
grpc_byte_buffer* payload_;
|
||||
};
|
||||
|
||||
class GenericAsyncRequest : public BaseAsyncRequest {
|
||||
public:
|
||||
GenericAsyncRequest(ServerInterface* server, GenericServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag,
|
||||
bool delete_on_finalize);
|
||||
|
||||
bool FinalizeResult(void** tag, bool* status) override;
|
||||
|
||||
private:
|
||||
grpc_call_details call_details_;
|
||||
};
|
||||
|
||||
template <class Message>
|
||||
void RequestAsyncCall(RpcServiceMethod* method, ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag,
|
||||
Message* message) {
|
||||
GPR_CODEGEN_ASSERT(method);
|
||||
new PayloadAsyncRequest<Message>(method->server_tag(), this, context,
|
||||
stream, call_cq, notification_cq, tag,
|
||||
message);
|
||||
}
|
||||
|
||||
void RequestAsyncCall(RpcServiceMethod* method, ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag) {
|
||||
GPR_CODEGEN_ASSERT(method);
|
||||
new NoPayloadAsyncRequest(method->server_tag(), this, context, stream,
|
||||
call_cq, notification_cq, tag);
|
||||
}
|
||||
|
||||
void RequestAsyncGenericCall(GenericServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq,
|
||||
void* tag) {
|
||||
new GenericAsyncRequest(this, context, stream, call_cq, notification_cq,
|
||||
tag, true);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H
|
||||
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/rpc_service_method.h>
|
||||
#include <grpc++/impl/codegen/serialization_traits.h>
|
||||
#include <grpc++/impl/codegen/server_interface.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class Call;
|
||||
class CompletionQueue;
|
||||
class Server;
|
||||
class ServerInterface;
|
||||
class ServerCompletionQueue;
|
||||
class ServerContext;
|
||||
|
||||
class ServerAsyncStreamingInterface {
|
||||
public:
|
||||
virtual ~ServerAsyncStreamingInterface() {}
|
||||
|
||||
/// Request notification of the sending of initial metadata to the client.
|
||||
/// Completion will be notified by \a tag on the associated completion
|
||||
/// queue. This call is optional, but if it is used, it cannot be used
|
||||
/// concurrently with or after the \a Finish method.
|
||||
///
|
||||
/// \param[in] tag Tag identifying this request.
|
||||
virtual void SendInitialMetadata(void* tag) = 0;
|
||||
|
||||
private:
|
||||
friend class ServerInterface;
|
||||
virtual void BindCall(Call* call) = 0;
|
||||
};
|
||||
|
||||
/// Desriptor of an RPC service and its various RPC methods
|
||||
class Service {
|
||||
public:
|
||||
Service() : server_(nullptr) {}
|
||||
virtual ~Service() {}
|
||||
|
||||
bool has_async_methods() const {
|
||||
for (auto it = methods_.begin(); it != methods_.end(); ++it) {
|
||||
if (*it && (*it)->handler() == nullptr) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool has_synchronous_methods() const {
|
||||
for (auto it = methods_.begin(); it != methods_.end(); ++it) {
|
||||
if (*it && (*it)->handler() != nullptr) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool has_generic_methods() const {
|
||||
for (auto it = methods_.begin(); it != methods_.end(); ++it) {
|
||||
if (it->get() == nullptr) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
template <class Message>
|
||||
void RequestAsyncUnary(int index, ServerContext* context, Message* request,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq, void* tag) {
|
||||
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
|
||||
notification_cq, tag, request);
|
||||
}
|
||||
void RequestAsyncClientStreaming(int index, ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq,
|
||||
void* tag) {
|
||||
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
|
||||
notification_cq, tag);
|
||||
}
|
||||
template <class Message>
|
||||
void RequestAsyncServerStreaming(int index, ServerContext* context,
|
||||
Message* request,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq,
|
||||
void* tag) {
|
||||
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
|
||||
notification_cq, tag, request);
|
||||
}
|
||||
void RequestAsyncBidiStreaming(int index, ServerContext* context,
|
||||
ServerAsyncStreamingInterface* stream,
|
||||
CompletionQueue* call_cq,
|
||||
ServerCompletionQueue* notification_cq,
|
||||
void* tag) {
|
||||
server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq,
|
||||
notification_cq, tag);
|
||||
}
|
||||
|
||||
void AddMethod(RpcServiceMethod* method) { methods_.emplace_back(method); }
|
||||
|
||||
void MarkMethodAsync(int index) {
|
||||
GPR_CODEGEN_ASSERT(
|
||||
methods_[index].get() != nullptr &&
|
||||
"Cannot mark the method as 'async' because it has already been "
|
||||
"marked as 'generic'.");
|
||||
methods_[index]->ResetHandler();
|
||||
}
|
||||
|
||||
void MarkMethodGeneric(int index) {
|
||||
GPR_CODEGEN_ASSERT(
|
||||
methods_[index]->handler() != nullptr &&
|
||||
"Cannot mark the method as 'generic' because it has already been "
|
||||
"marked as 'async'.");
|
||||
methods_[index].reset();
|
||||
}
|
||||
|
||||
void MarkMethodStreamed(int index, MethodHandler* streamed_method) {
|
||||
GPR_CODEGEN_ASSERT(methods_[index] && methods_[index]->handler() &&
|
||||
"Cannot mark an async or generic method Streamed");
|
||||
methods_[index]->SetHandler(streamed_method);
|
||||
|
||||
// From the server's point of view, streamed unary is a special
|
||||
// case of BIDI_STREAMING that has 1 read and 1 write, in that order,
|
||||
// and split server-side streaming is BIDI_STREAMING with 1 read and
|
||||
// any number of writes, in that order.
|
||||
methods_[index]->SetMethodType(::grpc::RpcMethod::BIDI_STREAMING);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Server;
|
||||
friend class ServerInterface;
|
||||
ServerInterface* server_;
|
||||
std::vector<std::unique_ptr<RpcServiceMethod>> methods_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SLICE_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SLICE_H
|
||||
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/string_ref.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
inline grpc::string_ref StringRefFromSlice(const grpc_slice* slice) {
|
||||
return grpc::string_ref(
|
||||
reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(*slice)),
|
||||
GRPC_SLICE_LENGTH(*slice));
|
||||
}
|
||||
|
||||
inline grpc::string StringFromCopiedSlice(grpc_slice slice) {
|
||||
return grpc::string(reinterpret_cast<char*>(GRPC_SLICE_START_PTR(slice)),
|
||||
GRPC_SLICE_LENGTH(slice));
|
||||
}
|
||||
|
||||
inline grpc_slice SliceReferencingString(const grpc::string& str) {
|
||||
return g_core_codegen_interface->grpc_slice_from_static_buffer(str.data(),
|
||||
str.length());
|
||||
}
|
||||
|
||||
inline grpc_slice SliceFromCopiedString(const grpc::string& str) {
|
||||
return g_core_codegen_interface->grpc_slice_from_copied_buffer(str.data(),
|
||||
str.length());
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SLICE_H
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_STATUS_H
|
||||
#define GRPCXX_IMPL_CODEGEN_STATUS_H
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/status_code_enum.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Did it work? If it didn't, why?
|
||||
///
|
||||
/// See \a grpc::StatusCode for details on the available code and their meaning.
|
||||
class Status {
|
||||
public:
|
||||
/// Construct an OK instance.
|
||||
Status() : code_(StatusCode::OK) {}
|
||||
|
||||
/// Construct an instance with associated \a code and \a error_message.
|
||||
/// It is an error to construct an OK status with non-empty \a error_message.
|
||||
Status(StatusCode code, const grpc::string& error_message)
|
||||
: code_(code), error_message_(error_message) {}
|
||||
|
||||
/// Construct an instance with \a code, \a error_message and
|
||||
/// \a error_details. It is an error to construct an OK status with non-empty
|
||||
/// \a error_message and/or \a error_details.
|
||||
Status(StatusCode code, const grpc::string& error_message,
|
||||
const grpc::string& error_details)
|
||||
: code_(code),
|
||||
error_message_(error_message),
|
||||
binary_error_details_(error_details) {}
|
||||
|
||||
// Pre-defined special status objects.
|
||||
/// An OK pre-defined instance.
|
||||
static const Status& OK;
|
||||
/// A CANCELLED pre-defined instance.
|
||||
static const Status& CANCELLED;
|
||||
|
||||
/// Return the instance's error code.
|
||||
StatusCode error_code() const { return code_; }
|
||||
/// Return the instance's error message.
|
||||
grpc::string error_message() const { return error_message_; }
|
||||
/// Return the (binary) error details.
|
||||
// Usually it contains a serialized google.rpc.Status proto.
|
||||
grpc::string error_details() const { return binary_error_details_; }
|
||||
|
||||
/// Is the status OK?
|
||||
bool ok() const { return code_ == StatusCode::OK; }
|
||||
|
||||
// Ignores any errors. This method does nothing except potentially suppress
|
||||
// complaints from any tools that are checking that errors are not dropped on
|
||||
// the floor.
|
||||
void IgnoreError() const {}
|
||||
|
||||
private:
|
||||
StatusCode code_;
|
||||
grpc::string error_message_;
|
||||
grpc::string binary_error_details_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_STATUS_H
|
||||
@@ -1,142 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H
|
||||
#define GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H
|
||||
|
||||
namespace grpc {
|
||||
|
||||
enum StatusCode {
|
||||
/// Not an error; returned on success.
|
||||
OK = 0,
|
||||
|
||||
/// The operation was cancelled (typically by the caller).
|
||||
CANCELLED = 1,
|
||||
|
||||
/// Unknown error. An example of where this error may be returned is if a
|
||||
/// Status value received from another address space belongs to an error-space
|
||||
/// that is not known in this address space. Also errors raised by APIs that
|
||||
/// do not return enough error information may be converted to this error.
|
||||
UNKNOWN = 2,
|
||||
|
||||
/// Client specified an invalid argument. Note that this differs from
|
||||
/// FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are
|
||||
/// problematic regardless of the state of the system (e.g., a malformed file
|
||||
/// name).
|
||||
INVALID_ARGUMENT = 3,
|
||||
|
||||
/// Deadline expired before operation could complete. For operations that
|
||||
/// change the state of the system, this error may be returned even if the
|
||||
/// operation has completed successfully. For example, a successful response
|
||||
/// from a server could have been delayed long enough for the deadline to
|
||||
/// expire.
|
||||
DEADLINE_EXCEEDED = 4,
|
||||
|
||||
/// Some requested entity (e.g., file or directory) was not found.
|
||||
NOT_FOUND = 5,
|
||||
|
||||
/// Some entity that we attempted to create (e.g., file or directory) already
|
||||
/// exists.
|
||||
ALREADY_EXISTS = 6,
|
||||
|
||||
/// The caller does not have permission to execute the specified operation.
|
||||
/// PERMISSION_DENIED must not be used for rejections caused by exhausting
|
||||
/// some resource (use RESOURCE_EXHAUSTED instead for those errors).
|
||||
/// PERMISSION_DENIED must not be used if the caller can not be identified
|
||||
/// (use UNAUTHENTICATED instead for those errors).
|
||||
PERMISSION_DENIED = 7,
|
||||
|
||||
/// The request does not have valid authentication credentials for the
|
||||
/// operation.
|
||||
UNAUTHENTICATED = 16,
|
||||
|
||||
/// Some resource has been exhausted, perhaps a per-user quota, or perhaps the
|
||||
/// entire file system is out of space.
|
||||
RESOURCE_EXHAUSTED = 8,
|
||||
|
||||
/// Operation was rejected because the system is not in a state required for
|
||||
/// the operation's execution. For example, directory to be deleted may be
|
||||
/// non-empty, an rmdir operation is applied to a non-directory, etc.
|
||||
///
|
||||
/// A litmus test that may help a service implementor in deciding
|
||||
/// between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:
|
||||
/// (a) Use UNAVAILABLE if the client can retry just the failing call.
|
||||
/// (b) Use ABORTED if the client should retry at a higher-level
|
||||
/// (e.g., restarting a read-modify-write sequence).
|
||||
/// (c) Use FAILED_PRECONDITION if the client should not retry until
|
||||
/// the system state has been explicitly fixed. E.g., if an "rmdir"
|
||||
/// fails because the directory is non-empty, FAILED_PRECONDITION
|
||||
/// should be returned since the client should not retry unless
|
||||
/// they have first fixed up the directory by deleting files from it.
|
||||
/// (d) Use FAILED_PRECONDITION if the client performs conditional
|
||||
/// REST Get/Update/Delete on a resource and the resource on the
|
||||
/// server does not match the condition. E.g., conflicting
|
||||
/// read-modify-write on the same resource.
|
||||
FAILED_PRECONDITION = 9,
|
||||
|
||||
/// The operation was aborted, typically due to a concurrency issue like
|
||||
/// sequencer check failures, transaction aborts, etc.
|
||||
///
|
||||
/// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,
|
||||
/// and UNAVAILABLE.
|
||||
ABORTED = 10,
|
||||
|
||||
/// Operation was attempted past the valid range. E.g., seeking or reading
|
||||
/// past end of file.
|
||||
///
|
||||
/// Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed
|
||||
/// if the system state changes. For example, a 32-bit file system will
|
||||
/// generate INVALID_ARGUMENT if asked to read at an offset that is not in the
|
||||
/// range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from
|
||||
/// an offset past the current file size.
|
||||
///
|
||||
/// There is a fair bit of overlap between FAILED_PRECONDITION and
|
||||
/// OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error)
|
||||
/// when it applies so that callers who are iterating through a space can
|
||||
/// easily look for an OUT_OF_RANGE error to detect when they are done.
|
||||
OUT_OF_RANGE = 11,
|
||||
|
||||
/// Operation is not implemented or not supported/enabled in this service.
|
||||
UNIMPLEMENTED = 12,
|
||||
|
||||
/// Internal errors. Means some invariants expected by underlying System has
|
||||
/// been broken. If you see one of these errors, Something is very broken.
|
||||
INTERNAL = 13,
|
||||
|
||||
/// The service is currently unavailable. This is a most likely a transient
|
||||
/// condition and may be corrected by retrying with a backoff.
|
||||
///
|
||||
/// \warning Although data MIGHT not have been transmitted when this
|
||||
/// status occurs, there is NOT A GUARANTEE that the server has not seen
|
||||
/// anything. So in general it is unsafe to retry on this status code
|
||||
/// if the call is non-idempotent.
|
||||
///
|
||||
/// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,
|
||||
/// and UNAVAILABLE.
|
||||
UNAVAILABLE = 14,
|
||||
|
||||
/// Unrecoverable data loss or corruption.
|
||||
DATA_LOSS = 15,
|
||||
|
||||
/// Force users to include a default branch:
|
||||
DO_NOT_USE = -1
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H
|
||||
@@ -1,146 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_STRING_REF_H
|
||||
#define GRPCXX_IMPL_CODEGEN_STRING_REF_H
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <iosfwd>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// This class is a non owning reference to a string.
|
||||
///
|
||||
/// It should be a strict subset of the upcoming std::string_ref.
|
||||
///
|
||||
/// \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html
|
||||
///
|
||||
/// The constexpr is dropped or replaced with const for legacy compiler
|
||||
/// compatibility.
|
||||
class string_ref {
|
||||
public:
|
||||
/// types
|
||||
typedef const char* const_iterator;
|
||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||
|
||||
/// constants
|
||||
const static size_t npos;
|
||||
|
||||
/// construct/copy.
|
||||
string_ref() : data_(nullptr), length_(0) {}
|
||||
string_ref(const string_ref& other)
|
||||
: data_(other.data_), length_(other.length_) {}
|
||||
string_ref& operator=(const string_ref& rhs) {
|
||||
data_ = rhs.data_;
|
||||
length_ = rhs.length_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
string_ref(const char* s) : data_(s), length_(strlen(s)) {}
|
||||
string_ref(const char* s, size_t l) : data_(s), length_(l) {}
|
||||
string_ref(const grpc::string& s) : data_(s.data()), length_(s.length()) {}
|
||||
|
||||
/// iterators
|
||||
const_iterator begin() const { return data_; }
|
||||
const_iterator end() const { return data_ + length_; }
|
||||
const_iterator cbegin() const { return data_; }
|
||||
const_iterator cend() const { return data_ + length_; }
|
||||
const_reverse_iterator rbegin() const {
|
||||
return const_reverse_iterator(end());
|
||||
}
|
||||
const_reverse_iterator rend() const {
|
||||
return const_reverse_iterator(begin());
|
||||
}
|
||||
const_reverse_iterator crbegin() const {
|
||||
return const_reverse_iterator(end());
|
||||
}
|
||||
const_reverse_iterator crend() const {
|
||||
return const_reverse_iterator(begin());
|
||||
}
|
||||
|
||||
/// capacity
|
||||
size_t size() const { return length_; }
|
||||
size_t length() const { return length_; }
|
||||
size_t max_size() const { return length_; }
|
||||
bool empty() const { return length_ == 0; }
|
||||
|
||||
/// element access
|
||||
const char* data() const { return data_; }
|
||||
|
||||
/// string operations
|
||||
int compare(string_ref x) const {
|
||||
size_t min_size = length_ < x.length_ ? length_ : x.length_;
|
||||
int r = memcmp(data_, x.data_, min_size);
|
||||
if (r < 0) return -1;
|
||||
if (r > 0) return 1;
|
||||
if (length_ < x.length_) return -1;
|
||||
if (length_ > x.length_) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool starts_with(string_ref x) const {
|
||||
return length_ >= x.length_ && (memcmp(data_, x.data_, x.length_) == 0);
|
||||
}
|
||||
|
||||
bool ends_with(string_ref x) const {
|
||||
return length_ >= x.length_ &&
|
||||
(memcmp(data_ + (length_ - x.length_), x.data_, x.length_) == 0);
|
||||
}
|
||||
|
||||
size_t find(string_ref s) const {
|
||||
auto it = std::search(cbegin(), cend(), s.cbegin(), s.cend());
|
||||
return it == cend() ? npos : std::distance(cbegin(), it);
|
||||
}
|
||||
|
||||
size_t find(char c) const {
|
||||
auto it = std::find(cbegin(), cend(), c);
|
||||
return it == cend() ? npos : std::distance(cbegin(), it);
|
||||
}
|
||||
|
||||
string_ref substr(size_t pos, size_t n = npos) const {
|
||||
if (pos > length_) pos = length_;
|
||||
if (n > (length_ - pos)) n = length_ - pos;
|
||||
return string_ref(data_ + pos, n);
|
||||
}
|
||||
|
||||
private:
|
||||
const char* data_;
|
||||
size_t length_;
|
||||
};
|
||||
|
||||
/// Comparison operators
|
||||
inline bool operator==(string_ref x, string_ref y) { return x.compare(y) == 0; }
|
||||
inline bool operator!=(string_ref x, string_ref y) { return x.compare(y) != 0; }
|
||||
inline bool operator<(string_ref x, string_ref y) { return x.compare(y) < 0; }
|
||||
inline bool operator<=(string_ref x, string_ref y) { return x.compare(y) <= 0; }
|
||||
inline bool operator>(string_ref x, string_ref y) { return x.compare(y) > 0; }
|
||||
inline bool operator>=(string_ref x, string_ref y) { return x.compare(y) >= 0; }
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& out, const string_ref& string) {
|
||||
return out << grpc::string(string.begin(), string.end());
|
||||
}
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_STRING_REF_H
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H
|
||||
#define GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Useful interface for generated stubs
|
||||
class StubOptions {};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H
|
||||
@@ -1,853 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H
|
||||
#define GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H
|
||||
|
||||
#include <grpc++/impl/codegen/call.h>
|
||||
#include <grpc++/impl/codegen/channel_interface.h>
|
||||
#include <grpc++/impl/codegen/client_context.h>
|
||||
#include <grpc++/impl/codegen/completion_queue.h>
|
||||
#include <grpc++/impl/codegen/core_codegen_interface.h>
|
||||
#include <grpc++/impl/codegen/server_context.h>
|
||||
#include <grpc++/impl/codegen/service_type.h>
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Common interface for all synchronous client side streaming.
|
||||
class ClientStreamingInterface {
|
||||
public:
|
||||
virtual ~ClientStreamingInterface() {}
|
||||
|
||||
/// Block waiting until the stream finishes and a final status of the call is
|
||||
/// available.
|
||||
///
|
||||
/// It is appropriate to call this method when both:
|
||||
/// * the calling code (client-side) has no more message to send
|
||||
/// (this can be declared implicitly by calling this method, or
|
||||
/// explicitly through an earlier call to <i>WritesDone</i> method of the
|
||||
/// class in use, e.g. \a ClientWriterInterface::WritesDone or
|
||||
/// \a ClientReaderWriterInterface::WritesDone).
|
||||
/// * there are no more messages to be received from the server (which can
|
||||
/// be known implicitly, or explicitly from an earlier call to \a
|
||||
/// ReaderInterface::Read that returned "false").
|
||||
///
|
||||
/// This function will return either:
|
||||
/// - when all incoming messages have been read and the server has
|
||||
/// returned status.
|
||||
/// - when the server has returned a non-OK status.
|
||||
/// - OR when the call failed for some reason and the library generated a
|
||||
/// status.
|
||||
///
|
||||
/// Return values:
|
||||
/// - \a Status contains the status code, message and details for the call
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible trailing metadata sent from the server.
|
||||
virtual Status Finish() = 0;
|
||||
};
|
||||
|
||||
/// Common interface for all synchronous server side streaming.
|
||||
class ServerStreamingInterface {
|
||||
public:
|
||||
virtual ~ServerStreamingInterface() {}
|
||||
|
||||
/// Block to send initial metadata to client.
|
||||
/// This call is optional, but if it is used, it cannot be used concurrently
|
||||
/// with or after the \a Finish method.
|
||||
///
|
||||
/// The initial metadata that will be sent to the client will be
|
||||
/// taken from the \a ServerContext associated with the call.
|
||||
virtual void SendInitialMetadata() = 0;
|
||||
};
|
||||
|
||||
/// An interface that yields a sequence of messages of type \a R.
|
||||
template <class R>
|
||||
class ReaderInterface {
|
||||
public:
|
||||
virtual ~ReaderInterface() {}
|
||||
|
||||
/// Get an upper bound on the next message size available for reading on this
|
||||
/// stream.
|
||||
virtual bool NextMessageSize(uint32_t* sz) = 0;
|
||||
|
||||
/// Block to read a message and parse to \a msg. Returns \a true on success.
|
||||
/// This is thread-safe with respect to \a Write or \WritesDone methods on
|
||||
/// the same stream. It should not be called concurrently with another \a
|
||||
/// Read on the same stream as the order of delivery will not be defined.
|
||||
///
|
||||
/// \param[out] msg The read message.
|
||||
///
|
||||
/// \return \a false when there will be no more incoming messages, either
|
||||
/// because the other side has called \a WritesDone() or the stream has failed
|
||||
/// (or been cancelled).
|
||||
virtual bool Read(R* msg) = 0;
|
||||
};
|
||||
|
||||
/// An interface that can be fed a sequence of messages of type \a W.
|
||||
template <class W>
|
||||
class WriterInterface {
|
||||
public:
|
||||
virtual ~WriterInterface() {}
|
||||
|
||||
/// Block to write \a msg to the stream with WriteOptions \a options.
|
||||
/// This is thread-safe with respect to \a ReaderInterface::Read
|
||||
///
|
||||
/// \param msg The message to be written to the stream.
|
||||
/// \param options The WriteOptions affecting the write operation.
|
||||
///
|
||||
/// \return \a true on success, \a false when the stream has been closed.
|
||||
virtual bool Write(const W& msg, WriteOptions options) = 0;
|
||||
|
||||
/// Block to write \a msg to the stream with default write options.
|
||||
/// This is thread-safe with respect to \a ReaderInterface::Read
|
||||
///
|
||||
/// \param msg The message to be written to the stream.
|
||||
///
|
||||
/// \return \a true on success, \a false when the stream has been closed.
|
||||
inline bool Write(const W& msg) { return Write(msg, WriteOptions()); }
|
||||
|
||||
/// Write \a msg and coalesce it with the writing of trailing metadata, using
|
||||
/// WriteOptions \a options.
|
||||
///
|
||||
/// For client, WriteLast is equivalent of performing Write and WritesDone in
|
||||
/// a single step. \a msg and trailing metadata are coalesced and sent on wire
|
||||
/// by calling this function. For server, WriteLast buffers the \a msg.
|
||||
/// The writing of \a msg is held until the service handler returns,
|
||||
/// where \a msg and trailing metadata are coalesced and sent on wire.
|
||||
/// Note that WriteLast can only buffer \a msg up to the flow control window
|
||||
/// size. If \a msg size is larger than the window size, it will be sent on
|
||||
/// wire without buffering.
|
||||
///
|
||||
/// \param[in] msg The message to be written to the stream.
|
||||
/// \param[in] options The WriteOptions to be used to write this message.
|
||||
void WriteLast(const W& msg, WriteOptions options) {
|
||||
Write(msg, options.set_last_message());
|
||||
}
|
||||
};
|
||||
|
||||
/// Client-side interface for streaming reads of message of type \a R.
|
||||
template <class R>
|
||||
class ClientReaderInterface : public ClientStreamingInterface,
|
||||
public ReaderInterface<R> {
|
||||
public:
|
||||
/// Block to wait for initial metadata from server. The received metadata
|
||||
/// can only be accessed after this call returns. Should only be called before
|
||||
/// the first read. Calling this method is optional, and if it is not called
|
||||
/// the metadata will be available in ClientContext after the first read.
|
||||
virtual void WaitForInitialMetadata() = 0;
|
||||
};
|
||||
|
||||
/// Synchronous (blocking) client-side API for doing server-streaming RPCs,
|
||||
/// where the stream of messages coming from the server has messages
|
||||
/// of type \a R.
|
||||
template <class R>
|
||||
class ClientReader final : public ClientReaderInterface<R> {
|
||||
public:
|
||||
/// Block to create a stream and write the initial metadata and \a request
|
||||
/// out. Note that \a context will be used to fill in custom initial
|
||||
/// metadata used to send to the server when starting the call.
|
||||
template <class W>
|
||||
ClientReader(ChannelInterface* channel, const RpcMethod& method,
|
||||
ClientContext* context, const W& request)
|
||||
: context_(context),
|
||||
cq_(grpc_completion_queue_attributes{
|
||||
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
|
||||
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
|
||||
call_(channel->CreateCall(method, context, &cq_)) {
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpClientSendClose>
|
||||
ops;
|
||||
ops.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
// TODO(ctiller): don't assert
|
||||
GPR_CODEGEN_ASSERT(ops.SendMessage(request).ok());
|
||||
ops.ClientSendClose();
|
||||
call_.PerformOps(&ops);
|
||||
cq_.Pluck(&ops);
|
||||
}
|
||||
|
||||
/// See the \a ClientStreamingInterface.WaitForInitialMetadata method for
|
||||
/// semantics.
|
||||
///
|
||||
// Side effect:
|
||||
/// Once complete, the initial metadata read from
|
||||
/// the server will be accessable through the \a ClientContext used to
|
||||
/// construct this object.
|
||||
void WaitForInitialMetadata() override {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
CallOpSet<CallOpRecvInitialMetadata> ops;
|
||||
ops.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&ops);
|
||||
cq_.Pluck(&ops); /// status ignored
|
||||
}
|
||||
|
||||
bool NextMessageSize(uint32_t* sz) override {
|
||||
*sz = call_.max_receive_message_size();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// See the \a ReaderInterface.Read method for semantics.
|
||||
/// Side effect:
|
||||
/// This also receives initial metadata from the server, if not
|
||||
/// already received (if initial metadata is received, it can be then
|
||||
/// accessed through the \a ClientContext associated with this call).
|
||||
bool Read(R* msg) override {
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> ops;
|
||||
if (!context_->initial_metadata_received_) {
|
||||
ops.RecvInitialMetadata(context_);
|
||||
}
|
||||
ops.RecvMessage(msg);
|
||||
call_.PerformOps(&ops);
|
||||
return cq_.Pluck(&ops) && ops.got_message;
|
||||
}
|
||||
|
||||
/// See the \a ClientStreamingInterface.Finish method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// The \a ClientContext associated with this call is updated with
|
||||
/// possible metadata received from the server.
|
||||
Status Finish() override {
|
||||
CallOpSet<CallOpClientRecvStatus> ops;
|
||||
Status status;
|
||||
ops.ClientRecvStatus(context_, &status);
|
||||
call_.PerformOps(&ops);
|
||||
GPR_CODEGEN_ASSERT(cq_.Pluck(&ops));
|
||||
return status;
|
||||
}
|
||||
|
||||
private:
|
||||
ClientContext* context_;
|
||||
CompletionQueue cq_;
|
||||
Call call_;
|
||||
};
|
||||
|
||||
/// Client-side interface for streaming writes of message type \a W.
|
||||
template <class W>
|
||||
class ClientWriterInterface : public ClientStreamingInterface,
|
||||
public WriterInterface<W> {
|
||||
public:
|
||||
/// Half close writing from the client. (signal that the stream of messages
|
||||
/// coming from the clinet is complete).
|
||||
/// Blocks until currently-pending writes are completed.
|
||||
/// Thread safe with respect to \a ReaderInterface::Read operations only
|
||||
///
|
||||
/// \return Whether the writes were successful.
|
||||
virtual bool WritesDone() = 0;
|
||||
};
|
||||
|
||||
/// Synchronous (blocking) client-side API for doing client-streaming RPCs,
|
||||
/// where the outgoing message stream coming from the client has messages of
|
||||
/// type \a W.
|
||||
template <class W>
|
||||
class ClientWriter : public ClientWriterInterface<W> {
|
||||
public:
|
||||
/// Block to create a stream (i.e. send request headers and other initial
|
||||
/// metadata to the server). Note that \a context will be used to fill
|
||||
/// in custom initial metadata. \a response will be filled in with the
|
||||
/// single expected response message from the server upon a successful
|
||||
/// call to the \a Finish method of this instance.
|
||||
template <class R>
|
||||
ClientWriter(ChannelInterface* channel, const RpcMethod& method,
|
||||
ClientContext* context, R* response)
|
||||
: context_(context),
|
||||
cq_(grpc_completion_queue_attributes{
|
||||
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
|
||||
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
|
||||
call_(channel->CreateCall(method, context, &cq_)) {
|
||||
finish_ops_.RecvMessage(response);
|
||||
finish_ops_.AllowNoMessage();
|
||||
|
||||
if (!context_->initial_metadata_corked_) {
|
||||
CallOpSet<CallOpSendInitialMetadata> ops;
|
||||
ops.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
call_.PerformOps(&ops);
|
||||
cq_.Pluck(&ops);
|
||||
}
|
||||
}
|
||||
|
||||
/// See the \a ClientStreamingInterface.WaitForInitialMetadata method for
|
||||
/// semantics.
|
||||
///
|
||||
// Side effect:
|
||||
/// Once complete, the initial metadata read from the server will be
|
||||
/// accessable through the \a ClientContext used to construct this object.
|
||||
void WaitForInitialMetadata() {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
CallOpSet<CallOpRecvInitialMetadata> ops;
|
||||
ops.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&ops);
|
||||
cq_.Pluck(&ops); // status ignored
|
||||
}
|
||||
|
||||
/// See the WriterInterface.Write(const W& msg, WriteOptions options) method
|
||||
/// for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// Also sends initial metadata if not already sent (using the
|
||||
/// \a ClientContext associated with this call).
|
||||
using WriterInterface<W>::Write;
|
||||
bool Write(const W& msg, WriteOptions options) override {
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpClientSendClose>
|
||||
ops;
|
||||
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
ops.ClientSendClose();
|
||||
}
|
||||
if (context_->initial_metadata_corked_) {
|
||||
ops.SendInitialMetadata(context_->send_initial_metadata_,
|
||||
context_->initial_metadata_flags());
|
||||
context_->set_initial_metadata_corked(false);
|
||||
}
|
||||
if (!ops.SendMessage(msg, options).ok()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
call_.PerformOps(&ops);
|
||||
return cq_.Pluck(&ops);
|
||||
}
|
||||
|
||||
bool WritesDone() override {
|
||||
CallOpSet<CallOpClientSendClose> ops;
|
||||
ops.ClientSendClose();
|
||||
call_.PerformOps(&ops);
|
||||
return cq_.Pluck(&ops);
|
||||
}
|
||||
|
||||
/// See the ClientStreamingInterface.Finish method for semantics.
|
||||
/// Side effects:
|
||||
/// - Also receives initial metadata if not already received.
|
||||
/// - Attempts to fill in the \a response parameter passed
|
||||
/// to the constructor of this instance with the response
|
||||
/// message from the server.
|
||||
Status Finish() override {
|
||||
Status status;
|
||||
if (!context_->initial_metadata_received_) {
|
||||
finish_ops_.RecvInitialMetadata(context_);
|
||||
}
|
||||
finish_ops_.ClientRecvStatus(context_, &status);
|
||||
call_.PerformOps(&finish_ops_);
|
||||
GPR_CODEGEN_ASSERT(cq_.Pluck(&finish_ops_));
|
||||
return status;
|
||||
}
|
||||
|
||||
private:
|
||||
ClientContext* context_;
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage,
|
||||
CallOpClientRecvStatus>
|
||||
finish_ops_;
|
||||
CompletionQueue cq_;
|
||||
Call call_;
|
||||
};
|
||||
|
||||
/// Client-side interface for bi-directional streaming with
|
||||
/// client-to-server stream messages of type \a W and
|
||||
/// server-to-client stream messages of type \a R.
|
||||
template <class W, class R>
|
||||
class ClientReaderWriterInterface : public ClientStreamingInterface,
|
||||
public WriterInterface<W>,
|
||||
public ReaderInterface<R> {
|
||||
public:
|
||||
/// Block to wait for initial metadata from server. The received metadata
|
||||
/// can only be accessed after this call returns. Should only be called before
|
||||
/// the first read. Calling this method is optional, and if it is not called
|
||||
/// the metadata will be available in ClientContext after the first read.
|
||||
virtual void WaitForInitialMetadata() = 0;
|
||||
|
||||
/// Half close writing from the client. (signal that the stream of messages
|
||||
/// coming from the clinet is complete).
|
||||
/// Blocks until currently-pending writes are completed.
|
||||
/// Thread-safe with respect to \a ReaderInterface::Read
|
||||
///
|
||||
/// \return Whether the writes were successful.
|
||||
virtual bool WritesDone() = 0;
|
||||
};
|
||||
|
||||
/// Synchronous (blocking) client-side API for bi-directional streaming RPCs,
|
||||
/// where the outgoing message stream coming from the client has messages of
|
||||
/// type \a W, and the incoming messages stream coming from the server has
|
||||
/// messages of type \a R.
|
||||
template <class W, class R>
|
||||
class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
|
||||
public:
|
||||
/// Block to create a stream and write the initial metadata and \a request
|
||||
/// out. Note that \a context will be used to fill in custom initial metadata
|
||||
/// used to send to the server when starting the call.
|
||||
ClientReaderWriter(ChannelInterface* channel, const RpcMethod& method,
|
||||
ClientContext* context)
|
||||
: context_(context),
|
||||
cq_(grpc_completion_queue_attributes{
|
||||
GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK,
|
||||
GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq
|
||||
call_(channel->CreateCall(method, context, &cq_)) {
|
||||
if (!context_->initial_metadata_corked_) {
|
||||
CallOpSet<CallOpSendInitialMetadata> ops;
|
||||
ops.SendInitialMetadata(context->send_initial_metadata_,
|
||||
context->initial_metadata_flags());
|
||||
call_.PerformOps(&ops);
|
||||
cq_.Pluck(&ops);
|
||||
}
|
||||
}
|
||||
|
||||
/// Block waiting to read initial metadata from the server.
|
||||
/// This call is optional, but if it is used, it cannot be used concurrently
|
||||
/// with or after the \a Finish method.
|
||||
///
|
||||
/// Once complete, the initial metadata read from the server will be
|
||||
/// accessable through the \a ClientContext used to construct this object.
|
||||
void WaitForInitialMetadata() override {
|
||||
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
|
||||
|
||||
CallOpSet<CallOpRecvInitialMetadata> ops;
|
||||
ops.RecvInitialMetadata(context_);
|
||||
call_.PerformOps(&ops);
|
||||
cq_.Pluck(&ops); // status ignored
|
||||
}
|
||||
|
||||
bool NextMessageSize(uint32_t* sz) override {
|
||||
*sz = call_.max_receive_message_size();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// See the \a ReaderInterface.Read method for semantics.
|
||||
/// Side effect:
|
||||
/// Also receives initial metadata if not already received (updates the \a
|
||||
/// ClientContext associated with this call in that case).
|
||||
bool Read(R* msg) override {
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> ops;
|
||||
if (!context_->initial_metadata_received_) {
|
||||
ops.RecvInitialMetadata(context_);
|
||||
}
|
||||
ops.RecvMessage(msg);
|
||||
call_.PerformOps(&ops);
|
||||
return cq_.Pluck(&ops) && ops.got_message;
|
||||
}
|
||||
|
||||
/// See the \a WriterInterface.Write method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// Also sends initial metadata if not already sent (using the
|
||||
/// \a ClientContext associated with this call to fill in values).
|
||||
using WriterInterface<W>::Write;
|
||||
bool Write(const W& msg, WriteOptions options) override {
|
||||
CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
|
||||
CallOpClientSendClose>
|
||||
ops;
|
||||
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
ops.ClientSendClose();
|
||||
}
|
||||
if (context_->initial_metadata_corked_) {
|
||||
ops.SendInitialMetadata(context_->send_initial_metadata_,
|
||||
context_->initial_metadata_flags());
|
||||
context_->set_initial_metadata_corked(false);
|
||||
}
|
||||
if (!ops.SendMessage(msg, options).ok()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
call_.PerformOps(&ops);
|
||||
return cq_.Pluck(&ops);
|
||||
}
|
||||
|
||||
bool WritesDone() override {
|
||||
CallOpSet<CallOpClientSendClose> ops;
|
||||
ops.ClientSendClose();
|
||||
call_.PerformOps(&ops);
|
||||
return cq_.Pluck(&ops);
|
||||
}
|
||||
|
||||
/// See the ClientStreamingInterface.Finish method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// - the \a ClientContext associated with this call is updated with
|
||||
/// possible trailing metadata sent from the server.
|
||||
Status Finish() override {
|
||||
CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> ops;
|
||||
if (!context_->initial_metadata_received_) {
|
||||
ops.RecvInitialMetadata(context_);
|
||||
}
|
||||
Status status;
|
||||
ops.ClientRecvStatus(context_, &status);
|
||||
call_.PerformOps(&ops);
|
||||
GPR_CODEGEN_ASSERT(cq_.Pluck(&ops));
|
||||
return status;
|
||||
}
|
||||
|
||||
private:
|
||||
ClientContext* context_;
|
||||
CompletionQueue cq_;
|
||||
Call call_;
|
||||
};
|
||||
|
||||
/// Server-side interface for streaming reads of message of type \a R.
|
||||
template <class R>
|
||||
class ServerReaderInterface : public ServerStreamingInterface,
|
||||
public ReaderInterface<R> {};
|
||||
|
||||
/// Synchronous (blocking) server-side API for doing client-streaming RPCs,
|
||||
/// where the incoming message stream coming from the client has messages of
|
||||
/// type \a R.
|
||||
template <class R>
|
||||
class ServerReader final : public ServerReaderInterface<R> {
|
||||
public:
|
||||
ServerReader(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {}
|
||||
|
||||
/// See the \a ServerStreamingInterface.SendInitialMetadata method
|
||||
/// for semantics. Note that initial metadata will be affected by the
|
||||
/// \a ServerContext associated with this call.
|
||||
void SendInitialMetadata() override {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
CallOpSet<CallOpSendInitialMetadata> ops;
|
||||
ops.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ops.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_->PerformOps(&ops);
|
||||
call_->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
bool NextMessageSize(uint32_t* sz) override {
|
||||
*sz = call_->max_receive_message_size();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Read(R* msg) override {
|
||||
CallOpSet<CallOpRecvMessage<R>> ops;
|
||||
ops.RecvMessage(msg);
|
||||
call_->PerformOps(&ops);
|
||||
return call_->cq()->Pluck(&ops) && ops.got_message;
|
||||
}
|
||||
|
||||
private:
|
||||
Call* const call_;
|
||||
ServerContext* const ctx_;
|
||||
};
|
||||
|
||||
/// Server-side interface for streaming writes of message of type \a W.
|
||||
template <class W>
|
||||
class ServerWriterInterface : public ServerStreamingInterface,
|
||||
public WriterInterface<W> {};
|
||||
|
||||
/// Synchronous (blocking) server-side API for doing for doing a
|
||||
/// server-streaming RPCs, where the outgoing message stream coming from the
|
||||
/// server has messages of type \a W.
|
||||
template <class W>
|
||||
class ServerWriter final : public ServerWriterInterface<W> {
|
||||
public:
|
||||
ServerWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {}
|
||||
|
||||
/// See the \a ServerStreamingInterface.SendInitialMetadata method
|
||||
/// for semantics.
|
||||
/// Note that initial metadata will be affected by the
|
||||
/// \a ServerContext associated with this call.
|
||||
void SendInitialMetadata() override {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
CallOpSet<CallOpSendInitialMetadata> ops;
|
||||
ops.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ops.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_->PerformOps(&ops);
|
||||
call_->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
/// See the \a WriterInterface.Write method for semantics.
|
||||
///
|
||||
/// Side effect:
|
||||
/// Also sends initial metadata if not already sent (using the
|
||||
/// \a ClientContext associated with this call to fill in values).
|
||||
using WriterInterface<W>::Write;
|
||||
bool Write(const W& msg, WriteOptions options) override {
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
}
|
||||
if (!ctx_->pending_ops_.SendMessage(msg, options).ok()) {
|
||||
return false;
|
||||
}
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
ctx_->pending_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ctx_->pending_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
call_->PerformOps(&ctx_->pending_ops_);
|
||||
// if this is the last message we defer the pluck until AFTER we start
|
||||
// the trailing md op. This prevents hangs. See
|
||||
// https://github.com/grpc/grpc/issues/11546
|
||||
if (options.is_last_message()) {
|
||||
ctx_->has_pending_ops_ = true;
|
||||
return true;
|
||||
}
|
||||
ctx_->has_pending_ops_ = false;
|
||||
return call_->cq()->Pluck(&ctx_->pending_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
Call* const call_;
|
||||
ServerContext* const ctx_;
|
||||
};
|
||||
|
||||
/// Server-side interface for bi-directional streaming.
|
||||
template <class W, class R>
|
||||
class ServerReaderWriterInterface : public ServerStreamingInterface,
|
||||
public WriterInterface<W>,
|
||||
public ReaderInterface<R> {};
|
||||
|
||||
/// Actual implementation of bi-directional streaming
|
||||
namespace internal {
|
||||
template <class W, class R>
|
||||
class ServerReaderWriterBody final {
|
||||
public:
|
||||
ServerReaderWriterBody(Call* call, ServerContext* ctx)
|
||||
: call_(call), ctx_(ctx) {}
|
||||
|
||||
void SendInitialMetadata() {
|
||||
GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_);
|
||||
|
||||
CallOpSet<CallOpSendInitialMetadata> ops;
|
||||
ops.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ops.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
call_->PerformOps(&ops);
|
||||
call_->cq()->Pluck(&ops);
|
||||
}
|
||||
|
||||
bool NextMessageSize(uint32_t* sz) {
|
||||
*sz = call_->max_receive_message_size();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Read(R* msg) {
|
||||
CallOpSet<CallOpRecvMessage<R>> ops;
|
||||
ops.RecvMessage(msg);
|
||||
call_->PerformOps(&ops);
|
||||
return call_->cq()->Pluck(&ops) && ops.got_message;
|
||||
}
|
||||
|
||||
bool Write(const W& msg, WriteOptions options) {
|
||||
if (options.is_last_message()) {
|
||||
options.set_buffer_hint();
|
||||
}
|
||||
if (!ctx_->pending_ops_.SendMessage(msg, options).ok()) {
|
||||
return false;
|
||||
}
|
||||
if (!ctx_->sent_initial_metadata_) {
|
||||
ctx_->pending_ops_.SendInitialMetadata(ctx_->initial_metadata_,
|
||||
ctx_->initial_metadata_flags());
|
||||
if (ctx_->compression_level_set()) {
|
||||
ctx_->pending_ops_.set_compression_level(ctx_->compression_level());
|
||||
}
|
||||
ctx_->sent_initial_metadata_ = true;
|
||||
}
|
||||
call_->PerformOps(&ctx_->pending_ops_);
|
||||
// if this is the last message we defer the pluck until AFTER we start
|
||||
// the trailing md op. This prevents hangs. See
|
||||
// https://github.com/grpc/grpc/issues/11546
|
||||
if (options.is_last_message()) {
|
||||
ctx_->has_pending_ops_ = true;
|
||||
return true;
|
||||
}
|
||||
ctx_->has_pending_ops_ = false;
|
||||
return call_->cq()->Pluck(&ctx_->pending_ops_);
|
||||
}
|
||||
|
||||
private:
|
||||
Call* const call_;
|
||||
ServerContext* const ctx_;
|
||||
};
|
||||
} // namespace internal
|
||||
|
||||
/// Synchronous (blocking) server-side API for a bidirectional
|
||||
/// streaming call, where the incoming message stream coming from the client has
|
||||
/// messages of type \a R, and the outgoing message streaming coming from
|
||||
/// the server has messages of type \a W.
|
||||
template <class W, class R>
|
||||
class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> {
|
||||
public:
|
||||
ServerReaderWriter(Call* call, ServerContext* ctx) : body_(call, ctx) {}
|
||||
|
||||
/// See the \a ServerStreamingInterface.SendInitialMetadata method
|
||||
/// for semantics. Note that initial metadata will be affected by the
|
||||
/// \a ServerContext associated with this call.
|
||||
void SendInitialMetadata() override { body_.SendInitialMetadata(); }
|
||||
|
||||
bool NextMessageSize(uint32_t* sz) override {
|
||||
return body_.NextMessageSize(sz);
|
||||
}
|
||||
|
||||
bool Read(R* msg) override { return body_.Read(msg); }
|
||||
|
||||
/// See the \a WriterInterface.Write(const W& msg, WriteOptions options)
|
||||
/// method for semantics.
|
||||
/// Side effect:
|
||||
/// Also sends initial metadata if not already sent (using the \a
|
||||
/// ServerContext associated with this call).
|
||||
using WriterInterface<W>::Write;
|
||||
bool Write(const W& msg, WriteOptions options) override {
|
||||
return body_.Write(msg, options);
|
||||
}
|
||||
|
||||
private:
|
||||
internal::ServerReaderWriterBody<W, R> body_;
|
||||
};
|
||||
|
||||
/// A class to represent a flow-controlled unary call. This is something
|
||||
/// of a hybrid between conventional unary and streaming. This is invoked
|
||||
/// through a unary call on the client side, but the server responds to it
|
||||
/// as though it were a single-ping-pong streaming call. The server can use
|
||||
/// the \a NextMessageSize method to determine an upper-bound on the size of
|
||||
/// the message. A key difference relative to streaming: ServerUnaryStreamer
|
||||
/// must have exactly 1 Read and exactly 1 Write, in that order, to function
|
||||
/// correctly. Otherwise, the RPC is in error.
|
||||
template <class RequestType, class ResponseType>
|
||||
class ServerUnaryStreamer final
|
||||
: public ServerReaderWriterInterface<ResponseType, RequestType> {
|
||||
public:
|
||||
ServerUnaryStreamer(Call* call, ServerContext* ctx)
|
||||
: body_(call, ctx), read_done_(false), write_done_(false) {}
|
||||
|
||||
/// Block to send initial metadata to client.
|
||||
/// Implicit input parameter:
|
||||
/// - the \a ServerContext associated with this call will be used for
|
||||
/// sending initial metadata.
|
||||
void SendInitialMetadata() override { body_.SendInitialMetadata(); }
|
||||
|
||||
/// Get an upper bound on the request message size from the client.
|
||||
bool NextMessageSize(uint32_t* sz) override {
|
||||
return body_.NextMessageSize(sz);
|
||||
}
|
||||
|
||||
/// Read a message of type \a R into \a msg. Completion will be notified by \a
|
||||
/// tag on the associated completion queue.
|
||||
/// This is thread-safe with respect to \a Write or \a WritesDone methods. It
|
||||
/// should not be called concurrently with other streaming APIs
|
||||
/// on the same stream. It is not meaningful to call it concurrently
|
||||
/// with another \a ReaderInterface::Read on the same stream since reads on
|
||||
/// the same stream are delivered in order.
|
||||
///
|
||||
/// \param[out] msg Where to eventually store the read message.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
bool Read(RequestType* request) override {
|
||||
if (read_done_) {
|
||||
return false;
|
||||
}
|
||||
read_done_ = true;
|
||||
return body_.Read(request);
|
||||
}
|
||||
|
||||
/// Block to write \a msg to the stream with WriteOptions \a options.
|
||||
/// This is thread-safe with respect to \a ReaderInterface::Read
|
||||
///
|
||||
/// \param msg The message to be written to the stream.
|
||||
/// \param options The WriteOptions affecting the write operation.
|
||||
///
|
||||
/// \return \a true on success, \a false when the stream has been closed.
|
||||
using WriterInterface<ResponseType>::Write;
|
||||
bool Write(const ResponseType& response, WriteOptions options) override {
|
||||
if (write_done_ || !read_done_) {
|
||||
return false;
|
||||
}
|
||||
write_done_ = true;
|
||||
return body_.Write(response, options);
|
||||
}
|
||||
|
||||
private:
|
||||
internal::ServerReaderWriterBody<ResponseType, RequestType> body_;
|
||||
bool read_done_;
|
||||
bool write_done_;
|
||||
};
|
||||
|
||||
/// A class to represent a flow-controlled server-side streaming call.
|
||||
/// This is something of a hybrid between server-side and bidi streaming.
|
||||
/// This is invoked through a server-side streaming call on the client side,
|
||||
/// but the server responds to it as though it were a bidi streaming call that
|
||||
/// must first have exactly 1 Read and then any number of Writes.
|
||||
template <class RequestType, class ResponseType>
|
||||
class ServerSplitStreamer final
|
||||
: public ServerReaderWriterInterface<ResponseType, RequestType> {
|
||||
public:
|
||||
ServerSplitStreamer(Call* call, ServerContext* ctx)
|
||||
: body_(call, ctx), read_done_(false) {}
|
||||
|
||||
/// Block to send initial metadata to client.
|
||||
/// Implicit input parameter:
|
||||
/// - the \a ServerContext associated with this call will be used for
|
||||
/// sending initial metadata.
|
||||
void SendInitialMetadata() override { body_.SendInitialMetadata(); }
|
||||
|
||||
/// Get an upper bound on the request message size from the client.
|
||||
bool NextMessageSize(uint32_t* sz) override {
|
||||
return body_.NextMessageSize(sz);
|
||||
}
|
||||
|
||||
/// Read a message of type \a R into \a msg. Completion will be notified by \a
|
||||
/// tag on the associated completion queue.
|
||||
/// This is thread-safe with respect to \a Write or \a WritesDone methods. It
|
||||
/// should not be called concurrently with other streaming APIs
|
||||
/// on the same stream. It is not meaningful to call it concurrently
|
||||
/// with another \a ReaderInterface::Read on the same stream since reads on
|
||||
/// the same stream are delivered in order.
|
||||
///
|
||||
/// \param[out] msg Where to eventually store the read message.
|
||||
/// \param[in] tag The tag identifying the operation.
|
||||
bool Read(RequestType* request) override {
|
||||
if (read_done_) {
|
||||
return false;
|
||||
}
|
||||
read_done_ = true;
|
||||
return body_.Read(request);
|
||||
}
|
||||
|
||||
/// Block to write \a msg to the stream with WriteOptions \a options.
|
||||
/// This is thread-safe with respect to \a ReaderInterface::Read
|
||||
///
|
||||
/// \param msg The message to be written to the stream.
|
||||
/// \param options The WriteOptions affecting the write operation.
|
||||
///
|
||||
/// \return \a true on success, \a false when the stream has been closed.
|
||||
using WriterInterface<ResponseType>::Write;
|
||||
bool Write(const ResponseType& response, WriteOptions options) override {
|
||||
return read_done_ && body_.Write(response, options);
|
||||
}
|
||||
|
||||
private:
|
||||
internal::ServerReaderWriterBody<ResponseType, RequestType> body_;
|
||||
bool read_done_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H
|
||||
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_CODEGEN_TIME_H
|
||||
#define GRPCXX_IMPL_CODEGEN_TIME_H
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/** If you are trying to use CompletionQueue::AsyncNext with a time class that
|
||||
isn't either gpr_timespec or std::chrono::system_clock::time_point, you
|
||||
will most likely be looking at this comment as your compiler will have
|
||||
fired an error below. In order to fix this issue, you have two potential
|
||||
solutions:
|
||||
|
||||
1. Use gpr_timespec or std::chrono::system_clock::time_point instead
|
||||
2. Specialize the TimePoint class with whichever time class that you
|
||||
want to use here. See below for two examples of how to do this.
|
||||
*/
|
||||
template <typename T>
|
||||
class TimePoint {
|
||||
public:
|
||||
TimePoint(const T& time) { you_need_a_specialization_of_TimePoint(); }
|
||||
gpr_timespec raw_time() {
|
||||
gpr_timespec t;
|
||||
return t;
|
||||
}
|
||||
|
||||
private:
|
||||
void you_need_a_specialization_of_TimePoint();
|
||||
};
|
||||
|
||||
template <>
|
||||
class TimePoint<gpr_timespec> {
|
||||
public:
|
||||
TimePoint(const gpr_timespec& time) : time_(time) {}
|
||||
gpr_timespec raw_time() { return time_; }
|
||||
|
||||
private:
|
||||
gpr_timespec time_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#include <chrono>
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
// from and to should be absolute time.
|
||||
void Timepoint2Timespec(const std::chrono::system_clock::time_point& from,
|
||||
gpr_timespec* to);
|
||||
void TimepointHR2Timespec(
|
||||
const std::chrono::high_resolution_clock::time_point& from,
|
||||
gpr_timespec* to);
|
||||
|
||||
std::chrono::system_clock::time_point Timespec2Timepoint(gpr_timespec t);
|
||||
|
||||
template <>
|
||||
class TimePoint<std::chrono::system_clock::time_point> {
|
||||
public:
|
||||
TimePoint(const std::chrono::system_clock::time_point& time) {
|
||||
Timepoint2Timespec(time, &time_);
|
||||
}
|
||||
gpr_timespec raw_time() const { return time_; }
|
||||
|
||||
private:
|
||||
gpr_timespec time_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_CODEGEN_TIME_H
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_GRPC_LIBRARY_H
|
||||
#define GRPCXX_IMPL_GRPC_LIBRARY_H
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/core_codegen.h>
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
namespace internal {
|
||||
class GrpcLibrary final : public GrpcLibraryInterface {
|
||||
public:
|
||||
void init() override { grpc_init(); }
|
||||
void shutdown() override { grpc_shutdown(); }
|
||||
};
|
||||
|
||||
static GrpcLibrary g_gli;
|
||||
static CoreCodegen g_core_codegen;
|
||||
|
||||
/// Instantiating this class ensures the proper initialization of gRPC.
|
||||
class GrpcLibraryInitializer final {
|
||||
public:
|
||||
GrpcLibraryInitializer() {
|
||||
if (grpc::g_glip == nullptr) {
|
||||
grpc::g_glip = &g_gli;
|
||||
}
|
||||
if (grpc::g_core_codegen_interface == nullptr) {
|
||||
grpc::g_core_codegen_interface = &g_core_codegen;
|
||||
}
|
||||
}
|
||||
|
||||
/// A no-op method to force the linker to reference this class, which will
|
||||
/// take care of initializing and shutting down the gRPC runtime.
|
||||
int summon() { return 0; }
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_GRPC_LIBRARY_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_METHOD_HANDLER_IMPL_H
|
||||
#define GRPCXX_IMPL_METHOD_HANDLER_IMPL_H
|
||||
|
||||
#include <grpc++/impl/codegen/method_handler_impl.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_METHOD_HANDLER_IMPL_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_RPC_METHOD_H
|
||||
#define GRPCXX_IMPL_RPC_METHOD_H
|
||||
|
||||
#include <grpc++/impl/codegen/rpc_method.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_RPC_METHOD_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_RPC_SERVICE_METHOD_H
|
||||
#define GRPCXX_IMPL_RPC_SERVICE_METHOD_H
|
||||
|
||||
#include <grpc++/impl/codegen/rpc_service_method.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_RPC_SERVICE_METHOD_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_SERIALIZATION_TRAITS_H
|
||||
#define GRPCXX_IMPL_SERIALIZATION_TRAITS_H
|
||||
|
||||
#include <grpc++/impl/codegen/serialization_traits.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_SERIALIZATION_TRAITS_H
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_SERVER_BUILDER_OPTION_H
|
||||
#define GRPCXX_IMPL_SERVER_BUILDER_OPTION_H
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/server_builder_plugin.h>
|
||||
#include <grpc++/support/channel_arguments.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Interface to pass an option to a \a ServerBuilder.
|
||||
class ServerBuilderOption {
|
||||
public:
|
||||
virtual ~ServerBuilderOption() {}
|
||||
/// Alter the \a ChannelArguments used to create the gRPC server.
|
||||
virtual void UpdateArguments(ChannelArguments* args) = 0;
|
||||
/// Alter the ServerBuilderPlugin map that will be added into ServerBuilder.
|
||||
virtual void UpdatePlugins(
|
||||
std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins) = 0;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_SERVER_BUILDER_OPTION_H
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H
|
||||
#define GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/support/config.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class ServerBuilder;
|
||||
class ServerInitializer;
|
||||
class ChannelArguments;
|
||||
|
||||
/// This interface is meant for internal usage only. Implementations of this
|
||||
/// interface should add themselves to a \a ServerBuilder instance through the
|
||||
/// \a InternalAddPluginFactory method.
|
||||
class ServerBuilderPlugin {
|
||||
public:
|
||||
virtual ~ServerBuilderPlugin() {}
|
||||
virtual grpc::string name() = 0;
|
||||
|
||||
/// UpdateServerBuilder will be called at the beginning of
|
||||
/// \a ServerBuilder::BuildAndStart().
|
||||
virtual void UpdateServerBuilder(ServerBuilder* builder) {}
|
||||
|
||||
/// InitServer will be called in ServerBuilder::BuildAndStart(), after the
|
||||
/// Server instance is created.
|
||||
virtual void InitServer(ServerInitializer* si) = 0;
|
||||
|
||||
/// Finish will be called at the end of ServerBuilder::BuildAndStart().
|
||||
virtual void Finish(ServerInitializer* si) = 0;
|
||||
|
||||
/// ChangeArguments is an interface that can be used in
|
||||
/// ServerBuilderOption::UpdatePlugins
|
||||
virtual void ChangeArguments(const grpc::string& name, void* value) = 0;
|
||||
|
||||
/// UpdateChannelArguments will be called in ServerBuilder::BuildAndStart(),
|
||||
/// before the Server instance is created.
|
||||
virtual void UpdateChannelArguments(ChannelArguments* args) {}
|
||||
|
||||
virtual bool has_sync_methods() const { return false; }
|
||||
virtual bool has_async_methods() const { return false; }
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_SERVER_INITIALIZER_H
|
||||
#define GRPCXX_IMPL_SERVER_INITIALIZER_H
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/server.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class Server;
|
||||
class Service;
|
||||
|
||||
class ServerInitializer {
|
||||
public:
|
||||
ServerInitializer(Server* server) : server_(server) {}
|
||||
|
||||
bool RegisterService(std::shared_ptr<Service> service) {
|
||||
if (!server_->RegisterService(nullptr, service.get())) {
|
||||
return false;
|
||||
}
|
||||
default_services_.push_back(service);
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::vector<grpc::string>* GetServiceList() {
|
||||
return &server_->services_;
|
||||
}
|
||||
|
||||
private:
|
||||
Server* server_;
|
||||
std::vector<std::shared_ptr<Service> > default_services_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_IMPL_SERVER_INITIALIZER_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_IMPL_SERVICE_TYPE_H
|
||||
#define GRPCXX_IMPL_SERVICE_TYPE_H
|
||||
|
||||
#include <grpc++/impl/codegen/service_type.h>
|
||||
|
||||
#endif // GRPCXX_IMPL_SERVICE_TYPE_H
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_RESOURCE_QUOTA_H
|
||||
#define GRPCXX_RESOURCE_QUOTA_H
|
||||
|
||||
struct grpc_resource_quota;
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// ResourceQuota represents a bound on memory usage by the gRPC library.
|
||||
/// A ResourceQuota can be attached to a server (via \a ServerBuilder),
|
||||
/// or a client channel (via \a ChannelArguments).
|
||||
/// gRPC will attempt to keep memory used by all attached entities
|
||||
/// below the ResourceQuota bound.
|
||||
class ResourceQuota final : private GrpcLibraryCodegen {
|
||||
public:
|
||||
/// \param name - a unique name for this ResourceQuota.
|
||||
explicit ResourceQuota(const grpc::string& name);
|
||||
ResourceQuota();
|
||||
~ResourceQuota();
|
||||
|
||||
/// Resize this \a ResourceQuota to a new size. If \a new_size is smaller
|
||||
/// than the current size of the pool, memory usage will be monotonically
|
||||
/// decreased until it falls under \a new_size.
|
||||
/// No time bound is given for this to occur however.
|
||||
ResourceQuota& Resize(size_t new_size);
|
||||
|
||||
grpc_resource_quota* c_resource_quota() const { return impl_; }
|
||||
|
||||
private:
|
||||
ResourceQuota(const ResourceQuota& rhs);
|
||||
ResourceQuota& operator=(const ResourceQuota& rhs);
|
||||
|
||||
grpc_resource_quota* const impl_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_RESOURCE_QUOTA_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SECURITY_AUTH_CONTEXT_H
|
||||
#define GRPCXX_SECURITY_AUTH_CONTEXT_H
|
||||
|
||||
#include <grpc++/impl/codegen/security/auth_context.h>
|
||||
|
||||
#endif // GRPCXX_SECURITY_AUTH_CONTEXT_H
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H
|
||||
#define GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H
|
||||
|
||||
#include <map>
|
||||
|
||||
#include <grpc++/security/auth_context.h>
|
||||
#include <grpc++/support/status.h>
|
||||
#include <grpc++/support/string_ref.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Interface allowing custom server-side authorization based on credentials
|
||||
/// encoded in metadata. Objects of this type can be passed to
|
||||
/// \a ServerCredentials::SetAuthMetadataProcessor().
|
||||
class AuthMetadataProcessor {
|
||||
public:
|
||||
typedef std::multimap<grpc::string_ref, grpc::string_ref> InputMetadata;
|
||||
typedef std::multimap<grpc::string, grpc::string> OutputMetadata;
|
||||
|
||||
virtual ~AuthMetadataProcessor() {}
|
||||
|
||||
/// If this method returns true, the \a Process function will be scheduled in
|
||||
/// a different thread from the one processing the call.
|
||||
virtual bool IsBlocking() const { return true; }
|
||||
|
||||
/// context is read/write: it contains the properties of the channel peer and
|
||||
/// it is the job of the Process method to augment it with properties derived
|
||||
/// from the passed-in auth_metadata.
|
||||
/// consumed_auth_metadata needs to be filled with metadata that has been
|
||||
/// consumed by the processor and will be removed from the call.
|
||||
/// response_metadata is the metadata that will be sent as part of the
|
||||
/// response.
|
||||
/// If the return value is not Status::OK, the rpc call will be aborted with
|
||||
/// the error code and error message sent back to the client.
|
||||
virtual Status Process(const InputMetadata& auth_metadata,
|
||||
AuthContext* context,
|
||||
OutputMetadata* consumed_auth_metadata,
|
||||
OutputMetadata* response_metadata) = 0;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H
|
||||
@@ -1,224 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SECURITY_CREDENTIALS_H
|
||||
#define GRPCXX_SECURITY_CREDENTIALS_H
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
#include <grpc++/security/auth_context.h>
|
||||
#include <grpc++/support/status.h>
|
||||
#include <grpc++/support/string_ref.h>
|
||||
|
||||
struct grpc_call;
|
||||
|
||||
namespace grpc {
|
||||
class ChannelArguments;
|
||||
class Channel;
|
||||
class SecureChannelCredentials;
|
||||
class CallCredentials;
|
||||
class SecureCallCredentials;
|
||||
|
||||
/// A channel credentials object encapsulates all the state needed by a client
|
||||
/// to authenticate with a server for a given channel.
|
||||
/// It can make various assertions, e.g., about the client’s identity, role
|
||||
/// for all the calls on that channel.
|
||||
///
|
||||
/// \see https://grpc.io/docs/guides/auth.html
|
||||
class ChannelCredentials : private GrpcLibraryCodegen {
|
||||
public:
|
||||
ChannelCredentials();
|
||||
~ChannelCredentials();
|
||||
|
||||
protected:
|
||||
friend std::shared_ptr<ChannelCredentials> CompositeChannelCredentials(
|
||||
const std::shared_ptr<ChannelCredentials>& channel_creds,
|
||||
const std::shared_ptr<CallCredentials>& call_creds);
|
||||
|
||||
virtual SecureChannelCredentials* AsSecureCredentials() = 0;
|
||||
|
||||
private:
|
||||
friend std::shared_ptr<Channel> CreateCustomChannel(
|
||||
const grpc::string& target,
|
||||
const std::shared_ptr<ChannelCredentials>& creds,
|
||||
const ChannelArguments& args);
|
||||
|
||||
virtual std::shared_ptr<Channel> CreateChannel(
|
||||
const grpc::string& target, const ChannelArguments& args) = 0;
|
||||
};
|
||||
|
||||
/// A call credentials object encapsulates the state needed by a client to
|
||||
/// authenticate with a server for a given call on a channel.
|
||||
///
|
||||
/// \see https://grpc.io/docs/guides/auth.html
|
||||
class CallCredentials : private GrpcLibraryCodegen {
|
||||
public:
|
||||
CallCredentials();
|
||||
~CallCredentials();
|
||||
|
||||
/// Apply this instance's credentials to \a call.
|
||||
virtual bool ApplyToCall(grpc_call* call) = 0;
|
||||
|
||||
protected:
|
||||
friend std::shared_ptr<ChannelCredentials> CompositeChannelCredentials(
|
||||
const std::shared_ptr<ChannelCredentials>& channel_creds,
|
||||
const std::shared_ptr<CallCredentials>& call_creds);
|
||||
|
||||
friend std::shared_ptr<CallCredentials> CompositeCallCredentials(
|
||||
const std::shared_ptr<CallCredentials>& creds1,
|
||||
const std::shared_ptr<CallCredentials>& creds2);
|
||||
|
||||
virtual SecureCallCredentials* AsSecureCredentials() = 0;
|
||||
};
|
||||
|
||||
/// Options used to build SslCredentials.
|
||||
struct SslCredentialsOptions {
|
||||
/// The buffer containing the PEM encoding of the server root certificates. If
|
||||
/// this parameter is empty, the default roots will be used. The default
|
||||
/// roots can be overridden using the \a GRPC_DEFAULT_SSL_ROOTS_FILE_PATH
|
||||
/// environment variable pointing to a file on the file system containing the
|
||||
/// roots.
|
||||
grpc::string pem_root_certs;
|
||||
|
||||
/// The buffer containing the PEM encoding of the client's private key. This
|
||||
/// parameter can be empty if the client does not have a private key.
|
||||
grpc::string pem_private_key;
|
||||
|
||||
/// The buffer containing the PEM encoding of the client's certificate chain.
|
||||
/// This parameter can be empty if the client does not have a certificate
|
||||
/// chain.
|
||||
grpc::string pem_cert_chain;
|
||||
};
|
||||
|
||||
// Factories for building different types of Credentials The functions may
|
||||
// return empty shared_ptr when credentials cannot be created. If a
|
||||
// Credentials pointer is returned, it can still be invalid when used to create
|
||||
// a channel. A lame channel will be created then and all rpcs will fail on it.
|
||||
|
||||
/// Builds credentials with reasonable defaults.
|
||||
///
|
||||
/// \warning Only use these credentials when connecting to a Google endpoint.
|
||||
/// Using these credentials to connect to any other service may result in this
|
||||
/// service being able to impersonate your client for requests to Google
|
||||
/// services.
|
||||
std::shared_ptr<ChannelCredentials> GoogleDefaultCredentials();
|
||||
|
||||
/// Builds SSL Credentials given SSL specific options
|
||||
std::shared_ptr<ChannelCredentials> SslCredentials(
|
||||
const SslCredentialsOptions& options);
|
||||
|
||||
/// Builds credentials for use when running in GCE
|
||||
///
|
||||
/// \warning Only use these credentials when connecting to a Google endpoint.
|
||||
/// Using these credentials to connect to any other service may result in this
|
||||
/// service being able to impersonate your client for requests to Google
|
||||
/// services.
|
||||
std::shared_ptr<CallCredentials> GoogleComputeEngineCredentials();
|
||||
|
||||
/// Constant for maximum auth token lifetime.
|
||||
constexpr long kMaxAuthTokenLifetimeSecs = 3600;
|
||||
|
||||
/// Builds Service Account JWT Access credentials.
|
||||
/// json_key is the JSON key string containing the client's private key.
|
||||
/// token_lifetime_seconds is the lifetime in seconds of each Json Web Token
|
||||
/// (JWT) created with this credentials. It should not exceed
|
||||
/// \a kMaxAuthTokenLifetimeSecs or will be cropped to this value.
|
||||
std::shared_ptr<CallCredentials> ServiceAccountJWTAccessCredentials(
|
||||
const grpc::string& json_key,
|
||||
long token_lifetime_seconds = kMaxAuthTokenLifetimeSecs);
|
||||
|
||||
/// Builds refresh token credentials.
|
||||
/// json_refresh_token is the JSON string containing the refresh token along
|
||||
/// with a client_id and client_secret.
|
||||
///
|
||||
/// \warning Only use these credentials when connecting to a Google endpoint.
|
||||
/// Using these credentials to connect to any other service may result in this
|
||||
/// service being able to impersonate your client for requests to Google
|
||||
/// services.
|
||||
std::shared_ptr<CallCredentials> GoogleRefreshTokenCredentials(
|
||||
const grpc::string& json_refresh_token);
|
||||
|
||||
/// Builds access token credentials.
|
||||
/// access_token is an oauth2 access token that was fetched using an out of band
|
||||
/// mechanism.
|
||||
///
|
||||
/// \warning Only use these credentials when connecting to a Google endpoint.
|
||||
/// Using these credentials to connect to any other service may result in this
|
||||
/// service being able to impersonate your client for requests to Google
|
||||
/// services.
|
||||
std::shared_ptr<CallCredentials> AccessTokenCredentials(
|
||||
const grpc::string& access_token);
|
||||
|
||||
/// Builds IAM credentials.
|
||||
///
|
||||
/// \warning Only use these credentials when connecting to a Google endpoint.
|
||||
/// Using these credentials to connect to any other service may result in this
|
||||
/// service being able to impersonate your client for requests to Google
|
||||
/// services.
|
||||
std::shared_ptr<CallCredentials> GoogleIAMCredentials(
|
||||
const grpc::string& authorization_token,
|
||||
const grpc::string& authority_selector);
|
||||
|
||||
/// Combines a channel credentials and a call credentials into a composite
|
||||
/// channel credentials.
|
||||
std::shared_ptr<ChannelCredentials> CompositeChannelCredentials(
|
||||
const std::shared_ptr<ChannelCredentials>& channel_creds,
|
||||
const std::shared_ptr<CallCredentials>& call_creds);
|
||||
|
||||
/// Combines two call credentials objects into a composite call credentials.
|
||||
std::shared_ptr<CallCredentials> CompositeCallCredentials(
|
||||
const std::shared_ptr<CallCredentials>& creds1,
|
||||
const std::shared_ptr<CallCredentials>& creds2);
|
||||
|
||||
/// Credentials for an unencrypted, unauthenticated channel
|
||||
std::shared_ptr<ChannelCredentials> InsecureChannelCredentials();
|
||||
|
||||
/// Credentials for a channel using Cronet.
|
||||
std::shared_ptr<ChannelCredentials> CronetChannelCredentials(void* engine);
|
||||
|
||||
/// User defined metadata credentials.
|
||||
class MetadataCredentialsPlugin {
|
||||
public:
|
||||
virtual ~MetadataCredentialsPlugin() {}
|
||||
|
||||
/// If this method returns true, the Process function will be scheduled in
|
||||
/// a different thread from the one processing the call.
|
||||
virtual bool IsBlocking() const { return true; }
|
||||
|
||||
/// Type of credentials this plugin is implementing.
|
||||
virtual const char* GetType() const { return ""; }
|
||||
|
||||
/// Gets the auth metatada produced by this plugin.
|
||||
/// The fully qualified method name is:
|
||||
/// service_url + "/" + method_name.
|
||||
/// The channel_auth_context contains (among other things), the identity of
|
||||
/// the server.
|
||||
virtual Status GetMetadata(
|
||||
grpc::string_ref service_url, grpc::string_ref method_name,
|
||||
const AuthContext& channel_auth_context,
|
||||
std::multimap<grpc::string, grpc::string>* metadata) = 0;
|
||||
};
|
||||
|
||||
std::shared_ptr<CallCredentials> MetadataCredentialsFromPlugin(
|
||||
std::unique_ptr<MetadataCredentialsPlugin> plugin);
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SECURITY_CREDENTIALS_H
|
||||
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SECURITY_SERVER_CREDENTIALS_H
|
||||
#define GRPCXX_SECURITY_SERVER_CREDENTIALS_H
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/security/auth_metadata_processor.h>
|
||||
#include <grpc++/support/config.h>
|
||||
#include <grpc/grpc_security_constants.h>
|
||||
|
||||
struct grpc_server;
|
||||
|
||||
namespace grpc {
|
||||
class Server;
|
||||
|
||||
/// Wrapper around \a grpc_server_credentials, a way to authenticate a server.
|
||||
class ServerCredentials {
|
||||
public:
|
||||
virtual ~ServerCredentials();
|
||||
|
||||
/// This method is not thread-safe and has to be called before the server is
|
||||
/// started. The last call to this function wins.
|
||||
virtual void SetAuthMetadataProcessor(
|
||||
const std::shared_ptr<AuthMetadataProcessor>& processor) = 0;
|
||||
|
||||
private:
|
||||
friend class ::grpc::Server;
|
||||
|
||||
/// Tries to bind \a server to the given \a addr (eg, localhost:1234,
|
||||
/// 192.168.1.1:31416, [::1]:27182, etc.)
|
||||
///
|
||||
/// \return bound port number on sucess, 0 on failure.
|
||||
// TODO(dgq): the "port" part seems to be a misnomer.
|
||||
virtual int AddPortToServer(const grpc::string& addr,
|
||||
grpc_server* server) = 0;
|
||||
};
|
||||
|
||||
/// Options to create ServerCredentials with SSL
|
||||
struct SslServerCredentialsOptions {
|
||||
/// \warning Deprecated
|
||||
SslServerCredentialsOptions()
|
||||
: force_client_auth(false),
|
||||
client_certificate_request(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE) {}
|
||||
SslServerCredentialsOptions(
|
||||
grpc_ssl_client_certificate_request_type request_type)
|
||||
: force_client_auth(false), client_certificate_request(request_type) {}
|
||||
|
||||
struct PemKeyCertPair {
|
||||
grpc::string private_key;
|
||||
grpc::string cert_chain;
|
||||
};
|
||||
grpc::string pem_root_certs;
|
||||
std::vector<PemKeyCertPair> pem_key_cert_pairs;
|
||||
/// \warning Deprecated
|
||||
bool force_client_auth;
|
||||
|
||||
/// If both \a force_client_auth and \a client_certificate_request
|
||||
/// fields are set, \a force_client_auth takes effect, i.e.
|
||||
/// \a REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
|
||||
/// will be enforced.
|
||||
grpc_ssl_client_certificate_request_type client_certificate_request;
|
||||
};
|
||||
|
||||
/// Builds SSL ServerCredentials given SSL specific options
|
||||
std::shared_ptr<ServerCredentials> SslServerCredentials(
|
||||
const SslServerCredentialsOptions& options);
|
||||
|
||||
/// Builds insecure server credentials.
|
||||
std::shared_ptr<ServerCredentials> InsecureServerCredentials();
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SECURITY_SERVER_CREDENTIALS_H
|
||||
@@ -1,226 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SERVER_H
|
||||
#define GRPCXX_SERVER_H
|
||||
|
||||
#include <condition_variable>
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/completion_queue.h>
|
||||
#include <grpc++/impl/call.h>
|
||||
#include <grpc++/impl/codegen/grpc_library.h>
|
||||
#include <grpc++/impl/codegen/server_interface.h>
|
||||
#include <grpc++/impl/rpc_service_method.h>
|
||||
#include <grpc++/security/server_credentials.h>
|
||||
#include <grpc++/support/channel_arguments.h>
|
||||
#include <grpc++/support/config.h>
|
||||
#include <grpc++/support/status.h>
|
||||
#include <grpc/compression.h>
|
||||
|
||||
struct grpc_server;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class AsyncGenericService;
|
||||
class HealthCheckServiceInterface;
|
||||
class ServerContext;
|
||||
class ServerInitializer;
|
||||
|
||||
/// Represents a gRPC server.
|
||||
///
|
||||
/// Use a \a grpc::ServerBuilder to create, configure, and start
|
||||
/// \a Server instances.
|
||||
class Server final : public ServerInterface, private GrpcLibraryCodegen {
|
||||
public:
|
||||
~Server();
|
||||
|
||||
/// Block until the server shuts down.
|
||||
///
|
||||
/// \warning The server must be either shutting down or some other thread must
|
||||
/// call \a Shutdown for this function to ever return.
|
||||
void Wait() override;
|
||||
|
||||
/// Global callbacks are a set of hooks that are called when server
|
||||
/// events occur. \a SetGlobalCallbacks method is used to register
|
||||
/// the hooks with gRPC. Note that
|
||||
/// the \a GlobalCallbacks instance will be shared among all
|
||||
/// \a Server instances in an application and can be set exactly
|
||||
/// once per application.
|
||||
class GlobalCallbacks {
|
||||
public:
|
||||
virtual ~GlobalCallbacks() {}
|
||||
/// Called before server is created.
|
||||
virtual void UpdateArguments(ChannelArguments* args) {}
|
||||
/// Called before application callback for each synchronous server request
|
||||
virtual void PreSynchronousRequest(ServerContext* context) = 0;
|
||||
/// Called after application callback for each synchronous server request
|
||||
virtual void PostSynchronousRequest(ServerContext* context) = 0;
|
||||
/// Called before server is started.
|
||||
virtual void PreServerStart(Server* server) {}
|
||||
/// Called after a server port is added.
|
||||
virtual void AddPort(Server* server, const grpc::string& addr,
|
||||
ServerCredentials* creds, int port) {}
|
||||
};
|
||||
/// Set the global callback object. Can only be called once per application.
|
||||
/// Does not take ownership of callbacks, and expects the pointed to object
|
||||
/// to be alive until all server objects in the process have been destroyed.
|
||||
/// The same \a GlobalCallbacks object will be used throughout the
|
||||
/// application and is shared among all \a Server objects.
|
||||
static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
|
||||
|
||||
// Returns a \em raw pointer to the underlying \a grpc_server instance.
|
||||
grpc_server* c_server();
|
||||
|
||||
/// Returns the health check service.
|
||||
HealthCheckServiceInterface* GetHealthCheckService() const {
|
||||
return health_check_service_.get();
|
||||
}
|
||||
|
||||
/// Establish a channel for in-process communication
|
||||
std::shared_ptr<Channel> InProcessChannel(const ChannelArguments& args);
|
||||
|
||||
private:
|
||||
friend class AsyncGenericService;
|
||||
friend class ServerBuilder;
|
||||
friend class ServerInitializer;
|
||||
|
||||
class SyncRequest;
|
||||
class AsyncRequest;
|
||||
class ShutdownRequest;
|
||||
|
||||
/// SyncRequestThreadManager is an implementation of ThreadManager. This class
|
||||
/// is responsible for polling for incoming RPCs and calling the RPC handlers.
|
||||
/// This is only used in case of a Sync server (i.e a server exposing a sync
|
||||
/// interface)
|
||||
class SyncRequestThreadManager;
|
||||
|
||||
class UnimplementedAsyncRequestContext;
|
||||
class UnimplementedAsyncRequest;
|
||||
class UnimplementedAsyncResponse;
|
||||
|
||||
/// Server constructors. To be used by \a ServerBuilder only.
|
||||
///
|
||||
/// \param max_message_size Maximum message length that the channel can
|
||||
/// receive.
|
||||
///
|
||||
/// \param args The channel args
|
||||
///
|
||||
/// \param sync_server_cqs The completion queues to use if the server is a
|
||||
/// synchronous server (or a hybrid server). The server polls for new RPCs on
|
||||
/// these queues
|
||||
///
|
||||
/// \param min_pollers The minimum number of polling threads per server
|
||||
/// completion queue (in param sync_server_cqs) to use for listening to
|
||||
/// incoming requests (used only in case of sync server)
|
||||
///
|
||||
/// \param max_pollers The maximum number of polling threads per server
|
||||
/// completion queue (in param sync_server_cqs) to use for listening to
|
||||
/// incoming requests (used only in case of sync server)
|
||||
///
|
||||
/// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on
|
||||
/// server completion queues passed via sync_server_cqs param.
|
||||
Server(int max_message_size, ChannelArguments* args,
|
||||
std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>>
|
||||
sync_server_cqs,
|
||||
int min_pollers, int max_pollers, int sync_cq_timeout_msec);
|
||||
|
||||
/// Register a service. This call does not take ownership of the service.
|
||||
/// The service must exist for the lifetime of the Server instance.
|
||||
bool RegisterService(const grpc::string* host, Service* service) override;
|
||||
|
||||
/// Register a generic service. This call does not take ownership of the
|
||||
/// service. The service must exist for the lifetime of the Server instance.
|
||||
void RegisterAsyncGenericService(AsyncGenericService* service) override;
|
||||
|
||||
/// Try binding the server to the given \a addr endpoint
|
||||
/// (port, and optionally including IP address to bind to).
|
||||
///
|
||||
/// It can be invoked multiple times. Should be used before
|
||||
/// starting the server.
|
||||
///
|
||||
/// \param addr The address to try to bind to the server (eg, localhost:1234,
|
||||
/// 192.168.1.1:31416, [::1]:27182, etc.).
|
||||
/// \param creds The credentials associated with the server.
|
||||
///
|
||||
/// \return bound port number on success, 0 on failure.
|
||||
///
|
||||
/// \warning It is an error to call this method on an already started server.
|
||||
int AddListeningPort(const grpc::string& addr,
|
||||
ServerCredentials* creds) override;
|
||||
|
||||
/// Start the server.
|
||||
///
|
||||
/// \param cqs Completion queues for handling asynchronous services. The
|
||||
/// caller is required to keep all completion queues live until the server is
|
||||
/// destroyed.
|
||||
/// \param num_cqs How many completion queues does \a cqs hold.
|
||||
void Start(ServerCompletionQueue** cqs, size_t num_cqs) override;
|
||||
|
||||
void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override;
|
||||
|
||||
void ShutdownInternal(gpr_timespec deadline) override;
|
||||
|
||||
int max_receive_message_size() const override {
|
||||
return max_receive_message_size_;
|
||||
};
|
||||
|
||||
grpc_server* server() override { return server_; };
|
||||
|
||||
ServerInitializer* initializer();
|
||||
|
||||
const int max_receive_message_size_;
|
||||
|
||||
/// The following completion queues are ONLY used in case of Sync API
|
||||
/// i.e. if the server has any services with sync methods. The server uses
|
||||
/// these completion queues to poll for new RPCs
|
||||
std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>>
|
||||
sync_server_cqs_;
|
||||
|
||||
/// List of \a ThreadManager instances (one for each cq in
|
||||
/// the \a sync_server_cqs)
|
||||
std::vector<std::unique_ptr<SyncRequestThreadManager>> sync_req_mgrs_;
|
||||
|
||||
// Sever status
|
||||
std::mutex mu_;
|
||||
bool started_;
|
||||
bool shutdown_;
|
||||
bool shutdown_notified_; // Was notify called on the shutdown_cv_
|
||||
|
||||
std::condition_variable shutdown_cv_;
|
||||
|
||||
std::shared_ptr<GlobalCallbacks> global_callbacks_;
|
||||
|
||||
std::vector<grpc::string> services_;
|
||||
bool has_generic_service_;
|
||||
|
||||
// Pointer to the wrapped grpc_server.
|
||||
grpc_server* server_;
|
||||
|
||||
std::unique_ptr<ServerInitializer> server_initializer_;
|
||||
|
||||
std::unique_ptr<HealthCheckServiceInterface> health_check_service_;
|
||||
bool health_check_service_disabled_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SERVER_H
|
||||
@@ -1,253 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015-2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SERVER_BUILDER_H
|
||||
#define GRPCXX_SERVER_BUILDER_H
|
||||
|
||||
#include <climits>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/impl/channel_argument_option.h>
|
||||
#include <grpc++/impl/server_builder_option.h>
|
||||
#include <grpc++/impl/server_builder_plugin.h>
|
||||
#include <grpc++/support/config.h>
|
||||
#include <grpc/compression.h>
|
||||
#include <grpc/support/cpu.h>
|
||||
#include <grpc/support/useful.h>
|
||||
#include <grpc/support/workaround_list.h>
|
||||
|
||||
struct grpc_resource_quota;
|
||||
|
||||
namespace grpc {
|
||||
|
||||
class AsyncGenericService;
|
||||
class ResourceQuota;
|
||||
class CompletionQueue;
|
||||
class RpcService;
|
||||
class Server;
|
||||
class ServerCompletionQueue;
|
||||
class ServerCredentials;
|
||||
class Service;
|
||||
|
||||
namespace testing {
|
||||
class ServerBuilderPluginTest;
|
||||
} // namespace testing
|
||||
|
||||
/// A builder class for the creation and startup of \a grpc::Server instances.
|
||||
class ServerBuilder {
|
||||
public:
|
||||
ServerBuilder();
|
||||
~ServerBuilder();
|
||||
|
||||
/// Options for synchronous servers.
|
||||
enum SyncServerOption {
|
||||
NUM_CQS, ///< Number of completion queues.
|
||||
MIN_POLLERS, ///< Minimum number of polling threads.
|
||||
MAX_POLLERS, ///< Maximum number of polling threads.
|
||||
CQ_TIMEOUT_MSEC ///< Completion queue timeout in milliseconds.
|
||||
};
|
||||
|
||||
/// Register a service. This call does not take ownership of the service.
|
||||
/// The service must exist for the lifetime of the \a Server instance returned
|
||||
/// by \a BuildAndStart().
|
||||
/// Matches requests with any :authority
|
||||
ServerBuilder& RegisterService(Service* service);
|
||||
|
||||
/// Register a generic service.
|
||||
/// Matches requests with any :authority
|
||||
ServerBuilder& RegisterAsyncGenericService(AsyncGenericService* service);
|
||||
|
||||
/// Register a service. This call does not take ownership of the service.
|
||||
/// The service must exist for the lifetime of the \a Server instance returned
|
||||
/// by \a BuildAndStart().
|
||||
/// Only matches requests with :authority \a host
|
||||
ServerBuilder& RegisterService(const grpc::string& host, Service* service);
|
||||
|
||||
/// Set max receive message size in bytes.
|
||||
ServerBuilder& SetMaxReceiveMessageSize(int max_receive_message_size) {
|
||||
max_receive_message_size_ = max_receive_message_size;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Set max send message size in bytes.
|
||||
ServerBuilder& SetMaxSendMessageSize(int max_send_message_size) {
|
||||
max_send_message_size_ = max_send_message_size;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// \deprecated For backward compatibility.
|
||||
ServerBuilder& SetMaxMessageSize(int max_message_size) {
|
||||
return SetMaxReceiveMessageSize(max_message_size);
|
||||
}
|
||||
|
||||
/// Set the support status for compression algorithms. All algorithms are
|
||||
/// enabled by default.
|
||||
///
|
||||
/// Incoming calls compressed with an unsupported algorithm will fail with
|
||||
/// \a GRPC_STATUS_UNIMPLEMENTED.
|
||||
ServerBuilder& SetCompressionAlgorithmSupportStatus(
|
||||
grpc_compression_algorithm algorithm, bool enabled);
|
||||
|
||||
/// The default compression level to use for all channel calls in the
|
||||
/// absence of a call-specific level.
|
||||
ServerBuilder& SetDefaultCompressionLevel(grpc_compression_level level);
|
||||
|
||||
/// The default compression algorithm to use for all channel calls in the
|
||||
/// absence of a call-specific level. Note that it overrides any compression
|
||||
/// level set by \a SetDefaultCompressionLevel.
|
||||
ServerBuilder& SetDefaultCompressionAlgorithm(
|
||||
grpc_compression_algorithm algorithm);
|
||||
|
||||
/// Set the attached buffer pool for this server
|
||||
ServerBuilder& SetResourceQuota(const ResourceQuota& resource_quota);
|
||||
|
||||
ServerBuilder& SetOption(std::unique_ptr<ServerBuilderOption> option);
|
||||
|
||||
/// Only useful if this is a Synchronous server.
|
||||
ServerBuilder& SetSyncServerOption(SyncServerOption option, int value);
|
||||
|
||||
/// Add a channel argument (an escape hatch to tuning core library parameters
|
||||
/// directly)
|
||||
template <class T>
|
||||
ServerBuilder& AddChannelArgument(const grpc::string& arg, const T& value) {
|
||||
return SetOption(MakeChannelArgumentOption(arg, value));
|
||||
}
|
||||
|
||||
/// Enlists an endpoint \a addr (port with an optional IP address) to
|
||||
/// bind the \a grpc::Server object to be created to.
|
||||
///
|
||||
/// It can be invoked multiple times.
|
||||
///
|
||||
/// \param addr_uri The address to try to bind to the server in URI form. If
|
||||
/// the scheme name is omitted, "dns:///" is assumed. Valid values include
|
||||
/// dns:///localhost:1234, / 192.168.1.1:31416, dns:///[::1]:27182, etc.).
|
||||
/// \params creds The credentials associated with the server.
|
||||
/// \param selected_port[out] If not `nullptr`, gets populated with the port
|
||||
/// number bound to the \a grpc::Server for the corresponding endpoint after
|
||||
/// it is successfully bound, 0 otherwise.
|
||||
///
|
||||
// TODO(dgq): the "port" part seems to be a misnomer.
|
||||
ServerBuilder& AddListeningPort(const grpc::string& addr_uri,
|
||||
std::shared_ptr<ServerCredentials> creds,
|
||||
int* selected_port = nullptr);
|
||||
|
||||
/// Add a completion queue for handling asynchronous services.
|
||||
///
|
||||
/// Caller is required to shutdown the server prior to shutting down the
|
||||
/// returned completion queue. A typical usage scenario:
|
||||
///
|
||||
/// // While building the server:
|
||||
/// ServerBuilder builder;
|
||||
/// ...
|
||||
/// cq_ = builder.AddCompletionQueue();
|
||||
/// server_ = builder.BuildAndStart();
|
||||
///
|
||||
/// // While shutting down the server;
|
||||
/// server_->Shutdown();
|
||||
/// cq_->Shutdown(); // Always *after* the associated server's Shutdown()!
|
||||
///
|
||||
/// \param is_frequently_polled This is an optional parameter to inform gRPC
|
||||
/// library about whether this completion queue would be frequently polled
|
||||
/// (i.e. by calling \a Next() or \a AsyncNext()). The default value is
|
||||
/// 'true' and is the recommended setting. Setting this to 'false' (i.e.
|
||||
/// not polling the completion queue frequently) will have a significantly
|
||||
/// negative performance impact and hence should not be used in production
|
||||
/// use cases.
|
||||
std::unique_ptr<ServerCompletionQueue> AddCompletionQueue(
|
||||
bool is_frequently_polled = true);
|
||||
|
||||
/// Return a running server which is ready for processing calls.
|
||||
std::unique_ptr<Server> BuildAndStart();
|
||||
|
||||
/// For internal use only: Register a ServerBuilderPlugin factory function.
|
||||
static void InternalAddPluginFactory(
|
||||
std::unique_ptr<ServerBuilderPlugin> (*CreatePlugin)());
|
||||
|
||||
/// Enable a server workaround. Do not use unless you know what the workaround
|
||||
/// does. For explanation and detailed descriptions of workarounds, see
|
||||
/// doc/workarounds.md.
|
||||
ServerBuilder& EnableWorkaround(grpc_workaround_list id);
|
||||
|
||||
private:
|
||||
friend class ::grpc::testing::ServerBuilderPluginTest;
|
||||
|
||||
struct Port {
|
||||
grpc::string addr;
|
||||
std::shared_ptr<ServerCredentials> creds;
|
||||
int* selected_port;
|
||||
};
|
||||
|
||||
struct SyncServerSettings {
|
||||
SyncServerSettings()
|
||||
: num_cqs(1), min_pollers(1), max_pollers(2), cq_timeout_msec(10000) {}
|
||||
|
||||
/// Number of server completion queues to create to listen to incoming RPCs.
|
||||
int num_cqs;
|
||||
|
||||
/// Minimum number of threads per completion queue that should be listening
|
||||
/// to incoming RPCs.
|
||||
int min_pollers;
|
||||
|
||||
/// Maximum number of threads per completion queue that can be listening to
|
||||
/// incoming RPCs.
|
||||
int max_pollers;
|
||||
|
||||
/// The timeout for server completion queue's AsyncNext call.
|
||||
int cq_timeout_msec;
|
||||
};
|
||||
|
||||
typedef std::unique_ptr<grpc::string> HostString;
|
||||
struct NamedService {
|
||||
explicit NamedService(Service* s) : service(s) {}
|
||||
NamedService(const grpc::string& h, Service* s)
|
||||
: host(new grpc::string(h)), service(s) {}
|
||||
HostString host;
|
||||
Service* service;
|
||||
};
|
||||
|
||||
int max_receive_message_size_;
|
||||
int max_send_message_size_;
|
||||
std::vector<std::unique_ptr<ServerBuilderOption>> options_;
|
||||
std::vector<std::unique_ptr<NamedService>> services_;
|
||||
std::vector<Port> ports_;
|
||||
|
||||
SyncServerSettings sync_server_settings_;
|
||||
|
||||
/// List of completion queues added via \a AddCompletionQueue method.
|
||||
std::vector<ServerCompletionQueue*> cqs_;
|
||||
|
||||
std::shared_ptr<ServerCredentials> creds_;
|
||||
std::vector<std::unique_ptr<ServerBuilderPlugin>> plugins_;
|
||||
grpc_resource_quota* resource_quota_;
|
||||
AsyncGenericService* generic_service_;
|
||||
struct {
|
||||
bool is_set;
|
||||
grpc_compression_level level;
|
||||
} maybe_default_compression_level_;
|
||||
struct {
|
||||
bool is_set;
|
||||
grpc_compression_algorithm algorithm;
|
||||
} maybe_default_compression_algorithm_;
|
||||
uint32_t enabled_compression_algorithms_bitset_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SERVER_BUILDER_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SERVER_CONTEXT_H
|
||||
#define GRPCXX_SERVER_CONTEXT_H
|
||||
|
||||
#include <grpc++/impl/codegen/server_context.h>
|
||||
|
||||
#endif // GRPCXX_SERVER_CONTEXT_H
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SERVER_POSIX_H
|
||||
#define GRPCXX_SERVER_POSIX_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <grpc++/server.h>
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
#ifdef GPR_SUPPORT_CHANNELS_FROM_FD
|
||||
|
||||
/// Add a new client to a \a Server communicating over the given
|
||||
/// file descriptor.
|
||||
///
|
||||
/// \param server The server to add the client to.
|
||||
/// \param fd The file descriptor representing a socket.
|
||||
void AddInsecureChannelFromFd(Server* server, int fd);
|
||||
|
||||
#endif // GPR_SUPPORT_CHANNELS_FROM_FD
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SERVER_POSIX_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_ASYNC_STREAM_H
|
||||
#define GRPCXX_SUPPORT_ASYNC_STREAM_H
|
||||
|
||||
#include <grpc++/impl/codegen/async_stream.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_ASYNC_STREAM_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H
|
||||
#define GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H
|
||||
|
||||
#include <grpc++/impl/codegen/async_unary_call.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H
|
||||
@@ -1,97 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_BYTE_BUFFER_H
|
||||
#define GRPCXX_SUPPORT_BYTE_BUFFER_H
|
||||
|
||||
#include <grpc++/impl/serialization_traits.h>
|
||||
#include <grpc++/support/config.h>
|
||||
#include <grpc++/support/slice.h>
|
||||
#include <grpc++/support/status.h>
|
||||
#include <grpc/byte_buffer.h>
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// A sequence of bytes.
|
||||
class ByteBuffer final {
|
||||
public:
|
||||
/// Constuct an empty buffer.
|
||||
ByteBuffer() : buffer_(nullptr) {}
|
||||
|
||||
/// Construct buffer from \a slices, of which there are \a nslices.
|
||||
ByteBuffer(const Slice* slices, size_t nslices);
|
||||
|
||||
/// Constuct a byte buffer by referencing elements of existing buffer
|
||||
/// \a buf. Wrapper of core function grpc_byte_buffer_copy
|
||||
ByteBuffer(const ByteBuffer& buf);
|
||||
|
||||
~ByteBuffer();
|
||||
|
||||
ByteBuffer& operator=(const ByteBuffer&);
|
||||
|
||||
/// Dump (read) the buffer contents into \a slices.
|
||||
Status Dump(std::vector<Slice>* slices) const;
|
||||
|
||||
/// Remove all data.
|
||||
void Clear();
|
||||
|
||||
/// Buffer size in bytes.
|
||||
size_t Length() const;
|
||||
|
||||
/// Swap the state of *this and *other.
|
||||
void Swap(ByteBuffer* other);
|
||||
|
||||
private:
|
||||
friend class SerializationTraits<ByteBuffer, void>;
|
||||
|
||||
// takes ownership
|
||||
void set_buffer(grpc_byte_buffer* buf) {
|
||||
if (buffer_) {
|
||||
Clear();
|
||||
}
|
||||
buffer_ = buf;
|
||||
}
|
||||
|
||||
// For \a SerializationTraits's usage.
|
||||
grpc_byte_buffer* buffer() const { return buffer_; }
|
||||
|
||||
grpc_byte_buffer* buffer_;
|
||||
};
|
||||
|
||||
template <>
|
||||
class SerializationTraits<ByteBuffer, void> {
|
||||
public:
|
||||
static Status Deserialize(grpc_byte_buffer* byte_buffer, ByteBuffer* dest) {
|
||||
dest->set_buffer(byte_buffer);
|
||||
return Status::OK;
|
||||
}
|
||||
static Status Serialize(const ByteBuffer& source, grpc_byte_buffer** buffer,
|
||||
bool* own_buffer) {
|
||||
*buffer = grpc_byte_buffer_copy(source.buffer());
|
||||
*own_buffer = true;
|
||||
return Status::OK;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SUPPORT_BYTE_BUFFER_H
|
||||
@@ -1,136 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H
|
||||
#define GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H
|
||||
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
#include <grpc++/support/config.h>
|
||||
#include <grpc/compression.h>
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
namespace grpc {
|
||||
namespace testing {
|
||||
class ChannelArgumentsTest;
|
||||
} // namespace testing
|
||||
|
||||
class ResourceQuota;
|
||||
|
||||
/// Options for channel creation. The user can use generic setters to pass
|
||||
/// key value pairs down to C channel creation code. For gRPC related options,
|
||||
/// concrete setters are provided.
|
||||
class ChannelArguments {
|
||||
public:
|
||||
ChannelArguments();
|
||||
~ChannelArguments();
|
||||
|
||||
ChannelArguments(const ChannelArguments& other);
|
||||
ChannelArguments& operator=(ChannelArguments other) {
|
||||
Swap(other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
void Swap(ChannelArguments& other);
|
||||
|
||||
/// Dump arguments in this instance to \a channel_args. Does not take
|
||||
/// ownership of \a channel_args.
|
||||
///
|
||||
/// Note that the underlying arguments are shared. Changes made to either \a
|
||||
/// channel_args or this instance would be reflected on both.
|
||||
void SetChannelArgs(grpc_channel_args* channel_args) const;
|
||||
|
||||
// gRPC specific channel argument setters
|
||||
/// Set target name override for SSL host name checking. This option is for
|
||||
/// testing only and should never be used in production.
|
||||
void SetSslTargetNameOverride(const grpc::string& name);
|
||||
// TODO(yangg) add flow control options
|
||||
/// Set the compression algorithm for the channel.
|
||||
void SetCompressionAlgorithm(grpc_compression_algorithm algorithm);
|
||||
|
||||
/// Set the socket mutator for the channel.
|
||||
void SetSocketMutator(grpc_socket_mutator* mutator);
|
||||
|
||||
/// Set the string to prepend to the user agent.
|
||||
void SetUserAgentPrefix(const grpc::string& user_agent_prefix);
|
||||
|
||||
/// Set the buffer pool to be attached to the constructed channel.
|
||||
void SetResourceQuota(const ResourceQuota& resource_quota);
|
||||
|
||||
/// Set the max receive and send message sizes.
|
||||
void SetMaxReceiveMessageSize(int size);
|
||||
void SetMaxSendMessageSize(int size);
|
||||
|
||||
/// Set LB policy name.
|
||||
/// Note that if the name resolver returns only balancer addresses, the
|
||||
/// grpclb LB policy will be used, regardless of what is specified here.
|
||||
void SetLoadBalancingPolicyName(const grpc::string& lb_policy_name);
|
||||
|
||||
/// Set service config in JSON form.
|
||||
/// Primarily meant for use in unit tests.
|
||||
void SetServiceConfigJSON(const grpc::string& service_config_json);
|
||||
|
||||
// Generic channel argument setters. Only for advanced use cases.
|
||||
/// Set an integer argument \a value under \a key.
|
||||
void SetInt(const grpc::string& key, int value);
|
||||
|
||||
// Generic channel argument setter. Only for advanced use cases.
|
||||
/// Set a pointer argument \a value under \a key. Owership is not transferred.
|
||||
void SetPointer(const grpc::string& key, void* value);
|
||||
|
||||
void SetPointerWithVtable(const grpc::string& key, void* value,
|
||||
const grpc_arg_pointer_vtable* vtable);
|
||||
|
||||
/// Set a textual argument \a value under \a key.
|
||||
void SetString(const grpc::string& key, const grpc::string& value);
|
||||
|
||||
/// Return (by value) a C \a grpc_channel_args structure which points to
|
||||
/// arguments owned by this \a ChannelArguments instance
|
||||
grpc_channel_args c_channel_args() const {
|
||||
grpc_channel_args out;
|
||||
out.num_args = args_.size();
|
||||
out.args = args_.empty() ? NULL : const_cast<grpc_arg*>(&args_[0]);
|
||||
return out;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class SecureChannelCredentials;
|
||||
friend class testing::ChannelArgumentsTest;
|
||||
|
||||
/// Default pointer argument operations.
|
||||
struct PointerVtableMembers {
|
||||
static void* Copy(void* in) { return in; }
|
||||
static void Destroy(grpc_exec_ctx* exec_ctx, void* in) {}
|
||||
static int Compare(void* a, void* b) {
|
||||
if (a < b) return -1;
|
||||
if (a > b) return 1;
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
// Returns empty string when it is not set.
|
||||
grpc::string GetSslTargetNameOverride() const;
|
||||
|
||||
std::vector<grpc_arg> args_;
|
||||
std::list<grpc::string> strings_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_CONFIG_H
|
||||
#define GRPCXX_SUPPORT_CONFIG_H
|
||||
|
||||
#include <grpc++/impl/codegen/config.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_CONFIG_H
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2017 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_ERROR_DETAILS_H
|
||||
#define GRPCXX_SUPPORT_ERROR_DETAILS_H
|
||||
|
||||
#include <grpc++/support/status.h>
|
||||
|
||||
namespace google {
|
||||
namespace rpc {
|
||||
class Status;
|
||||
} // namespace rpc
|
||||
} // namespace google
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// Map a \a grpc::Status to a \a google::rpc::Status.
|
||||
/// The given \a to object will be cleared.
|
||||
/// On success, returns status with OK.
|
||||
/// Returns status with \a INVALID_ARGUMENT, if failed to deserialize.
|
||||
/// Returns status with \a FAILED_PRECONDITION, if \a to is nullptr.
|
||||
Status ExtractErrorDetails(const Status& from, ::google::rpc::Status* to);
|
||||
|
||||
/// Map \a google::rpc::Status to a \a grpc::Status.
|
||||
/// Returns OK on success.
|
||||
/// Returns status with \a FAILED_PRECONDITION if \a to is nullptr.
|
||||
Status SetErrorDetails(const ::google::rpc::Status& from, Status* to);
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SUPPORT_ERROR_DETAILS_H
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_SLICE_H
|
||||
#define GRPCXX_SUPPORT_SLICE_H
|
||||
|
||||
#include <grpc++/support/config.h>
|
||||
#include <grpc/slice.h>
|
||||
|
||||
namespace grpc {
|
||||
|
||||
/// A wrapper around \a grpc_slice.
|
||||
///
|
||||
/// A slice represents a contiguous reference counted array of bytes.
|
||||
/// It is cheap to take references to a slice, and it is cheap to create a
|
||||
/// slice pointing to a subset of another slice.
|
||||
class Slice final {
|
||||
public:
|
||||
/// Construct an empty slice.
|
||||
Slice();
|
||||
/// Destructor - drops one reference.
|
||||
~Slice();
|
||||
|
||||
enum AddRef { ADD_REF };
|
||||
/// Construct a slice from \a slice, adding a reference.
|
||||
Slice(grpc_slice slice, AddRef);
|
||||
|
||||
enum StealRef { STEAL_REF };
|
||||
/// Construct a slice from \a slice, stealing a reference.
|
||||
Slice(grpc_slice slice, StealRef);
|
||||
|
||||
/// Allocate a slice of specified size
|
||||
Slice(size_t len);
|
||||
|
||||
/// Construct a slice from a copied buffer
|
||||
Slice(const void* buf, size_t len);
|
||||
|
||||
/// Construct a slice from a copied string
|
||||
Slice(const grpc::string& str);
|
||||
|
||||
enum StaticSlice { STATIC_SLICE };
|
||||
|
||||
/// Construct a slice from a static buffer
|
||||
Slice(const void* buf, size_t len, StaticSlice);
|
||||
|
||||
/// Copy constructor, adds a reference.
|
||||
Slice(const Slice& other);
|
||||
|
||||
/// Assignment, reference count is unchanged.
|
||||
Slice& operator=(Slice other) {
|
||||
std::swap(slice_, other.slice_);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Create a slice pointing at some data. Calls malloc to allocate a refcount
|
||||
/// for the object, and arranges that destroy will be called with the
|
||||
/// user data pointer passed in at destruction. Can be the same as buf or
|
||||
/// different (e.g., if data is part of a larger structure that must be
|
||||
/// destroyed when the data is no longer needed)
|
||||
Slice(void* buf, size_t len, void (*destroy)(void*), void* user_data);
|
||||
|
||||
/// Specialization of above for common case where buf == user_data
|
||||
Slice(void* buf, size_t len, void (*destroy)(void*))
|
||||
: Slice(buf, len, destroy, buf) {}
|
||||
|
||||
/// Similar to the above but has a destroy that also takes slice length
|
||||
Slice(void* buf, size_t len, void (*destroy)(void*, size_t));
|
||||
|
||||
/// Byte size.
|
||||
size_t size() const { return GRPC_SLICE_LENGTH(slice_); }
|
||||
|
||||
/// Raw pointer to the beginning (first element) of the slice.
|
||||
const uint8_t* begin() const { return GRPC_SLICE_START_PTR(slice_); }
|
||||
|
||||
/// Raw pointer to the end (one byte \em past the last element) of the slice.
|
||||
const uint8_t* end() const { return GRPC_SLICE_END_PTR(slice_); }
|
||||
|
||||
/// Raw C slice. Caller needs to call grpc_slice_unref when done.
|
||||
grpc_slice c_slice() const { return grpc_slice_ref(slice_); }
|
||||
|
||||
private:
|
||||
friend class ByteBuffer;
|
||||
|
||||
grpc_slice slice_;
|
||||
};
|
||||
|
||||
} // namespace grpc
|
||||
|
||||
#endif // GRPCXX_SUPPORT_SLICE_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_STATUS_H
|
||||
#define GRPCXX_SUPPORT_STATUS_H
|
||||
|
||||
#include <grpc++/impl/codegen/status.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_STATUS_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_STATUS_CODE_ENUM_H
|
||||
#define GRPCXX_SUPPORT_STATUS_CODE_ENUM_H
|
||||
|
||||
#include <grpc++/impl/codegen/status_code_enum.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_STATUS_CODE_ENUM_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_STRING_REF_H
|
||||
#define GRPCXX_SUPPORT_STRING_REF_H
|
||||
|
||||
#include <grpc++/impl/codegen/string_ref.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_STRING_REF_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_STUB_OPTIONS_H
|
||||
#define GRPCXX_SUPPORT_STUB_OPTIONS_H
|
||||
|
||||
#include <grpc++/impl/codegen/stub_options.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_STUB_OPTIONS_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_SYNC_STREAM_H
|
||||
#define GRPCXX_SUPPORT_SYNC_STREAM_H
|
||||
|
||||
#include <grpc++/impl/codegen/sync_stream.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_SYNC_STREAM_H
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPCXX_SUPPORT_TIME_H
|
||||
#define GRPCXX_SUPPORT_TIME_H
|
||||
|
||||
#include <grpc++/impl/codegen/time.h>
|
||||
|
||||
#endif // GRPCXX_SUPPORT_TIME_H
|
||||
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_BYTE_BUFFER_H
|
||||
#define GRPC_BYTE_BUFFER_H
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
#include <grpc/slice_buffer.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Returns a RAW byte buffer instance over the given slices (up to \a nslices).
|
||||
*
|
||||
* Increases the reference count for all \a slices processed. The user is
|
||||
* responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/
|
||||
GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_create(grpc_slice *slices,
|
||||
size_t nslices);
|
||||
|
||||
/** Returns a *compressed* RAW byte buffer instance over the given slices (up to
|
||||
* \a nslices). The \a compression argument defines the compression algorithm
|
||||
* used to generate the data in \a slices.
|
||||
*
|
||||
* Increases the reference count for all \a slices processed. The user is
|
||||
* responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/
|
||||
GRPCAPI grpc_byte_buffer *grpc_raw_compressed_byte_buffer_create(
|
||||
grpc_slice *slices, size_t nslices, grpc_compression_algorithm compression);
|
||||
|
||||
/** Copies input byte buffer \a bb.
|
||||
*
|
||||
* Increases the reference count of all the source slices. The user is
|
||||
* responsible for calling grpc_byte_buffer_destroy over the returned copy. */
|
||||
GRPCAPI grpc_byte_buffer *grpc_byte_buffer_copy(grpc_byte_buffer *bb);
|
||||
|
||||
/** Returns the size of the given byte buffer, in bytes. */
|
||||
GRPCAPI size_t grpc_byte_buffer_length(grpc_byte_buffer *bb);
|
||||
|
||||
/** Destroys \a byte_buffer deallocating all its memory. */
|
||||
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *byte_buffer);
|
||||
|
||||
/** Reader for byte buffers. Iterates over slices in the byte buffer */
|
||||
struct grpc_byte_buffer_reader;
|
||||
typedef struct grpc_byte_buffer_reader grpc_byte_buffer_reader;
|
||||
|
||||
/** Initialize \a reader to read over \a buffer.
|
||||
* Returns 1 upon success, 0 otherwise. */
|
||||
GRPCAPI int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader,
|
||||
grpc_byte_buffer *buffer);
|
||||
|
||||
/** Cleanup and destroy \a reader */
|
||||
GRPCAPI void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader *reader);
|
||||
|
||||
/** Updates \a slice with the next piece of data from from \a reader and returns
|
||||
* 1. Returns 0 at the end of the stream. Caller is responsible for calling
|
||||
* grpc_slice_unref on the result. */
|
||||
GRPCAPI int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader *reader,
|
||||
grpc_slice *slice);
|
||||
|
||||
/** Merge all data from \a reader into single slice */
|
||||
GRPCAPI grpc_slice
|
||||
grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader *reader);
|
||||
|
||||
/** Returns a RAW byte buffer instance from the output of \a reader. */
|
||||
GRPCAPI grpc_byte_buffer *grpc_raw_byte_buffer_from_reader(
|
||||
grpc_byte_buffer_reader *reader);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_BYTE_BUFFER_H */
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_BYTE_BUFFER_READER_H
|
||||
#define GRPC_BYTE_BUFFER_READER_H
|
||||
|
||||
#include <grpc/impl/codegen/byte_buffer_reader.h>
|
||||
|
||||
#endif /* GRPC_BYTE_BUFFER_READER_H */
|
||||
@@ -1,469 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015-2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
/** RPC-internal Census API's. These are designed to be generic enough that
|
||||
* they can (ultimately) be used in many different RPC systems (with differing
|
||||
* implementations). */
|
||||
|
||||
#ifndef GRPC_CENSUS_H
|
||||
#define GRPC_CENSUS_H
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Identify census features that can be enabled via census_initialize(). */
|
||||
enum census_features {
|
||||
CENSUS_FEATURE_NONE = 0, /** Do not enable census. */
|
||||
CENSUS_FEATURE_TRACING = 1, /** Enable census tracing. */
|
||||
CENSUS_FEATURE_STATS = 2, /** Enable Census stats collection. */
|
||||
CENSUS_FEATURE_CPU = 4, /** Enable Census CPU usage collection. */
|
||||
CENSUS_FEATURE_ALL =
|
||||
CENSUS_FEATURE_TRACING | CENSUS_FEATURE_STATS | CENSUS_FEATURE_CPU
|
||||
};
|
||||
|
||||
/** Shutdown and startup census subsystem. The 'features' argument should be
|
||||
* the OR (|) of census_features values. If census fails to initialize, then
|
||||
* census_initialize() will return -1, otherwise the set of enabled features
|
||||
* (which may be smaller than that provided in the `features` argument, see
|
||||
* census_supported()) is returned. It is an error to call census_initialize()
|
||||
* more than once (without an intervening census_shutdown()). These functions
|
||||
* are not thread-safe. */
|
||||
CENSUSAPI int census_initialize(int features);
|
||||
CENSUSAPI void census_shutdown(void);
|
||||
|
||||
/** Return the features supported by the current census implementation (not all
|
||||
* features will be available on all platforms). */
|
||||
CENSUSAPI int census_supported(void);
|
||||
|
||||
/** Return the census features currently enabled. */
|
||||
CENSUSAPI int census_enabled(void);
|
||||
|
||||
/**
|
||||
A Census Context is a handle used by Census to represent the current tracing
|
||||
and stats collection information. Contexts should be propagated across RPC's
|
||||
(this is the responsibility of the local RPC system). A context is typically
|
||||
used as the first argument to most census functions. Conceptually, they
|
||||
should be thought of as specific to a single RPC/thread. The user visible
|
||||
context representation is that of a collection of key:value string pairs,
|
||||
each of which is termed a 'tag'; these form the basis against which Census
|
||||
metrics will be recorded. Keys are unique within a context. */
|
||||
typedef struct census_context census_context;
|
||||
|
||||
/** A tag is a key:value pair. Both keys and values are nil-terminated strings,
|
||||
containing printable ASCII characters (decimal 32-126). Keys must be at
|
||||
least one character in length. Both keys and values can have at most
|
||||
CENSUS_MAX_TAG_KB_LEN characters (including the terminating nil). The
|
||||
maximum number of tags that can be propagated is
|
||||
CENSUS_MAX_PROPAGATED_TAGS. Users should also remember that some systems
|
||||
may have limits on, e.g., the number of bytes that can be transmitted as
|
||||
metadata, and that larger tags means more memory consumed and time in
|
||||
processing. */
|
||||
typedef struct {
|
||||
const char *key;
|
||||
const char *value;
|
||||
uint8_t flags;
|
||||
} census_tag;
|
||||
|
||||
/** Maximum length of a tag's key or value. */
|
||||
#define CENSUS_MAX_TAG_KV_LEN 255
|
||||
/** Maximum number of propagatable tags. */
|
||||
#define CENSUS_MAX_PROPAGATED_TAGS 255
|
||||
|
||||
/** Tag flags. */
|
||||
#define CENSUS_TAG_PROPAGATE 1 /** Tag should be propagated over RPC */
|
||||
#define CENSUS_TAG_STATS 2 /** Tag will be used for statistics aggregation */
|
||||
#define CENSUS_TAG_RESERVED 4 /** Reserved for internal use. */
|
||||
/** Flag values 4,8,16,32,64,128 are reserved for future/internal use. Clients
|
||||
should not use or rely on their values. */
|
||||
|
||||
#define CENSUS_TAG_IS_PROPAGATED(flags) (flags & CENSUS_TAG_PROPAGATE)
|
||||
#define CENSUS_TAG_IS_STATS(flags) (flags & CENSUS_TAG_STATS)
|
||||
|
||||
/** An instance of this structure is kept by every context, and records the
|
||||
basic information associated with the creation of that context. */
|
||||
typedef struct {
|
||||
int n_propagated_tags; /** number of propagated tags */
|
||||
int n_local_tags; /** number of non-propagated (local) tags */
|
||||
int n_deleted_tags; /** number of tags that were deleted */
|
||||
int n_added_tags; /** number of tags that were added */
|
||||
int n_modified_tags; /** number of tags that were modified */
|
||||
int n_invalid_tags; /** number of tags with bad keys or values (e.g.
|
||||
longer than CENSUS_MAX_TAG_KV_LEN) */
|
||||
int n_ignored_tags; /** number of tags ignored because of
|
||||
CENSUS_MAX_PROPAGATED_TAGS limit. */
|
||||
} census_context_status;
|
||||
|
||||
/** Create a new context, adding and removing tags from an existing context.
|
||||
This will copy all tags from the 'tags' input, so it is recommended
|
||||
to add as many tags in a single operation as is practical for the client.
|
||||
@param base Base context to build upon. Can be NULL.
|
||||
@param tags A set of tags to be added/changed/deleted. Tags with keys that
|
||||
are in 'tags', but not 'base', are added to the context. Keys that are in
|
||||
both 'tags' and 'base' will have their value/flags modified. Tags with keys
|
||||
in both, but with NULL values, will be deleted from the context. Tags with
|
||||
invalid (too long or short) keys or values will be ignored.
|
||||
If adding a tag will result in more than CENSUS_MAX_PROPAGATED_TAGS in either
|
||||
binary or non-binary tags, they will be ignored, as will deletions of
|
||||
tags that don't exist.
|
||||
@param ntags number of tags in 'tags'
|
||||
@param status If not NULL, will return a pointer to a census_context_status
|
||||
structure containing information about the new context and status of the
|
||||
tags used in its creation.
|
||||
@return A new, valid census_context.
|
||||
*/
|
||||
CENSUSAPI census_context *census_context_create(
|
||||
const census_context *base, const census_tag *tags, int ntags,
|
||||
census_context_status const **status);
|
||||
|
||||
/** Destroy a context. Once this function has been called, the context cannot
|
||||
be reused. */
|
||||
CENSUSAPI void census_context_destroy(census_context *context);
|
||||
|
||||
/** Get a pointer to the original status from the context creation. */
|
||||
CENSUSAPI const census_context_status *census_context_get_status(
|
||||
const census_context *context);
|
||||
|
||||
/** Structure used for iterating over the tags in a context. API clients should
|
||||
not use or reference internal fields - neither their contents or
|
||||
presence/absence are guaranteed. */
|
||||
typedef struct {
|
||||
const census_context *context;
|
||||
int base;
|
||||
int index;
|
||||
char *kvm;
|
||||
} census_context_iterator;
|
||||
|
||||
/** Initialize a census_tag_iterator. Must be called before first use. */
|
||||
CENSUSAPI void census_context_initialize_iterator(
|
||||
const census_context *context, census_context_iterator *iterator);
|
||||
|
||||
/** Get the contents of the "next" tag in the context. If there are no more
|
||||
tags, returns 0 (and 'tag' contents will be unchanged), otherwise returns 1.
|
||||
*/
|
||||
CENSUSAPI int census_context_next_tag(census_context_iterator *iterator,
|
||||
census_tag *tag);
|
||||
|
||||
/** Get a context tag by key. Returns 0 if the key is not present. */
|
||||
CENSUSAPI int census_context_get_tag(const census_context *context,
|
||||
const char *key, census_tag *tag);
|
||||
|
||||
/** Tag set encode/decode functionality. These functions are intended
|
||||
for use by RPC systems only, for purposes of transmitting/receiving contexts.
|
||||
*/
|
||||
|
||||
/** Encode a context into a buffer.
|
||||
@param context context to be encoded
|
||||
@param buffer buffer into which the context will be encoded.
|
||||
@param buf_size number of available bytes in buffer.
|
||||
@return The number of buffer bytes consumed for the encoded context, or
|
||||
zero if the buffer was of insufficient size. */
|
||||
CENSUSAPI size_t census_context_encode(const census_context *context,
|
||||
char *buffer, size_t buf_size);
|
||||
|
||||
/** Decode context buffer encoded with census_context_encode(). Returns NULL
|
||||
if there is an error in parsing either buffer. */
|
||||
CENSUSAPI census_context *census_context_decode(const char *buffer,
|
||||
size_t size);
|
||||
|
||||
/** Distributed traces can have a number of options. */
|
||||
enum census_trace_mask_values {
|
||||
CENSUS_TRACE_MASK_NONE = 0, /** Default, empty flags */
|
||||
CENSUS_TRACE_MASK_IS_SAMPLED = 1 /** RPC tracing enabled for this context. */
|
||||
};
|
||||
|
||||
/** Get the current trace mask associated with this context. The value returned
|
||||
will be the logical OR of census_trace_mask_values values. */
|
||||
CENSUSAPI int census_trace_mask(const census_context *context);
|
||||
|
||||
/** Set the trace mask associated with a context. */
|
||||
CENSUSAPI void census_set_trace_mask(int trace_mask);
|
||||
|
||||
/** The concept of "operation" is a fundamental concept for Census. In an RPC
|
||||
system, an operation typically represents a single RPC, or a significant
|
||||
sub-part thereof (e.g. a single logical "read" RPC to a distributed storage
|
||||
system might do several other actions in parallel, from looking up metadata
|
||||
indices to making requests of other services - each of these could be a
|
||||
sub-operation with the larger RPC operation). Census uses operations for the
|
||||
following:
|
||||
|
||||
CPU accounting: If enabled, census will measure the thread CPU time
|
||||
consumed between operation start and end times.
|
||||
|
||||
Active operations: Census will maintain information on all currently
|
||||
active operations.
|
||||
|
||||
Distributed tracing: Each operation serves as a logical trace span.
|
||||
|
||||
Stats collection: Stats are broken down by operation (e.g. latency
|
||||
breakdown for each unique RPC path).
|
||||
|
||||
The following functions serve to delineate the start and stop points for
|
||||
each logical operation. */
|
||||
|
||||
/**
|
||||
This structure represents a timestamp as used by census to record the time
|
||||
at which an operation begins.
|
||||
*/
|
||||
typedef struct {
|
||||
/** Use gpr_timespec for default implementation. High performance
|
||||
* implementations should use a cycle-counter based timestamp. */
|
||||
gpr_timespec ts;
|
||||
} census_timestamp;
|
||||
|
||||
/**
|
||||
Mark the beginning of an RPC operation. The information required to call the
|
||||
functions to record the start of RPC operations (both client and server) may
|
||||
not be callable at the true start time of the operation, due to information
|
||||
not being available (e.g. the census context data will not be available in a
|
||||
server RPC until at least initial metadata has been processed). To ensure
|
||||
correct CPU accounting and latency recording, RPC systems can call this
|
||||
function to get the timestamp of operation beginning. This can later be used
|
||||
as an argument to census_start_{client,server}_rpc_op(). NB: for correct
|
||||
CPU accounting, the system must guarantee that the same thread is used
|
||||
for all request processing after this function is called.
|
||||
|
||||
@return A timestamp representing the operation start time.
|
||||
*/
|
||||
CENSUSAPI census_timestamp census_start_rpc_op_timestamp(void);
|
||||
|
||||
/**
|
||||
Represent functions to map RPC name ID to service/method names. Census
|
||||
breaks down all RPC stats by service and method names. We leave the
|
||||
definition and format of these to the RPC system. For efficiency purposes,
|
||||
we encode these as a single 64 bit identifier, and allow the RPC system to
|
||||
provide a structure for functions that can convert these to service and
|
||||
method strings.
|
||||
|
||||
TODO(aveitch): Instead of providing this as an argument to the rpc_start_op()
|
||||
functions, maybe it should be set once at census initialization.
|
||||
*/
|
||||
typedef struct {
|
||||
const char *(*get_rpc_service_name)(int64_t id);
|
||||
const char *(*get_rpc_method_name)(int64_t id);
|
||||
} census_rpc_name_info;
|
||||
|
||||
/**
|
||||
Start a client rpc operation. This function should be called as early in the
|
||||
client RPC path as possible. This function will create a new context. If
|
||||
the context argument is non-null, then the new context will inherit all
|
||||
its properties, with the following changes:
|
||||
- create a new operation ID for the new context, marking it as a child of
|
||||
the previous operation.
|
||||
- use the new RPC path and peer information for tracing and stats
|
||||
collection purposes, rather than those from the original context
|
||||
|
||||
If the context argument is NULL, then a new root context is created. This
|
||||
is particularly important for tracing purposes (the trace spans generated
|
||||
will be unassociated with any other trace spans, except those
|
||||
downstream). The trace_mask will be used for tracing operations associated
|
||||
with the new context.
|
||||
|
||||
In some RPC systems (e.g. where load balancing is used), peer information
|
||||
may not be available at the time the operation starts. In this case, use a
|
||||
NULL value for peer, and set it later using the
|
||||
census_set_rpc_client_peer() function.
|
||||
|
||||
@param context The parent context. Can be NULL.
|
||||
@param rpc_name_id The rpc name identifier to be associated with this RPC.
|
||||
@param rpc_name_info Used to decode rpc_name_id.
|
||||
@param peer RPC peer. If not available at the time, NULL can be used,
|
||||
and a later census_set_rpc_client_peer() call made.
|
||||
@param trace_mask An OR of census_trace_mask_values values. Only used in
|
||||
the creation of a new root context (context == NULL).
|
||||
@param start_time A timestamp returned from census_start_rpc_op_timestamp().
|
||||
Can be NULL. Used to set the true time the operation
|
||||
begins.
|
||||
|
||||
@return A new census context.
|
||||
*/
|
||||
CENSUSAPI census_context *census_start_client_rpc_op(
|
||||
const census_context *context, int64_t rpc_name_id,
|
||||
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
|
||||
const census_timestamp *start_time);
|
||||
|
||||
/**
|
||||
Add peer information to a context representing a client RPC operation.
|
||||
*/
|
||||
CENSUSAPI void census_set_rpc_client_peer(census_context *context,
|
||||
const char *peer);
|
||||
|
||||
/**
|
||||
Start a server RPC operation. Returns a new context to be used in future
|
||||
census calls. If buffer is non-NULL, then the buffer contents should
|
||||
represent the client context, as generated by census_context_serialize().
|
||||
If buffer is NULL, a new root context is created.
|
||||
|
||||
@param buffer Buffer containing bytes output from census_context_serialize().
|
||||
@param rpc_name_id The rpc name identifier to be associated with this RPC.
|
||||
@param rpc_name_info Used to decode rpc_name_id.
|
||||
@param peer RPC peer.
|
||||
@param trace_mask An OR of census_trace_mask_values values. Only used in
|
||||
the creation of a new root context (buffer == NULL).
|
||||
@param start_time A timestamp returned from census_start_rpc_op_timestamp().
|
||||
Can be NULL. Used to set the true time the operation
|
||||
begins.
|
||||
|
||||
@return A new census context.
|
||||
*/
|
||||
CENSUSAPI census_context *census_start_server_rpc_op(
|
||||
const char *buffer, int64_t rpc_name_id,
|
||||
const census_rpc_name_info *rpc_name_info, const char *peer, int trace_mask,
|
||||
census_timestamp *start_time);
|
||||
|
||||
/**
|
||||
Start a new, non-RPC operation. In general, this function works very
|
||||
similarly to census_start_client_rpc_op, with the primary difference being
|
||||
the replacement of host/path information with the more generic family/name
|
||||
tags. If the context argument is non-null, then the new context will
|
||||
inherit all its properties, with the following changes:
|
||||
- create a new operation ID for the new context, marking it as a child of
|
||||
the previous operation.
|
||||
- use the family and name information for tracing and stats collection
|
||||
purposes, rather than those from the original context
|
||||
|
||||
If the context argument is NULL, then a new root context is created. This
|
||||
is particularly important for tracing purposes (the trace spans generated
|
||||
will be unassociated with any other trace spans, except those
|
||||
downstream). The trace_mask will be used for tracing
|
||||
operations associated with the new context.
|
||||
|
||||
@param context The base context. Can be NULL.
|
||||
@param family Family name to associate with the trace
|
||||
@param name Name within family to associate with traces/stats
|
||||
@param trace_mask An OR of census_trace_mask_values values. Only used if
|
||||
context is NULL.
|
||||
|
||||
@return A new census context.
|
||||
*/
|
||||
CENSUSAPI census_context *census_start_op(census_context *context,
|
||||
const char *family, const char *name,
|
||||
int trace_mask);
|
||||
|
||||
/**
|
||||
End an operation started by any of the census_start_*_op*() calls. The
|
||||
context used in this call will no longer be valid once this function
|
||||
completes.
|
||||
|
||||
@param context Context associated with operation which is ending.
|
||||
@param status status associated with the operation. Not interpreted by
|
||||
census.
|
||||
*/
|
||||
CENSUSAPI void census_end_op(census_context *context, int status);
|
||||
|
||||
#define CENSUS_TRACE_RECORD_START_OP ((uint32_t)0)
|
||||
#define CENSUS_TRACE_RECORD_END_OP ((uint32_t)1)
|
||||
|
||||
/** Insert a trace record into the trace stream. The record consists of an
|
||||
arbitrary size buffer, the size of which is provided in 'n'.
|
||||
@param context Trace context
|
||||
@param type User-defined type to associate with trace entry.
|
||||
@param buffer Pointer to buffer to use
|
||||
@param n Number of bytes in buffer
|
||||
*/
|
||||
CENSUSAPI void census_trace_print(census_context *context, uint32_t type,
|
||||
const char *buffer, size_t n);
|
||||
|
||||
/** Trace record. */
|
||||
typedef struct {
|
||||
census_timestamp timestamp; /** Time of record creation */
|
||||
uint64_t trace_id; /** Trace ID associated with record */
|
||||
uint64_t op_id; /** Operation ID associated with record */
|
||||
uint32_t type; /** Type (as used in census_trace_print() */
|
||||
const char *buffer; /** Buffer (from census_trace_print() */
|
||||
size_t buf_size; /** Number of bytes inside buffer */
|
||||
} census_trace_record;
|
||||
|
||||
/** Start a scan of existing trace records. While a scan is ongoing, addition
|
||||
of new trace records will be blocked if the underlying trace buffers
|
||||
fill up, so trace processing systems should endeavor to complete
|
||||
reading as soon as possible.
|
||||
@param consume if non-zero, indicates that reading records also "consumes"
|
||||
the previously read record - i.e. releases space in the trace log
|
||||
while scanning is ongoing.
|
||||
@returns 0 on success, non-zero on failure (e.g. if a scan is already ongoing)
|
||||
*/
|
||||
CENSUSAPI int census_trace_scan_start(int consume);
|
||||
|
||||
/** Get a trace record. The data pointed to by the trace buffer is guaranteed
|
||||
stable until the next census_get_trace_record() call (if the consume
|
||||
argument to census_trace_scan_start was non-zero) or census_trace_scan_end()
|
||||
is called (otherwise).
|
||||
@param trace_record structure that will be filled in with oldest trace record.
|
||||
@returns -1 if an error occurred (e.g. no previous call to
|
||||
census_trace_scan_start()), 0 if there is no more trace data (and
|
||||
trace_record will not be modified) or 1 otherwise.
|
||||
*/
|
||||
CENSUSAPI int census_get_trace_record(census_trace_record *trace_record);
|
||||
|
||||
/** End a scan previously started by census_trace_scan_start() */
|
||||
CENSUSAPI void census_trace_scan_end();
|
||||
|
||||
/** Core stats collection API's. The following concepts are used:
|
||||
* Resource: Users record measurements for a single resource. Examples
|
||||
include RPC latency, CPU seconds consumed, and bytes transmitted.
|
||||
* Aggregation: An aggregation of a set of measurements. Census supports the
|
||||
following aggregation types:
|
||||
* Distribution - statistical distribution information, used for
|
||||
recording average, standard deviation etc. Can include a histogram.
|
||||
* Interval - a count of events that happen in a rolling time window.
|
||||
* View: A view is a combination of a Resource, a set of tag keys and an
|
||||
Aggregation. When a measurement for a Resource matches the View tags, it is
|
||||
recorded (for each unique set of tag values) using the Aggregation type.
|
||||
Each resource can have an arbitrary number of views by which it will be
|
||||
broken down.
|
||||
|
||||
Census uses protos to define each of the above, and output results. This
|
||||
ensures unification across the different language and runtime
|
||||
implementations. The proto definitions can be found in src/proto/census.
|
||||
*/
|
||||
|
||||
/** Define a new resource. `resource_pb` should contain an encoded Resource
|
||||
protobuf, `resource_pb_size` being the size of the buffer. Returns a -ve
|
||||
value on error, or a positive (>= 0) resource id (for use in
|
||||
census_delete_resource() and census_record_values()). In order to be valid, a
|
||||
resource must have a name, and at least one numerator in its unit type. The
|
||||
resource name must be unique, and an error will be returned if it is not. */
|
||||
CENSUSAPI int32_t census_define_resource(const uint8_t *resource_pb,
|
||||
size_t resource_pb_size);
|
||||
|
||||
/** Delete a resource created by census_define_resource(). */
|
||||
CENSUSAPI void census_delete_resource(int32_t resource_id);
|
||||
|
||||
/** Determine the id of a resource, given its name. returns -1 if the resource
|
||||
does not exist. */
|
||||
CENSUSAPI int32_t census_resource_id(const char *name);
|
||||
|
||||
/** A single value to be recorded comprises two parts: an ID for the particular
|
||||
* resource and the value to be recorded against it. */
|
||||
typedef struct {
|
||||
int32_t resource_id;
|
||||
double value;
|
||||
} census_value;
|
||||
|
||||
/** Record new usage values against the given context. */
|
||||
CENSUSAPI void census_record_values(census_context *context,
|
||||
census_value *values, size_t nvalues);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_CENSUS_H */
|
||||
@@ -1,70 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_COMPRESSION_H
|
||||
#define GRPC_COMPRESSION_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <grpc/impl/codegen/compression_types.h>
|
||||
#include <grpc/slice.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Parses the first \a name_length bytes of \a name as a
|
||||
* grpc_compression_algorithm instance, updating \a algorithm. Returns 1 upon
|
||||
* success, 0 otherwise. */
|
||||
GRPCAPI int grpc_compression_algorithm_parse(
|
||||
grpc_slice value, grpc_compression_algorithm *algorithm);
|
||||
|
||||
/** Updates \a name with the encoding name corresponding to a valid \a
|
||||
* algorithm. Note that \a name is statically allocated and must *not* be freed.
|
||||
* Returns 1 upon success, 0 otherwise. */
|
||||
GRPCAPI int grpc_compression_algorithm_name(
|
||||
grpc_compression_algorithm algorithm, char **name);
|
||||
|
||||
/** Returns the compression algorithm corresponding to \a level for the
|
||||
* compression algorithms encoded in the \a accepted_encodings bitset.
|
||||
*
|
||||
* It abort()s for unknown levels . */
|
||||
GRPCAPI grpc_compression_algorithm grpc_compression_algorithm_for_level(
|
||||
grpc_compression_level level, uint32_t accepted_encodings);
|
||||
|
||||
GRPCAPI void grpc_compression_options_init(grpc_compression_options *opts);
|
||||
|
||||
/** Mark \a algorithm as enabled in \a opts. */
|
||||
GRPCAPI void grpc_compression_options_enable_algorithm(
|
||||
grpc_compression_options *opts, grpc_compression_algorithm algorithm);
|
||||
|
||||
/** Mark \a algorithm as disabled in \a opts. */
|
||||
GRPCAPI void grpc_compression_options_disable_algorithm(
|
||||
grpc_compression_options *opts, grpc_compression_algorithm algorithm);
|
||||
|
||||
/** Returns true if \a algorithm is marked as enabled in \a opts. */
|
||||
GRPCAPI int grpc_compression_options_is_algorithm_enabled(
|
||||
const grpc_compression_options *opts, grpc_compression_algorithm algorithm);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_COMPRESSION_H */
|
||||
@@ -1,450 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015-2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_GRPC_H
|
||||
#define GRPC_GRPC_H
|
||||
|
||||
#include <grpc/status.h>
|
||||
|
||||
#include <grpc/byte_buffer.h>
|
||||
#include <grpc/impl/codegen/connectivity_state.h>
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
#include <grpc/impl/codegen/propagation_bits.h>
|
||||
#include <grpc/slice.h>
|
||||
#include <grpc/support/time.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \mainpage GRPC Core
|
||||
*
|
||||
* The GRPC Core library is a low-level library designed to be wrapped by higher
|
||||
* level libraries. The top-level API is provided in grpc.h. Security related
|
||||
* functionality lives in grpc_security.h.
|
||||
*/
|
||||
|
||||
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array);
|
||||
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array);
|
||||
|
||||
GRPCAPI void grpc_call_details_init(grpc_call_details *details);
|
||||
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details);
|
||||
|
||||
/** Registers a plugin to be initialized and destroyed with the library.
|
||||
|
||||
The \a init and \a destroy functions will be invoked as part of
|
||||
\a grpc_init() and \a grpc_shutdown(), respectively.
|
||||
Note that these functions can be invoked an arbitrary number of times
|
||||
(and hence so will \a init and \a destroy).
|
||||
It is safe to pass NULL to either argument. Plugins are destroyed in
|
||||
the reverse order they were initialized. */
|
||||
GRPCAPI void grpc_register_plugin(void (*init)(void), void (*destroy)(void));
|
||||
|
||||
/** Initialize the grpc library.
|
||||
|
||||
It is not safe to call any other grpc functions before calling this.
|
||||
(To avoid overhead, little checking is done, and some things may work. We
|
||||
do not warrant that they will continue to do so in future revisions of this
|
||||
library). */
|
||||
GRPCAPI void grpc_init(void);
|
||||
|
||||
/** Shut down the grpc library.
|
||||
|
||||
No memory is used by grpc after this call returns, nor are any instructions
|
||||
executing within the grpc library.
|
||||
Prior to calling, all application owned grpc objects must have been
|
||||
destroyed. */
|
||||
GRPCAPI void grpc_shutdown(void);
|
||||
|
||||
/** Return a string representing the current version of grpc */
|
||||
GRPCAPI const char *grpc_version_string(void);
|
||||
|
||||
/** Return a string specifying what the 'g' in gRPC stands for */
|
||||
GRPCAPI const char *grpc_g_stands_for(void);
|
||||
|
||||
/** Returns the completion queue factory based on the attributes. MAY return a
|
||||
NULL if no factory can be found */
|
||||
GRPCAPI const grpc_completion_queue_factory *
|
||||
grpc_completion_queue_factory_lookup(
|
||||
const grpc_completion_queue_attributes *attributes);
|
||||
|
||||
/** Helper function to create a completion queue with grpc_cq_completion_type
|
||||
of GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */
|
||||
GRPCAPI grpc_completion_queue *grpc_completion_queue_create_for_next(
|
||||
void *reserved);
|
||||
|
||||
/** Helper function to create a completion queue with grpc_cq_completion_type
|
||||
of GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */
|
||||
GRPCAPI grpc_completion_queue *grpc_completion_queue_create_for_pluck(
|
||||
void *reserved);
|
||||
|
||||
/** Create a completion queue */
|
||||
GRPCAPI grpc_completion_queue *grpc_completion_queue_create(
|
||||
const grpc_completion_queue_factory *factory,
|
||||
const grpc_completion_queue_attributes *attributes, void *reserved);
|
||||
|
||||
/** Blocks until an event is available, the completion queue is being shut down,
|
||||
or deadline is reached.
|
||||
|
||||
Returns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout,
|
||||
otherwise a grpc_event describing the event that occurred.
|
||||
|
||||
Callers must not call grpc_completion_queue_next and
|
||||
grpc_completion_queue_pluck simultaneously on the same completion queue. */
|
||||
GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue *cq,
|
||||
gpr_timespec deadline,
|
||||
void *reserved);
|
||||
|
||||
/** Blocks until an event with tag 'tag' is available, the completion queue is
|
||||
being shutdown or deadline is reached.
|
||||
|
||||
Returns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout,
|
||||
otherwise a grpc_event describing the event that occurred.
|
||||
|
||||
Callers must not call grpc_completion_queue_next and
|
||||
grpc_completion_queue_pluck simultaneously on the same completion queue.
|
||||
|
||||
Completion queues support a maximum of GRPC_MAX_COMPLETION_QUEUE_PLUCKERS
|
||||
concurrently executing plucks at any time. */
|
||||
GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cq,
|
||||
void *tag, gpr_timespec deadline,
|
||||
void *reserved);
|
||||
|
||||
/** Maximum number of outstanding grpc_completion_queue_pluck executions per
|
||||
completion queue */
|
||||
#define GRPC_MAX_COMPLETION_QUEUE_PLUCKERS 6
|
||||
|
||||
/** Begin destruction of a completion queue. Once all possible events are
|
||||
drained then grpc_completion_queue_next will start to produce
|
||||
GRPC_QUEUE_SHUTDOWN events only. At that point it's safe to call
|
||||
grpc_completion_queue_destroy.
|
||||
|
||||
After calling this function applications should ensure that no
|
||||
NEW work is added to be published on this completion queue. */
|
||||
GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue *cq);
|
||||
|
||||
/** Destroy a completion queue. The caller must ensure that the queue is
|
||||
drained and no threads are executing grpc_completion_queue_next */
|
||||
GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue *cq);
|
||||
|
||||
/** Create a completion queue alarm instance associated to \a cq.
|
||||
*
|
||||
* Once the alarm expires (at \a deadline) or it's cancelled (see \a
|
||||
* grpc_alarm_cancel), an event with tag \a tag will be added to \a cq. If the
|
||||
* alarm expired, the event's success bit will be true, false otherwise (ie,
|
||||
* upon cancellation). */
|
||||
GRPCAPI grpc_alarm *grpc_alarm_create(grpc_completion_queue *cq,
|
||||
gpr_timespec deadline, void *tag);
|
||||
|
||||
/** Cancel a completion queue alarm. Calling this function over an alarm that
|
||||
* has already fired has no effect. */
|
||||
GRPCAPI void grpc_alarm_cancel(grpc_alarm *alarm);
|
||||
|
||||
/** Destroy the given completion queue alarm, cancelling it in the process. */
|
||||
GRPCAPI void grpc_alarm_destroy(grpc_alarm *alarm);
|
||||
|
||||
/** Check the connectivity state of a channel. */
|
||||
GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state(
|
||||
grpc_channel *channel, int try_to_connect);
|
||||
|
||||
/** Number of active "external connectivity state watchers" attached to a
|
||||
* channel.
|
||||
* Useful for testing. **/
|
||||
GRPCAPI int grpc_channel_num_external_connectivity_watchers(
|
||||
grpc_channel *channel);
|
||||
|
||||
/** Watch for a change in connectivity state.
|
||||
Once the channel connectivity state is different from last_observed_state,
|
||||
tag will be enqueued on cq with success=1.
|
||||
If deadline expires BEFORE the state is changed, tag will be enqueued on cq
|
||||
with success=0. */
|
||||
GRPCAPI void grpc_channel_watch_connectivity_state(
|
||||
grpc_channel *channel, grpc_connectivity_state last_observed_state,
|
||||
gpr_timespec deadline, grpc_completion_queue *cq, void *tag);
|
||||
|
||||
/** Create a call given a grpc_channel, in order to call 'method'. All
|
||||
completions are sent to 'completion_queue'. 'method' and 'host' need only
|
||||
live through the invocation of this function.
|
||||
If parent_call is non-NULL, it must be a server-side call. It will be used
|
||||
to propagate properties from the server call to this new client call,
|
||||
depending on the value of \a propagation_mask (see propagation_bits.h for
|
||||
possible values). */
|
||||
GRPCAPI grpc_call *grpc_channel_create_call(
|
||||
grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask,
|
||||
grpc_completion_queue *completion_queue, grpc_slice method,
|
||||
const grpc_slice *host, gpr_timespec deadline, void *reserved);
|
||||
|
||||
/** Ping the channels peer (load balanced channels will select one sub-channel
|
||||
to ping); if the channel is not connected, posts a failed. */
|
||||
GRPCAPI void grpc_channel_ping(grpc_channel *channel, grpc_completion_queue *cq,
|
||||
void *tag, void *reserved);
|
||||
|
||||
/** Pre-register a method/host pair on a channel. */
|
||||
GRPCAPI void *grpc_channel_register_call(grpc_channel *channel,
|
||||
const char *method, const char *host,
|
||||
void *reserved);
|
||||
|
||||
/** Create a call given a handle returned from grpc_channel_register_call.
|
||||
\sa grpc_channel_create_call. */
|
||||
GRPCAPI grpc_call *grpc_channel_create_registered_call(
|
||||
grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask,
|
||||
grpc_completion_queue *completion_queue, void *registered_call_handle,
|
||||
gpr_timespec deadline, void *reserved);
|
||||
|
||||
/** Allocate memory in the grpc_call arena: this memory is automatically
|
||||
discarded at call completion */
|
||||
GRPCAPI void *grpc_call_arena_alloc(grpc_call *call, size_t size);
|
||||
|
||||
/** Start a batch of operations defined in the array ops; when complete, post a
|
||||
completion of type 'tag' to the completion queue bound to the call.
|
||||
The order of ops specified in the batch has no significance.
|
||||
Only one operation of each type can be active at once in any given
|
||||
batch.
|
||||
If a call to grpc_call_start_batch returns GRPC_CALL_OK you must call
|
||||
grpc_completion_queue_next or grpc_completion_queue_pluck on the completion
|
||||
queue associated with 'call' for work to be performed. If a call to
|
||||
grpc_call_start_batch returns any value other than GRPC_CALL_OK it is
|
||||
guaranteed that no state associated with 'call' is changed and it is not
|
||||
appropriate to call grpc_completion_queue_next or
|
||||
grpc_completion_queue_pluck consequent to the failed grpc_call_start_batch
|
||||
call.
|
||||
THREAD SAFETY: access to grpc_call_start_batch in multi-threaded environment
|
||||
needs to be synchronized. As an optimization, you may synchronize batches
|
||||
containing just send operations independently from batches containing just
|
||||
receive operations. */
|
||||
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call,
|
||||
const grpc_op *ops, size_t nops,
|
||||
void *tag, void *reserved);
|
||||
|
||||
/** Returns a newly allocated string representing the endpoint to which this
|
||||
call is communicating with. The string is in the uri format accepted by
|
||||
grpc_channel_create.
|
||||
The returned string should be disposed of with gpr_free().
|
||||
|
||||
WARNING: this value is never authenticated or subject to any security
|
||||
related code. It must not be used for any authentication related
|
||||
functionality. Instead, use grpc_auth_context. */
|
||||
GRPCAPI char *grpc_call_get_peer(grpc_call *call);
|
||||
|
||||
struct census_context;
|
||||
|
||||
/** Set census context for a call; Must be called before first call to
|
||||
grpc_call_start_batch(). */
|
||||
GRPCAPI void grpc_census_call_set_context(grpc_call *call,
|
||||
struct census_context *context);
|
||||
|
||||
/** Retrieve the calls current census context. */
|
||||
GRPCAPI struct census_context *grpc_census_call_get_context(grpc_call *call);
|
||||
|
||||
/** Return a newly allocated string representing the target a channel was
|
||||
created for. */
|
||||
GRPCAPI char *grpc_channel_get_target(grpc_channel *channel);
|
||||
|
||||
/** Request info about the channel.
|
||||
\a channel_info indicates what information is being requested and
|
||||
how that information will be returned.
|
||||
\a channel_info is owned by the caller. */
|
||||
GRPCAPI void grpc_channel_get_info(grpc_channel *channel,
|
||||
const grpc_channel_info *channel_info);
|
||||
|
||||
/** Create a client channel to 'target'. Additional channel level configuration
|
||||
MAY be provided by grpc_channel_args, though the expectation is that most
|
||||
clients will want to simply pass NULL. See grpc_channel_args definition for
|
||||
more on this. The data in 'args' need only live through the invocation of
|
||||
this function. */
|
||||
GRPCAPI grpc_channel *grpc_insecure_channel_create(
|
||||
const char *target, const grpc_channel_args *args, void *reserved);
|
||||
|
||||
/** Create a lame client: this client fails every operation attempted on it. */
|
||||
GRPCAPI grpc_channel *grpc_lame_client_channel_create(
|
||||
const char *target, grpc_status_code error_code, const char *error_message);
|
||||
|
||||
/** Close and destroy a grpc channel */
|
||||
GRPCAPI void grpc_channel_destroy(grpc_channel *channel);
|
||||
|
||||
/** Error handling for grpc_call
|
||||
Most grpc_call functions return a grpc_error. If the error is not GRPC_OK
|
||||
then the operation failed due to some unsatisfied precondition.
|
||||
If a grpc_call fails, it's guaranteed that no change to the call state
|
||||
has been made. */
|
||||
|
||||
/** Called by clients to cancel an RPC on the server.
|
||||
Can be called multiple times, from any thread.
|
||||
THREAD-SAFETY grpc_call_cancel and grpc_call_cancel_with_status
|
||||
are thread-safe, and can be called at any point before grpc_call_unref
|
||||
is called.*/
|
||||
GRPCAPI grpc_call_error grpc_call_cancel(grpc_call *call, void *reserved);
|
||||
|
||||
/** Called by clients to cancel an RPC on the server.
|
||||
Can be called multiple times, from any thread.
|
||||
If a status has not been received for the call, set it to the status code
|
||||
and description passed in.
|
||||
Importantly, this function does not send status nor description to the
|
||||
remote endpoint.
|
||||
Note that \a description doesn't need be a static string.
|
||||
It doesn't need to be alive after the call to
|
||||
grpc_call_cancel_with_status completes.
|
||||
*/
|
||||
GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call *call,
|
||||
grpc_status_code status,
|
||||
const char *description,
|
||||
void *reserved);
|
||||
|
||||
/** Ref a call.
|
||||
THREAD SAFETY: grpc_call_unref is thread-compatible */
|
||||
GRPCAPI void grpc_call_ref(grpc_call *call);
|
||||
|
||||
/** Unref a call.
|
||||
THREAD SAFETY: grpc_call_unref is thread-compatible */
|
||||
GRPCAPI void grpc_call_unref(grpc_call *call);
|
||||
|
||||
/** Request notification of a new call.
|
||||
Once a call is received, a notification tagged with \a tag_new is added to
|
||||
\a cq_for_notification. \a call, \a details and \a request_metadata are
|
||||
updated with the appropriate call information. \a cq_bound_to_call is bound
|
||||
to \a call, and batch operation notifications for that call will be posted
|
||||
to \a cq_bound_to_call.
|
||||
Note that \a cq_for_notification must have been registered to the server via
|
||||
\a grpc_server_register_completion_queue. */
|
||||
GRPCAPI grpc_call_error grpc_server_request_call(
|
||||
grpc_server *server, grpc_call **call, grpc_call_details *details,
|
||||
grpc_metadata_array *request_metadata,
|
||||
grpc_completion_queue *cq_bound_to_call,
|
||||
grpc_completion_queue *cq_for_notification, void *tag_new);
|
||||
|
||||
/** How to handle payloads for a registered method */
|
||||
typedef enum {
|
||||
/** Don't try to read the payload */
|
||||
GRPC_SRM_PAYLOAD_NONE,
|
||||
/** Read the initial payload as a byte buffer */
|
||||
GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER
|
||||
} grpc_server_register_method_payload_handling;
|
||||
|
||||
/** Registers a method in the server.
|
||||
Methods to this (host, method) pair will not be reported by
|
||||
grpc_server_request_call, but instead be reported by
|
||||
grpc_server_request_registered_call when passed the appropriate
|
||||
registered_method (as returned by this function).
|
||||
Must be called before grpc_server_start.
|
||||
Returns NULL on failure. */
|
||||
GRPCAPI void *grpc_server_register_method(
|
||||
grpc_server *server, const char *method, const char *host,
|
||||
grpc_server_register_method_payload_handling payload_handling,
|
||||
uint32_t flags);
|
||||
|
||||
/** Request notification of a new pre-registered call. 'cq_for_notification'
|
||||
must have been registered to the server via
|
||||
grpc_server_register_completion_queue. */
|
||||
GRPCAPI grpc_call_error grpc_server_request_registered_call(
|
||||
grpc_server *server, void *registered_method, grpc_call **call,
|
||||
gpr_timespec *deadline, grpc_metadata_array *request_metadata,
|
||||
grpc_byte_buffer **optional_payload,
|
||||
grpc_completion_queue *cq_bound_to_call,
|
||||
grpc_completion_queue *cq_for_notification, void *tag_new);
|
||||
|
||||
/** Create a server. Additional configuration for each incoming channel can
|
||||
be specified with args. If no additional configuration is needed, args can
|
||||
be NULL. See grpc_channel_args for more. The data in 'args' need only live
|
||||
through the invocation of this function. */
|
||||
GRPCAPI grpc_server *grpc_server_create(const grpc_channel_args *args,
|
||||
void *reserved);
|
||||
|
||||
/** Register a completion queue with the server. Must be done for any
|
||||
notification completion queue that is passed to grpc_server_request_*_call
|
||||
and to grpc_server_shutdown_and_notify. Must be performed prior to
|
||||
grpc_server_start. */
|
||||
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server,
|
||||
grpc_completion_queue *cq,
|
||||
void *reserved);
|
||||
|
||||
/** Add a HTTP2 over plaintext over tcp listener.
|
||||
Returns bound port number on success, 0 on failure.
|
||||
REQUIRES: server not started */
|
||||
GRPCAPI int grpc_server_add_insecure_http2_port(grpc_server *server,
|
||||
const char *addr);
|
||||
|
||||
/** Start a server - tells all listeners to start listening */
|
||||
GRPCAPI void grpc_server_start(grpc_server *server);
|
||||
|
||||
/** Begin shutting down a server.
|
||||
After completion, no new calls or connections will be admitted.
|
||||
Existing calls will be allowed to complete.
|
||||
Send a GRPC_OP_COMPLETE event when there are no more calls being serviced.
|
||||
Shutdown is idempotent, and all tags will be notified at once if multiple
|
||||
grpc_server_shutdown_and_notify calls are made. 'cq' must have been
|
||||
registered to this server via grpc_server_register_completion_queue. */
|
||||
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server,
|
||||
grpc_completion_queue *cq,
|
||||
void *tag);
|
||||
|
||||
/** Cancel all in-progress calls.
|
||||
Only usable after shutdown. */
|
||||
GRPCAPI void grpc_server_cancel_all_calls(grpc_server *server);
|
||||
|
||||
/** Destroy a server.
|
||||
Shutdown must have completed beforehand (i.e. all tags generated by
|
||||
grpc_server_shutdown_and_notify must have been received, and at least
|
||||
one call to grpc_server_shutdown_and_notify must have been made). */
|
||||
GRPCAPI void grpc_server_destroy(grpc_server *server);
|
||||
|
||||
/** Enable or disable a tracer.
|
||||
|
||||
Tracers (usually controlled by the environment variable GRPC_TRACE)
|
||||
allow printf-style debugging on GRPC internals, and are useful for
|
||||
tracking down problems in the field.
|
||||
|
||||
Use of this function is not strictly thread-safe, but the
|
||||
thread-safety issues raised by it should not be of concern. */
|
||||
GRPCAPI int grpc_tracer_set_enabled(const char *name, int enabled);
|
||||
|
||||
/** Check whether a metadata key is legal (will be accepted by core) */
|
||||
GRPCAPI int grpc_header_key_is_legal(grpc_slice slice);
|
||||
|
||||
/** Check whether a non-binary metadata value is legal (will be accepted by
|
||||
core) */
|
||||
GRPCAPI int grpc_header_nonbin_value_is_legal(grpc_slice slice);
|
||||
|
||||
/** Check whether a metadata key corresponds to a binary value */
|
||||
GRPCAPI int grpc_is_binary_header(grpc_slice slice);
|
||||
|
||||
/** Convert grpc_call_error values to a string */
|
||||
GRPCAPI const char *grpc_call_error_to_string(grpc_call_error error);
|
||||
|
||||
/** Create a buffer pool */
|
||||
GRPCAPI grpc_resource_quota *grpc_resource_quota_create(const char *trace_name);
|
||||
|
||||
/** Add a reference to a buffer pool */
|
||||
GRPCAPI void grpc_resource_quota_ref(grpc_resource_quota *resource_quota);
|
||||
|
||||
/** Drop a reference to a buffer pool */
|
||||
GRPCAPI void grpc_resource_quota_unref(grpc_resource_quota *resource_quota);
|
||||
|
||||
/** Update the size of a buffer pool */
|
||||
GRPCAPI void grpc_resource_quota_resize(grpc_resource_quota *resource_quota,
|
||||
size_t new_size);
|
||||
|
||||
/** Fetch a vtable for a grpc_channel_arg that points to a grpc_resource_quota
|
||||
*/
|
||||
GRPCAPI const grpc_arg_pointer_vtable *grpc_resource_quota_arg_vtable(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_H */
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_GRPC_CRONET_H
|
||||
#define GRPC_GRPC_CRONET_H
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
GRPCAPI grpc_channel *grpc_cronet_secure_channel_create(
|
||||
void *engine, const char *target, const grpc_channel_args *args,
|
||||
void *reserved);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_CRONET_H */
|
||||
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_GRPC_POSIX_H
|
||||
#define GRPC_GRPC_POSIX_H
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*! \mainpage GRPC Core POSIX
|
||||
*
|
||||
* The GRPC Core POSIX library provides some POSIX-specific low-level
|
||||
* functionality on top of GRPC Core.
|
||||
*/
|
||||
|
||||
/** Create a client channel to 'target' using file descriptor 'fd'. The 'target'
|
||||
argument will be used to indicate the name for this channel. See the comment
|
||||
for grpc_insecure_channel_create for description of 'args' argument. */
|
||||
GRPCAPI grpc_channel *grpc_insecure_channel_create_from_fd(
|
||||
const char *target, int fd, const grpc_channel_args *args);
|
||||
|
||||
/** Add the connected communication channel based on file descriptor 'fd' to the
|
||||
'server'. The 'fd' must be an open file descriptor corresponding to a
|
||||
connected socket. Events from the file descriptor may come on any of the
|
||||
server completion queues (i.e completion queues registered via the
|
||||
grpc_server_register_completion_queue API).
|
||||
|
||||
The 'reserved' pointer MUST be NULL.
|
||||
*/
|
||||
GRPCAPI void grpc_server_add_insecure_channel_from_fd(grpc_server *server,
|
||||
void *reserved, int fd);
|
||||
|
||||
/** GRPC Core POSIX library may internally use signals to optimize some work.
|
||||
The library uses (SIGRTMIN + 6) signal by default. Use this API to instruct
|
||||
the library to use a different signal i.e 'signum' instead.
|
||||
Note:
|
||||
- To prevent GRPC library from using any signals, pass a 'signum' of -1
|
||||
- This API is optional but if called, it MUST be called before grpc_init() */
|
||||
GRPCAPI void grpc_use_signal(int signum);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_POSIX_H */
|
||||
@@ -1,375 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_GRPC_SECURITY_H
|
||||
#define GRPC_GRPC_SECURITY_H
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/grpc_security_constants.h>
|
||||
#include <grpc/status.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** --- Authentication Context. --- */
|
||||
|
||||
typedef struct grpc_auth_context grpc_auth_context;
|
||||
|
||||
typedef struct grpc_auth_property_iterator {
|
||||
const grpc_auth_context *ctx;
|
||||
size_t index;
|
||||
const char *name;
|
||||
} grpc_auth_property_iterator;
|
||||
|
||||
/** value, if not NULL, is guaranteed to be NULL terminated. */
|
||||
typedef struct grpc_auth_property {
|
||||
char *name;
|
||||
char *value;
|
||||
size_t value_length;
|
||||
} grpc_auth_property;
|
||||
|
||||
/** Returns NULL when the iterator is at the end. */
|
||||
GRPCAPI const grpc_auth_property *grpc_auth_property_iterator_next(
|
||||
grpc_auth_property_iterator *it);
|
||||
|
||||
/** Iterates over the auth context. */
|
||||
GRPCAPI grpc_auth_property_iterator
|
||||
grpc_auth_context_property_iterator(const grpc_auth_context *ctx);
|
||||
|
||||
/** Gets the peer identity. Returns an empty iterator (first _next will return
|
||||
NULL) if the peer is not authenticated. */
|
||||
GRPCAPI grpc_auth_property_iterator
|
||||
grpc_auth_context_peer_identity(const grpc_auth_context *ctx);
|
||||
|
||||
/** Finds a property in the context. May return an empty iterator (first _next
|
||||
will return NULL) if no property with this name was found in the context. */
|
||||
GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name(
|
||||
const grpc_auth_context *ctx, const char *name);
|
||||
|
||||
/** Gets the name of the property that indicates the peer identity. Will return
|
||||
NULL if the peer is not authenticated. */
|
||||
GRPCAPI const char *grpc_auth_context_peer_identity_property_name(
|
||||
const grpc_auth_context *ctx);
|
||||
|
||||
/** Returns 1 if the peer is authenticated, 0 otherwise. */
|
||||
GRPCAPI int grpc_auth_context_peer_is_authenticated(
|
||||
const grpc_auth_context *ctx);
|
||||
|
||||
/** Gets the auth context from the call. Caller needs to call
|
||||
grpc_auth_context_release on the returned context. */
|
||||
GRPCAPI grpc_auth_context *grpc_call_auth_context(grpc_call *call);
|
||||
|
||||
/** Releases the auth context returned from grpc_call_auth_context. */
|
||||
GRPCAPI void grpc_auth_context_release(grpc_auth_context *context);
|
||||
|
||||
/** --
|
||||
The following auth context methods should only be called by a server metadata
|
||||
processor to set properties extracted from auth metadata.
|
||||
-- */
|
||||
|
||||
/** Add a property. */
|
||||
GRPCAPI void grpc_auth_context_add_property(grpc_auth_context *ctx,
|
||||
const char *name, const char *value,
|
||||
size_t value_length);
|
||||
|
||||
/** Add a C string property. */
|
||||
GRPCAPI void grpc_auth_context_add_cstring_property(grpc_auth_context *ctx,
|
||||
const char *name,
|
||||
const char *value);
|
||||
|
||||
/** Sets the property name. Returns 1 if successful or 0 in case of failure
|
||||
(which means that no property with this name exists). */
|
||||
GRPCAPI int grpc_auth_context_set_peer_identity_property_name(
|
||||
grpc_auth_context *ctx, const char *name);
|
||||
|
||||
/** --- grpc_channel_credentials object. ---
|
||||
|
||||
A channel credentials object represents a way to authenticate a client on a
|
||||
channel. */
|
||||
|
||||
typedef struct grpc_channel_credentials grpc_channel_credentials;
|
||||
|
||||
/** Releases a channel credentials object.
|
||||
The creator of the credentials object is responsible for its release. */
|
||||
GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials *creds);
|
||||
|
||||
/** Creates default credentials to connect to a google gRPC service.
|
||||
WARNING: Do NOT use this credentials to connect to a non-google service as
|
||||
this could result in an oauth2 token leak. */
|
||||
GRPCAPI grpc_channel_credentials *grpc_google_default_credentials_create(void);
|
||||
|
||||
/** Callback for getting the SSL roots override from the application.
|
||||
In case of success, *pem_roots_certs must be set to a NULL terminated string
|
||||
containing the list of PEM encoded root certificates. The ownership is passed
|
||||
to the core and freed (laster by the core) with gpr_free.
|
||||
If this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is
|
||||
set to a valid path, it will override the roots specified this func */
|
||||
typedef grpc_ssl_roots_override_result (*grpc_ssl_roots_override_callback)(
|
||||
char **pem_root_certs);
|
||||
|
||||
/** Setup a callback to override the default TLS/SSL roots.
|
||||
This function is not thread-safe and must be called at initialization time
|
||||
before any ssl credentials are created to have the desired side effect.
|
||||
If GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is set to a valid path, the
|
||||
callback will not be called. */
|
||||
GRPCAPI void grpc_set_ssl_roots_override_callback(
|
||||
grpc_ssl_roots_override_callback cb);
|
||||
|
||||
/** Object that holds a private key / certificate chain pair in PEM format. */
|
||||
typedef struct {
|
||||
/** private_key is the NULL-terminated string containing the PEM encoding of
|
||||
the client's private key. */
|
||||
const char *private_key;
|
||||
|
||||
/** cert_chain is the NULL-terminated string containing the PEM encoding of
|
||||
the client's certificate chain. */
|
||||
const char *cert_chain;
|
||||
} grpc_ssl_pem_key_cert_pair;
|
||||
|
||||
/** Creates an SSL credentials object.
|
||||
- pem_root_certs is the NULL-terminated string containing the PEM encoding
|
||||
of the server root certificates. If this parameter is NULL, the
|
||||
implementation will first try to dereference the file pointed by the
|
||||
GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable, and if that fails,
|
||||
try to get the roots set by grpc_override_ssl_default_roots. Eventually,
|
||||
if all these fail, it will try to get the roots from a well-known place on
|
||||
disk (in the grpc install directory).
|
||||
- pem_key_cert_pair is a pointer on the object containing client's private
|
||||
key and certificate chain. This parameter can be NULL if the client does
|
||||
not have such a key/cert pair. */
|
||||
GRPCAPI grpc_channel_credentials *grpc_ssl_credentials_create(
|
||||
const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,
|
||||
void *reserved);
|
||||
|
||||
/** --- grpc_call_credentials object.
|
||||
|
||||
A call credentials object represents a way to authenticate on a particular
|
||||
call. These credentials can be composed with a channel credentials object
|
||||
so that they are sent with every call on this channel. */
|
||||
|
||||
typedef struct grpc_call_credentials grpc_call_credentials;
|
||||
|
||||
/** Releases a call credentials object.
|
||||
The creator of the credentials object is responsible for its release. */
|
||||
GRPCAPI void grpc_call_credentials_release(grpc_call_credentials *creds);
|
||||
|
||||
/** Creates a composite channel credentials object. */
|
||||
GRPCAPI grpc_channel_credentials *grpc_composite_channel_credentials_create(
|
||||
grpc_channel_credentials *channel_creds, grpc_call_credentials *call_creds,
|
||||
void *reserved);
|
||||
|
||||
/** Creates a composite call credentials object. */
|
||||
GRPCAPI grpc_call_credentials *grpc_composite_call_credentials_create(
|
||||
grpc_call_credentials *creds1, grpc_call_credentials *creds2,
|
||||
void *reserved);
|
||||
|
||||
/** Creates a compute engine credentials object for connecting to Google.
|
||||
WARNING: Do NOT use this credentials to connect to a non-google service as
|
||||
this could result in an oauth2 token leak. */
|
||||
GRPCAPI grpc_call_credentials *grpc_google_compute_engine_credentials_create(
|
||||
void *reserved);
|
||||
|
||||
GRPCAPI gpr_timespec grpc_max_auth_token_lifetime();
|
||||
|
||||
/** Creates a JWT credentials object. May return NULL if the input is invalid.
|
||||
- json_key is the JSON key string containing the client's private key.
|
||||
- token_lifetime is the lifetime of each Json Web Token (JWT) created with
|
||||
this credentials. It should not exceed grpc_max_auth_token_lifetime or
|
||||
will be cropped to this value. */
|
||||
GRPCAPI grpc_call_credentials *
|
||||
grpc_service_account_jwt_access_credentials_create(const char *json_key,
|
||||
gpr_timespec token_lifetime,
|
||||
void *reserved);
|
||||
|
||||
/** Creates an Oauth2 Refresh Token credentials object for connecting to Google.
|
||||
May return NULL if the input is invalid.
|
||||
WARNING: Do NOT use this credentials to connect to a non-google service as
|
||||
this could result in an oauth2 token leak.
|
||||
- json_refresh_token is the JSON string containing the refresh token itself
|
||||
along with a client_id and client_secret. */
|
||||
GRPCAPI grpc_call_credentials *grpc_google_refresh_token_credentials_create(
|
||||
const char *json_refresh_token, void *reserved);
|
||||
|
||||
/** Creates an Oauth2 Access Token credentials with an access token that was
|
||||
aquired by an out of band mechanism. */
|
||||
GRPCAPI grpc_call_credentials *grpc_access_token_credentials_create(
|
||||
const char *access_token, void *reserved);
|
||||
|
||||
/** Creates an IAM credentials object for connecting to Google. */
|
||||
GRPCAPI grpc_call_credentials *grpc_google_iam_credentials_create(
|
||||
const char *authorization_token, const char *authority_selector,
|
||||
void *reserved);
|
||||
|
||||
/** Callback function to be called by the metadata credentials plugin
|
||||
implementation when the metadata is ready.
|
||||
- user_data is the opaque pointer that was passed in the get_metadata method
|
||||
of the grpc_metadata_credentials_plugin (see below).
|
||||
- creds_md is an array of credentials metadata produced by the plugin. It
|
||||
may be set to NULL in case of an error.
|
||||
- num_creds_md is the number of items in the creds_md array.
|
||||
- status must be GRPC_STATUS_OK in case of success or another specific error
|
||||
code otherwise.
|
||||
- error_details contains details about the error if any. In case of success
|
||||
it should be NULL and will be otherwise ignored. */
|
||||
typedef void (*grpc_credentials_plugin_metadata_cb)(
|
||||
void *user_data, const grpc_metadata *creds_md, size_t num_creds_md,
|
||||
grpc_status_code status, const char *error_details);
|
||||
|
||||
/** Context that can be used by metadata credentials plugin in order to create
|
||||
auth related metadata. */
|
||||
typedef struct {
|
||||
/** The fully qualifed service url. */
|
||||
const char *service_url;
|
||||
|
||||
/** The method name of the RPC being called (not fully qualified).
|
||||
The fully qualified method name can be built from the service_url:
|
||||
full_qualified_method_name = ctx->service_url + '/' + ctx->method_name. */
|
||||
const char *method_name;
|
||||
|
||||
/** The auth_context of the channel which gives the server's identity. */
|
||||
const grpc_auth_context *channel_auth_context;
|
||||
|
||||
/** Reserved for future use. */
|
||||
void *reserved;
|
||||
} grpc_auth_metadata_context;
|
||||
|
||||
/** grpc_metadata_credentials plugin is an API user provided structure used to
|
||||
create grpc_credentials objects that can be set on a channel (composed) or
|
||||
a call. See grpc_credentials_metadata_create_from_plugin below.
|
||||
The grpc client stack will call the get_metadata method of the plugin for
|
||||
every call in scope for the credentials created from it. */
|
||||
typedef struct {
|
||||
/** The implementation of this method has to be non-blocking.
|
||||
- context is the information that can be used by the plugin to create auth
|
||||
metadata.
|
||||
- cb is the callback that needs to be called when the metadata is ready.
|
||||
- user_data needs to be passed as the first parameter of the callback. */
|
||||
void (*get_metadata)(void *state, grpc_auth_metadata_context context,
|
||||
grpc_credentials_plugin_metadata_cb cb, void *user_data);
|
||||
|
||||
/** Destroys the plugin state. */
|
||||
void (*destroy)(void *state);
|
||||
|
||||
/** State that will be set as the first parameter of the methods above. */
|
||||
void *state;
|
||||
|
||||
/** Type of credentials that this plugin is implementing. */
|
||||
const char *type;
|
||||
} grpc_metadata_credentials_plugin;
|
||||
|
||||
/** Creates a credentials object from a plugin. */
|
||||
GRPCAPI grpc_call_credentials *grpc_metadata_credentials_create_from_plugin(
|
||||
grpc_metadata_credentials_plugin plugin, void *reserved);
|
||||
|
||||
/** --- Secure channel creation. --- */
|
||||
|
||||
/** Creates a secure channel using the passed-in credentials. */
|
||||
GRPCAPI grpc_channel *grpc_secure_channel_create(
|
||||
grpc_channel_credentials *creds, const char *target,
|
||||
const grpc_channel_args *args, void *reserved);
|
||||
|
||||
/** --- grpc_server_credentials object. ---
|
||||
|
||||
A server credentials object represents a way to authenticate a server. */
|
||||
|
||||
typedef struct grpc_server_credentials grpc_server_credentials;
|
||||
|
||||
/** Releases a server_credentials object.
|
||||
The creator of the server_credentials object is responsible for its release.
|
||||
*/
|
||||
GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds);
|
||||
|
||||
/** Deprecated in favor of grpc_ssl_server_credentials_create_ex.
|
||||
Creates an SSL server_credentials object.
|
||||
- pem_roots_cert is the NULL-terminated string containing the PEM encoding of
|
||||
the client root certificates. This parameter may be NULL if the server does
|
||||
not want the client to be authenticated with SSL.
|
||||
- pem_key_cert_pairs is an array private key / certificate chains of the
|
||||
server. This parameter cannot be NULL.
|
||||
- num_key_cert_pairs indicates the number of items in the private_key_files
|
||||
and cert_chain_files parameters. It should be at least 1.
|
||||
- force_client_auth, if set to non-zero will force the client to authenticate
|
||||
with an SSL cert. Note that this option is ignored if pem_root_certs is
|
||||
NULL. */
|
||||
GRPCAPI grpc_server_credentials *grpc_ssl_server_credentials_create(
|
||||
const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
|
||||
size_t num_key_cert_pairs, int force_client_auth, void *reserved);
|
||||
|
||||
/** Same as grpc_ssl_server_credentials_create method except uses
|
||||
grpc_ssl_client_certificate_request_type enum to support more ways to
|
||||
authenticate client cerificates.*/
|
||||
GRPCAPI grpc_server_credentials *grpc_ssl_server_credentials_create_ex(
|
||||
const char *pem_root_certs, grpc_ssl_pem_key_cert_pair *pem_key_cert_pairs,
|
||||
size_t num_key_cert_pairs,
|
||||
grpc_ssl_client_certificate_request_type client_certificate_request,
|
||||
void *reserved);
|
||||
|
||||
/** --- Server-side secure ports. --- */
|
||||
|
||||
/** Add a HTTP2 over an encrypted link over tcp listener.
|
||||
Returns bound port number on success, 0 on failure.
|
||||
REQUIRES: server not started */
|
||||
GRPCAPI int grpc_server_add_secure_http2_port(grpc_server *server,
|
||||
const char *addr,
|
||||
grpc_server_credentials *creds);
|
||||
|
||||
/** --- Call specific credentials. --- */
|
||||
|
||||
/** Sets a credentials to a call. Can only be called on the client side before
|
||||
grpc_call_start_batch. */
|
||||
GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call *call,
|
||||
grpc_call_credentials *creds);
|
||||
|
||||
/** --- Auth Metadata Processing --- */
|
||||
|
||||
/** Callback function that is called when the metadata processing is done.
|
||||
- Consumed metadata will be removed from the set of metadata available on the
|
||||
call. consumed_md may be NULL if no metadata has been consumed.
|
||||
- Response metadata will be set on the response. response_md may be NULL.
|
||||
- status is GRPC_STATUS_OK for success or a specific status for an error.
|
||||
Common error status for auth metadata processing is either
|
||||
GRPC_STATUS_UNAUTHENTICATED in case of an authentication failure or
|
||||
GRPC_STATUS PERMISSION_DENIED in case of an authorization failure.
|
||||
- error_details gives details about the error. May be NULL. */
|
||||
typedef void (*grpc_process_auth_metadata_done_cb)(
|
||||
void *user_data, const grpc_metadata *consumed_md, size_t num_consumed_md,
|
||||
const grpc_metadata *response_md, size_t num_response_md,
|
||||
grpc_status_code status, const char *error_details);
|
||||
|
||||
/** Pluggable server-side metadata processor object. */
|
||||
typedef struct {
|
||||
/** The context object is read/write: it contains the properties of the
|
||||
channel peer and it is the job of the process function to augment it with
|
||||
properties derived from the passed-in metadata.
|
||||
The lifetime of these objects is guaranteed until cb is invoked. */
|
||||
void (*process)(void *state, grpc_auth_context *context,
|
||||
const grpc_metadata *md, size_t num_md,
|
||||
grpc_process_auth_metadata_done_cb cb, void *user_data);
|
||||
void (*destroy)(void *state);
|
||||
void *state;
|
||||
} grpc_auth_metadata_processor;
|
||||
|
||||
GRPCAPI void grpc_server_credentials_set_auth_metadata_processor(
|
||||
grpc_server_credentials *creds, grpc_auth_metadata_processor processor);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_SECURITY_H */
|
||||
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_GRPC_SECURITY_CONSTANTS_H
|
||||
#define GRPC_GRPC_SECURITY_CONSTANTS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME "transport_security_type"
|
||||
#define GRPC_SSL_TRANSPORT_SECURITY_TYPE "ssl"
|
||||
|
||||
#define GRPC_X509_CN_PROPERTY_NAME "x509_common_name"
|
||||
#define GRPC_X509_SAN_PROPERTY_NAME "x509_subject_alternative_name"
|
||||
#define GRPC_X509_PEM_CERT_PROPERTY_NAME "x509_pem_cert"
|
||||
|
||||
/** Environment variable that points to the default SSL roots file. This file
|
||||
must be a PEM encoded file with all the roots such as the one that can be
|
||||
downloaded from https://pki.google.com/roots.pem. */
|
||||
#define GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR \
|
||||
"GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"
|
||||
|
||||
/** Environment variable that points to the google default application
|
||||
credentials json key or refresh token. Used in the
|
||||
grpc_google_default_credentials_create function. */
|
||||
#define GRPC_GOOGLE_CREDENTIALS_ENV_VAR "GOOGLE_APPLICATION_CREDENTIALS"
|
||||
|
||||
/** Results for the SSL roots override callback. */
|
||||
typedef enum {
|
||||
GRPC_SSL_ROOTS_OVERRIDE_OK,
|
||||
GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY, /** Do not try fallback options. */
|
||||
GRPC_SSL_ROOTS_OVERRIDE_FAIL
|
||||
} grpc_ssl_roots_override_result;
|
||||
|
||||
typedef enum {
|
||||
/** Server does not request client certificate. A client can present a self
|
||||
signed or signed certificates if it wishes to do so and they would be
|
||||
accepted. */
|
||||
GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
|
||||
/** Server requests client certificate but does not enforce that the client
|
||||
presents a certificate.
|
||||
|
||||
If the client presents a certificate, the client authentication is left to
|
||||
the application based on the metadata like certificate etc.
|
||||
|
||||
The key cert pair should still be valid for the SSL connection to be
|
||||
established. */
|
||||
GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY,
|
||||
/** Server requests client certificate but does not enforce that the client
|
||||
presents a certificate.
|
||||
|
||||
If the client presents a certificate, the client authentication is done by
|
||||
grpc framework (The client needs to either present a signed cert or skip no
|
||||
certificate for a successful connection).
|
||||
|
||||
The key cert pair should still be valid for the SSL connection to be
|
||||
established. */
|
||||
GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY,
|
||||
/** Server requests client certificate but enforces that the client presents a
|
||||
certificate.
|
||||
|
||||
If the client presents a certificate, the client authentication is left to
|
||||
the application based on the metadata like certificate etc.
|
||||
|
||||
The key cert pair should still be valid for the SSL connection to be
|
||||
established. */
|
||||
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY,
|
||||
/** Server requests client certificate but enforces that the client presents a
|
||||
certificate.
|
||||
|
||||
The cerificate presented by the client is verified by grpc framework (The
|
||||
client needs to present signed certs for a successful connection).
|
||||
|
||||
The key cert pair should still be valid for the SSL connection to be
|
||||
established. */
|
||||
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
|
||||
} grpc_ssl_client_certificate_request_type;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_SECURITY_CONSTANTS_H */
|
||||
@@ -1,86 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_ATM_H
|
||||
#define GRPC_IMPL_CODEGEN_ATM_H
|
||||
|
||||
/** This interface provides atomic operations and barriers.
|
||||
It is internal to gpr support code and should not be used outside it.
|
||||
|
||||
If an operation with acquire semantics precedes another memory access by the
|
||||
same thread, the operation will precede that other access as seen by other
|
||||
threads.
|
||||
|
||||
If an operation with release semantics follows another memory access by the
|
||||
same thread, the operation will follow that other access as seen by other
|
||||
threads.
|
||||
|
||||
Routines with "acq" or "full" in the name have acquire semantics. Routines
|
||||
with "rel" or "full" in the name have release semantics. Routines with
|
||||
"no_barrier" in the name have neither acquire not release semantics.
|
||||
|
||||
The routines may be implemented as macros.
|
||||
|
||||
// Atomic operations act on an intergral_type gpr_atm that is guaranteed to
|
||||
// be the same size as a pointer.
|
||||
typedef intptr_t gpr_atm;
|
||||
|
||||
// A memory barrier, providing both acquire and release semantics, but not
|
||||
// otherwise acting on memory.
|
||||
void gpr_atm_full_barrier(void);
|
||||
|
||||
// Atomically return *p, with acquire semantics.
|
||||
gpr_atm gpr_atm_acq_load(gpr_atm *p);
|
||||
|
||||
// Atomically set *p = value, with release semantics.
|
||||
void gpr_atm_rel_store(gpr_atm *p, gpr_atm value);
|
||||
|
||||
// Atomically add delta to *p, and return the old value of *p, with
|
||||
// the barriers specified.
|
||||
gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p, gpr_atm delta);
|
||||
gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta);
|
||||
|
||||
// Atomically, if *p==o, set *p=n and return non-zero otherwise return 0,
|
||||
// with the barriers specified if the operation succeeds.
|
||||
int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
|
||||
int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
|
||||
int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
|
||||
int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n);
|
||||
|
||||
// Atomically, set *p=n and return the old value of *p
|
||||
gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n);
|
||||
*/
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#if defined(GPR_GCC_ATOMIC)
|
||||
#include <grpc/impl/codegen/atm_gcc_atomic.h>
|
||||
#elif defined(GPR_GCC_SYNC)
|
||||
#include <grpc/impl/codegen/atm_gcc_sync.h>
|
||||
#elif defined(GPR_WINDOWS_ATOMIC)
|
||||
#include <grpc/impl/codegen/atm_windows.h>
|
||||
#else
|
||||
#error could not determine platform for atm
|
||||
#endif
|
||||
|
||||
/** Adds \a delta to \a *value, clamping the result to the range specified
|
||||
by \a min and \a max. Returns the new value. */
|
||||
gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm *value, gpr_atm delta,
|
||||
gpr_atm min, gpr_atm max);
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_H */
|
||||
@@ -1,82 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H
|
||||
#define GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H
|
||||
|
||||
/* atm_platform.h for gcc and gcc-like compilers with the
|
||||
__atomic_* interface. */
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
typedef intptr_t gpr_atm;
|
||||
#define GPR_ATM_MAX INTPTR_MAX
|
||||
|
||||
#ifdef GPR_LOW_LEVEL_COUNTERS
|
||||
extern gpr_atm gpr_counter_atm_cas;
|
||||
extern gpr_atm gpr_counter_atm_add;
|
||||
#define GPR_ATM_INC_COUNTER(counter) \
|
||||
__atomic_fetch_add(&counter, 1, __ATOMIC_RELAXED)
|
||||
#define GPR_ATM_INC_CAS_THEN(blah) \
|
||||
(GPR_ATM_INC_COUNTER(gpr_counter_atm_cas), blah)
|
||||
#define GPR_ATM_INC_ADD_THEN(blah) \
|
||||
(GPR_ATM_INC_COUNTER(gpr_counter_atm_add), blah)
|
||||
#else
|
||||
#define GPR_ATM_INC_CAS_THEN(blah) blah
|
||||
#define GPR_ATM_INC_ADD_THEN(blah) blah
|
||||
#endif
|
||||
|
||||
#define gpr_atm_full_barrier() (__atomic_thread_fence(__ATOMIC_SEQ_CST))
|
||||
|
||||
#define gpr_atm_acq_load(p) (__atomic_load_n((p), __ATOMIC_ACQUIRE))
|
||||
#define gpr_atm_no_barrier_load(p) (__atomic_load_n((p), __ATOMIC_RELAXED))
|
||||
#define gpr_atm_rel_store(p, value) \
|
||||
(__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELEASE))
|
||||
#define gpr_atm_no_barrier_store(p, value) \
|
||||
(__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELAXED))
|
||||
|
||||
#define gpr_atm_no_barrier_fetch_add(p, delta) \
|
||||
GPR_ATM_INC_ADD_THEN( \
|
||||
__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_RELAXED))
|
||||
#define gpr_atm_full_fetch_add(p, delta) \
|
||||
GPR_ATM_INC_ADD_THEN( \
|
||||
__atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL))
|
||||
|
||||
static __inline int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n(
|
||||
p, &o, n, 0, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED));
|
||||
}
|
||||
|
||||
#define gpr_atm_full_xchg(p, n) \
|
||||
GPR_ATM_INC_CAS_THEN(__atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL))
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */
|
||||
@@ -1,82 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H
|
||||
#define GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H
|
||||
|
||||
/* variant of atm_platform.h for gcc and gcc-like compiers with __sync_*
|
||||
interface */
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
typedef intptr_t gpr_atm;
|
||||
#define GPR_ATM_MAX INTPTR_MAX
|
||||
|
||||
#define GPR_ATM_COMPILE_BARRIER_() __asm__ __volatile__("" : : : "memory")
|
||||
|
||||
#if defined(__i386) || defined(__x86_64__)
|
||||
/* All loads are acquire loads and all stores are release stores. */
|
||||
#define GPR_ATM_LS_BARRIER_() GPR_ATM_COMPILE_BARRIER_()
|
||||
#else
|
||||
#define GPR_ATM_LS_BARRIER_() gpr_atm_full_barrier()
|
||||
#endif
|
||||
|
||||
#define gpr_atm_full_barrier() (__sync_synchronize())
|
||||
|
||||
static __inline gpr_atm gpr_atm_acq_load(const gpr_atm *p) {
|
||||
gpr_atm value = *p;
|
||||
GPR_ATM_LS_BARRIER_();
|
||||
return value;
|
||||
}
|
||||
|
||||
static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm *p) {
|
||||
gpr_atm value = *p;
|
||||
GPR_ATM_COMPILE_BARRIER_();
|
||||
return value;
|
||||
}
|
||||
|
||||
static __inline void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) {
|
||||
GPR_ATM_LS_BARRIER_();
|
||||
*p = value;
|
||||
}
|
||||
|
||||
static __inline void gpr_atm_no_barrier_store(gpr_atm *p, gpr_atm value) {
|
||||
GPR_ATM_COMPILE_BARRIER_();
|
||||
*p = value;
|
||||
}
|
||||
|
||||
#undef GPR_ATM_LS_BARRIER_
|
||||
#undef GPR_ATM_COMPILE_BARRIER_
|
||||
|
||||
#define gpr_atm_no_barrier_fetch_add(p, delta) \
|
||||
gpr_atm_full_fetch_add((p), (delta))
|
||||
#define gpr_atm_full_fetch_add(p, delta) (__sync_fetch_and_add((p), (delta)))
|
||||
|
||||
#define gpr_atm_no_barrier_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))
|
||||
#define gpr_atm_acq_cas(p, o, n) (__sync_bool_compare_and_swap((p), (o), (n)))
|
||||
#define gpr_atm_rel_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))
|
||||
#define gpr_atm_full_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))
|
||||
|
||||
static __inline gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n) {
|
||||
gpr_atm cur;
|
||||
do {
|
||||
cur = gpr_atm_acq_load(p);
|
||||
} while (!gpr_atm_rel_cas(p, cur, n));
|
||||
return cur;
|
||||
}
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H */
|
||||
@@ -1,125 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_ATM_WINDOWS_H
|
||||
#define GRPC_IMPL_CODEGEN_ATM_WINDOWS_H
|
||||
|
||||
/** Win32 variant of atm_platform.h */
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
typedef intptr_t gpr_atm;
|
||||
#define GPR_ATM_MAX INTPTR_MAX
|
||||
|
||||
#define gpr_atm_full_barrier MemoryBarrier
|
||||
|
||||
static __inline gpr_atm gpr_atm_acq_load(const gpr_atm *p) {
|
||||
gpr_atm result = *p;
|
||||
gpr_atm_full_barrier();
|
||||
return result;
|
||||
}
|
||||
|
||||
static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm *p) {
|
||||
/* TODO(dklempner): Can we implement something better here? */
|
||||
return gpr_atm_acq_load(p);
|
||||
}
|
||||
|
||||
static __inline void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) {
|
||||
gpr_atm_full_barrier();
|
||||
*p = value;
|
||||
}
|
||||
|
||||
static __inline void gpr_atm_no_barrier_store(gpr_atm *p, gpr_atm value) {
|
||||
/* TODO(ctiller): Can we implement something better here? */
|
||||
gpr_atm_rel_store(p, value);
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
/** InterlockedCompareExchangePointerNoFence() not available on vista or
|
||||
windows7 */
|
||||
#ifdef GPR_ARCH_64
|
||||
return o == (gpr_atm)InterlockedCompareExchangeAcquire64(
|
||||
(volatile LONGLONG *)p, (LONGLONG)n, (LONGLONG)o);
|
||||
#else
|
||||
return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG *)p,
|
||||
(LONG)n, (LONG)o);
|
||||
#endif
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
#ifdef GPR_ARCH_64
|
||||
return o == (gpr_atm)InterlockedCompareExchangeAcquire64(
|
||||
(volatile LONGLONG *)p, (LONGLONG)n, (LONGLONG)o);
|
||||
#else
|
||||
return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG *)p,
|
||||
(LONG)n, (LONG)o);
|
||||
#endif
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
#ifdef GPR_ARCH_64
|
||||
return o == (gpr_atm)InterlockedCompareExchangeRelease64(
|
||||
(volatile LONGLONG *)p, (LONGLONG)n, (LONGLONG)o);
|
||||
#else
|
||||
return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG *)p,
|
||||
(LONG)n, (LONG)o);
|
||||
#endif
|
||||
}
|
||||
|
||||
static __inline int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n) {
|
||||
#ifdef GPR_ARCH_64
|
||||
return o == (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG *)p,
|
||||
(LONGLONG)n, (LONGLONG)o);
|
||||
#else
|
||||
return o == (gpr_atm)InterlockedCompareExchange((volatile LONG *)p, (LONG)n,
|
||||
(LONG)o);
|
||||
#endif
|
||||
}
|
||||
|
||||
static __inline gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p,
|
||||
gpr_atm delta) {
|
||||
/** Use the CAS operation to get pointer-sized fetch and add */
|
||||
gpr_atm old;
|
||||
do {
|
||||
old = *p;
|
||||
} while (!gpr_atm_no_barrier_cas(p, old, old + delta));
|
||||
return old;
|
||||
}
|
||||
|
||||
static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta) {
|
||||
/** Use a CAS operation to get pointer-sized fetch and add */
|
||||
gpr_atm old;
|
||||
#ifdef GPR_ARCH_64
|
||||
do {
|
||||
old = *p;
|
||||
} while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG *)p,
|
||||
(LONGLONG)old + delta,
|
||||
(LONGLONG)old));
|
||||
#else
|
||||
do {
|
||||
old = *p;
|
||||
} while (old != (gpr_atm)InterlockedCompareExchange(
|
||||
(volatile LONG *)p, (LONG)old + delta, (LONG)old));
|
||||
#endif
|
||||
return old;
|
||||
}
|
||||
|
||||
static __inline gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n) {
|
||||
return (gpr_atm)InterlockedExchangePointer((PVOID *)p, (PVOID)n);
|
||||
}
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_WINDOWS_H */
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H
|
||||
#define GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct grpc_byte_buffer;
|
||||
|
||||
struct grpc_byte_buffer_reader {
|
||||
struct grpc_byte_buffer *buffer_in;
|
||||
struct grpc_byte_buffer *buffer_out;
|
||||
/** Different current objects correspond to different types of byte buffers */
|
||||
union grpc_byte_buffer_reader_current {
|
||||
/** Index into a slice buffer's array of slices */
|
||||
unsigned index;
|
||||
} current;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H */
|
||||
@@ -1,106 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H
|
||||
#define GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** To be used as initial metadata key for the request of a concrete compression
|
||||
* algorithm */
|
||||
#define GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY \
|
||||
"grpc-internal-encoding-request"
|
||||
|
||||
/** To be used in channel arguments.
|
||||
*
|
||||
* \addtogroup grpc_arg_keys
|
||||
* \{ */
|
||||
/** Default compression algorithm for the channel.
|
||||
* Its value is an int from the \a grpc_compression_algorithm enum. */
|
||||
#define GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM \
|
||||
"grpc.default_compression_algorithm"
|
||||
/** Default compression level for the channel.
|
||||
* Its value is an int from the \a grpc_compression_level enum. */
|
||||
#define GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL "grpc.default_compression_level"
|
||||
/** Compression algorithms supported by the channel.
|
||||
* Its value is a bitset (an int). Bits correspond to algorithms in \a
|
||||
* grpc_compression_algorithm. For example, its LSB corresponds to
|
||||
* GRPC_COMPRESS_NONE, the next bit to GRPC_COMPRESS_DEFLATE, etc.
|
||||
* Unset bits disable support for the algorithm. By default all algorithms are
|
||||
* supported. It's not possible to disable GRPC_COMPRESS_NONE (the attempt will
|
||||
* be ignored). */
|
||||
#define GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET \
|
||||
"grpc.compression_enabled_algorithms_bitset"
|
||||
/** \} */
|
||||
|
||||
/** The various compression algorithms supported by gRPC */
|
||||
typedef enum {
|
||||
GRPC_COMPRESS_NONE = 0,
|
||||
GRPC_COMPRESS_DEFLATE,
|
||||
GRPC_COMPRESS_GZIP,
|
||||
/* TODO(ctiller): snappy */
|
||||
GRPC_COMPRESS_ALGORITHMS_COUNT
|
||||
} grpc_compression_algorithm;
|
||||
|
||||
/** Compression levels allow a party with knowledge of its peer's accepted
|
||||
* encodings to request compression in an abstract way. The level-algorithm
|
||||
* mapping is performed internally and depends on the peer's supported
|
||||
* compression algorithms. */
|
||||
typedef enum {
|
||||
GRPC_COMPRESS_LEVEL_NONE = 0,
|
||||
GRPC_COMPRESS_LEVEL_LOW,
|
||||
GRPC_COMPRESS_LEVEL_MED,
|
||||
GRPC_COMPRESS_LEVEL_HIGH,
|
||||
GRPC_COMPRESS_LEVEL_COUNT
|
||||
} grpc_compression_level;
|
||||
|
||||
typedef struct grpc_compression_options {
|
||||
/** All algs are enabled by default. This option corresponds to the channel
|
||||
* argument key behind \a GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET
|
||||
*/
|
||||
uint32_t enabled_algorithms_bitset;
|
||||
|
||||
/** The default channel compression level. It'll be used in the absence of
|
||||
* call specific settings. This option corresponds to the channel argument key
|
||||
* behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL. If present, takes
|
||||
* precedence over \a default_algorithm.
|
||||
* TODO(dgq): currently only available for server channels. */
|
||||
struct grpc_compression_options_default_level {
|
||||
int is_set;
|
||||
grpc_compression_level level;
|
||||
} default_level;
|
||||
|
||||
/** The default channel compression algorithm. It'll be used in the absence of
|
||||
* call specific settings. This option corresponds to the channel argument key
|
||||
* behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM. */
|
||||
struct grpc_compression_options_default_algorithm {
|
||||
int is_set;
|
||||
grpc_compression_algorithm algorithm;
|
||||
} default_algorithm;
|
||||
|
||||
} grpc_compression_options;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H */
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H
|
||||
#define GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Connectivity state of a channel. */
|
||||
typedef enum {
|
||||
/** channel has just been initialized */
|
||||
GRPC_CHANNEL_INIT = -1,
|
||||
/** channel is idle */
|
||||
GRPC_CHANNEL_IDLE,
|
||||
/** channel is connecting */
|
||||
GRPC_CHANNEL_CONNECTING,
|
||||
/** channel is ready for work */
|
||||
GRPC_CHANNEL_READY,
|
||||
/** channel has seen a failure but expects to recover */
|
||||
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
||||
/** channel has seen a failure that it cannot recover from */
|
||||
GRPC_CHANNEL_SHUTDOWN
|
||||
} grpc_connectivity_state;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H */
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_EXEC_CTX_FWD_H
|
||||
#define GRPC_IMPL_CODEGEN_EXEC_CTX_FWD_H
|
||||
|
||||
/* forward declaration for exec_ctx.h */
|
||||
struct grpc_exec_ctx;
|
||||
typedef struct grpc_exec_ctx grpc_exec_ctx;
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_EXEC_CTX_FWD_H */
|
||||
@@ -1,69 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
#ifndef GRPC_IMPL_CODEGEN_GPR_SLICE_H
|
||||
#define GRPC_IMPL_CODEGEN_GPR_SLICE_H
|
||||
|
||||
/** WARNING: Please do not use this header. This was added as a temporary
|
||||
* measure to not break some of the external projects that depend on
|
||||
* gpr_slice_* functions. We are actively working on moving all the
|
||||
* gpr_slice_* references to grpc_slice_* and this file will be removed
|
||||
*/
|
||||
|
||||
/* TODO (sreek) - Allowed by default but will be very soon turned off */
|
||||
#define GRPC_ALLOW_GPR_SLICE_FUNCTIONS 1
|
||||
|
||||
#ifdef GRPC_ALLOW_GPR_SLICE_FUNCTIONS
|
||||
|
||||
#define gpr_slice_refcount grpc_slice_refcount
|
||||
#define gpr_slice grpc_slice
|
||||
#define gpr_slice_buffer grpc_slice_buffer
|
||||
|
||||
#define gpr_slice_ref grpc_slice_ref
|
||||
#define gpr_slice_unref grpc_slice_unref
|
||||
#define gpr_slice_new grpc_slice_new
|
||||
#define gpr_slice_new_with_user_data grpc_slice_new_with_user_data
|
||||
#define gpr_slice_new_with_len grpc_slice_new_with_len
|
||||
#define gpr_slice_malloc grpc_slice_malloc
|
||||
#define gpr_slice_from_copied_string grpc_slice_from_copied_string
|
||||
#define gpr_slice_from_copied_buffer grpc_slice_from_copied_buffer
|
||||
#define gpr_slice_from_static_string grpc_slice_from_static_string
|
||||
#define gpr_slice_sub grpc_slice_sub
|
||||
#define gpr_slice_sub_no_ref grpc_slice_sub_no_ref
|
||||
#define gpr_slice_split_tail grpc_slice_split_tail
|
||||
#define gpr_slice_split_head grpc_slice_split_head
|
||||
#define gpr_slice_cmp grpc_slice_cmp
|
||||
#define gpr_slice_str_cmp grpc_slice_str_cmp
|
||||
|
||||
#define gpr_slice_buffer grpc_slice_buffer
|
||||
#define gpr_slice_buffer_init grpc_slice_buffer_init
|
||||
#define gpr_slice_buffer_destroy grpc_slice_buffer_destroy
|
||||
#define gpr_slice_buffer_add grpc_slice_buffer_add
|
||||
#define gpr_slice_buffer_add_indexed grpc_slice_buffer_add_indexed
|
||||
#define gpr_slice_buffer_addn grpc_slice_buffer_addn
|
||||
#define gpr_slice_buffer_tiny_add grpc_slice_buffer_tiny_add
|
||||
#define gpr_slice_buffer_pop grpc_slice_buffer_pop
|
||||
#define gpr_slice_buffer_reset_and_unref grpc_slice_buffer_reset_and_unref
|
||||
#define gpr_slice_buffer_swap grpc_slice_buffer_swap
|
||||
#define gpr_slice_buffer_move_into grpc_slice_buffer_move_into
|
||||
#define gpr_slice_buffer_trim_end grpc_slice_buffer_trim_end
|
||||
#define gpr_slice_buffer_move_first grpc_slice_buffer_move_first
|
||||
#define gpr_slice_buffer_take_first grpc_slice_buffer_take_first
|
||||
|
||||
#endif /* GRPC_ALLOW_GPR_SLICE_FUNCTIONS */
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_GPR_SLICE_H */
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_GPR_TYPES_H
|
||||
#define GRPC_IMPL_CODEGEN_GPR_TYPES_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** The clocks we support. */
|
||||
typedef enum {
|
||||
/** Monotonic clock. Epoch undefined. Always moves forwards. */
|
||||
GPR_CLOCK_MONOTONIC = 0,
|
||||
/** Realtime clock. May jump forwards or backwards. Settable by
|
||||
the system administrator. Has its epoch at 0:00:00 UTC 1 Jan 1970. */
|
||||
GPR_CLOCK_REALTIME,
|
||||
/** CPU cycle time obtained by rdtsc instruction on x86 platforms. Epoch
|
||||
undefined. Degrades to GPR_CLOCK_REALTIME on other platforms. */
|
||||
GPR_CLOCK_PRECISE,
|
||||
/** Unmeasurable clock type: no base, created by taking the difference
|
||||
between two times */
|
||||
GPR_TIMESPAN
|
||||
} gpr_clock_type;
|
||||
|
||||
/** Analogous to struct timespec. On some machines, absolute times may be in
|
||||
* local time. */
|
||||
typedef struct gpr_timespec {
|
||||
int64_t tv_sec;
|
||||
int32_t tv_nsec;
|
||||
/** Against which clock was this time measured? (or GPR_TIMESPAN if
|
||||
this is a relative time meaure) */
|
||||
gpr_clock_type clock_type;
|
||||
} gpr_timespec;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_GPR_TYPES_H */
|
||||
@@ -1,618 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_GRPC_TYPES_H
|
||||
#define GRPC_IMPL_CODEGEN_GRPC_TYPES_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/compression_types.h>
|
||||
#include <grpc/impl/codegen/exec_ctx_fwd.h>
|
||||
#include <grpc/impl/codegen/gpr_types.h>
|
||||
#include <grpc/impl/codegen/slice.h>
|
||||
#include <grpc/impl/codegen/status.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
GRPC_BB_RAW
|
||||
/** Future types may include GRPC_BB_PROTOBUF, etc. */
|
||||
} grpc_byte_buffer_type;
|
||||
|
||||
typedef struct grpc_byte_buffer {
|
||||
void *reserved;
|
||||
grpc_byte_buffer_type type;
|
||||
union grpc_byte_buffer_data {
|
||||
struct /* internal */ {
|
||||
void *reserved[8];
|
||||
} reserved;
|
||||
struct grpc_compressed_buffer {
|
||||
grpc_compression_algorithm compression;
|
||||
grpc_slice_buffer slice_buffer;
|
||||
} raw;
|
||||
} data;
|
||||
} grpc_byte_buffer;
|
||||
|
||||
/** Completion Queues enable notification of the completion of
|
||||
* asynchronous actions. */
|
||||
typedef struct grpc_completion_queue grpc_completion_queue;
|
||||
|
||||
/** An alarm associated with a completion queue. */
|
||||
typedef struct grpc_alarm grpc_alarm;
|
||||
|
||||
/** The Channel interface allows creation of Call objects. */
|
||||
typedef struct grpc_channel grpc_channel;
|
||||
|
||||
/** A server listens to some port and responds to request calls */
|
||||
typedef struct grpc_server grpc_server;
|
||||
|
||||
/** A Call represents an RPC. When created, it is in a configuration state
|
||||
allowing properties to be set until it is invoked. After invoke, the Call
|
||||
can have messages written to it and read from it. */
|
||||
typedef struct grpc_call grpc_call;
|
||||
|
||||
/** The Socket Mutator interface allows changes on socket options */
|
||||
typedef struct grpc_socket_mutator grpc_socket_mutator;
|
||||
|
||||
/** The Socket Factory interface creates and binds sockets */
|
||||
typedef struct grpc_socket_factory grpc_socket_factory;
|
||||
|
||||
/** Type specifier for grpc_arg */
|
||||
typedef enum {
|
||||
GRPC_ARG_STRING,
|
||||
GRPC_ARG_INTEGER,
|
||||
GRPC_ARG_POINTER
|
||||
} grpc_arg_type;
|
||||
|
||||
typedef struct grpc_arg_pointer_vtable {
|
||||
void *(*copy)(void *p);
|
||||
void (*destroy)(grpc_exec_ctx *exec_ctx, void *p);
|
||||
int (*cmp)(void *p, void *q);
|
||||
} grpc_arg_pointer_vtable;
|
||||
|
||||
/** A single argument... each argument has a key and a value
|
||||
|
||||
A note on naming keys:
|
||||
Keys are namespaced into groups, usually grouped by library, and are
|
||||
keys for module XYZ are named XYZ.key1, XYZ.key2, etc. Module names must
|
||||
be restricted to the regex [A-Za-z][_A-Za-z0-9]{,15}.
|
||||
Key names must be restricted to the regex [A-Za-z][_A-Za-z0-9]{,47}.
|
||||
|
||||
GRPC core library keys are prefixed by grpc.
|
||||
|
||||
Library authors are strongly encouraged to \#define symbolic constants for
|
||||
their keys so that it's possible to change them in the future. */
|
||||
typedef struct {
|
||||
grpc_arg_type type;
|
||||
char *key;
|
||||
union grpc_arg_value {
|
||||
char *string;
|
||||
int integer;
|
||||
struct grpc_arg_pointer {
|
||||
void *p;
|
||||
const grpc_arg_pointer_vtable *vtable;
|
||||
} pointer;
|
||||
} value;
|
||||
} grpc_arg;
|
||||
|
||||
/** An array of arguments that can be passed around.
|
||||
|
||||
Used to set optional channel-level configuration.
|
||||
These configuration options are modelled as key-value pairs as defined
|
||||
by grpc_arg; keys are strings to allow easy backwards-compatible extension
|
||||
by arbitrary parties. All evaluation is performed at channel creation
|
||||
time (i.e. the values in this structure need only live through the
|
||||
creation invocation).
|
||||
|
||||
See the description of the \ref grpc_arg_keys "available args" for more
|
||||
details. */
|
||||
typedef struct {
|
||||
size_t num_args;
|
||||
grpc_arg *args;
|
||||
} grpc_channel_args;
|
||||
|
||||
/** \defgroup grpc_arg_keys
|
||||
* Channel argument keys.
|
||||
* \{
|
||||
*/
|
||||
/** If non-zero, enable census for tracing and stats collection. */
|
||||
#define GRPC_ARG_ENABLE_CENSUS "grpc.census"
|
||||
/** If non-zero, enable load reporting. */
|
||||
#define GRPC_ARG_ENABLE_LOAD_REPORTING "grpc.loadreporting"
|
||||
/** Request that optional features default to off (regardless of what they
|
||||
usually default to) - to enable tight control over what gets enabled */
|
||||
#define GRPC_ARG_MINIMAL_STACK "grpc.minimal_stack"
|
||||
/** Maximum number of concurrent incoming streams to allow on a http2
|
||||
connection. Int valued. */
|
||||
#define GRPC_ARG_MAX_CONCURRENT_STREAMS "grpc.max_concurrent_streams"
|
||||
/** Maximum message length that the channel can receive. Int valued, bytes.
|
||||
-1 means unlimited. */
|
||||
#define GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH "grpc.max_receive_message_length"
|
||||
/** \deprecated For backward compatibility.
|
||||
* Use GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH instead. */
|
||||
#define GRPC_ARG_MAX_MESSAGE_LENGTH GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH
|
||||
/** Maximum message length that the channel can send. Int valued, bytes.
|
||||
-1 means unlimited. */
|
||||
#define GRPC_ARG_MAX_SEND_MESSAGE_LENGTH "grpc.max_send_message_length"
|
||||
/** Maximum time that a channel may have no outstanding rpcs. Int valued,
|
||||
milliseconds. INT_MAX means unlimited. */
|
||||
#define GRPC_ARG_MAX_CONNECTION_IDLE_MS "grpc.max_connection_idle_ms"
|
||||
/** Maximum time that a channel may exist. Int valued, milliseconds.
|
||||
* INT_MAX means unlimited. */
|
||||
#define GRPC_ARG_MAX_CONNECTION_AGE_MS "grpc.max_connection_age_ms"
|
||||
/** Grace period after the chennel reaches its max age. Int valued,
|
||||
milliseconds. INT_MAX means unlimited. */
|
||||
#define GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS "grpc.max_connection_age_grace_ms"
|
||||
/** Enable/disable support for per-message compression. Defaults to 1, unless
|
||||
GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0. */
|
||||
#define GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION "grpc.per_message_compression"
|
||||
/** Enable/disable support for deadline checking. Defaults to 1, unless
|
||||
GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */
|
||||
#define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking"
|
||||
/** Initial stream ID for http2 transports. Int valued. */
|
||||
#define GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER \
|
||||
"grpc.http2.initial_sequence_number"
|
||||
/** Amount to read ahead on individual streams. Defaults to 64kb, larger
|
||||
values can help throughput on high-latency connections.
|
||||
NOTE: at some point we'd like to auto-tune this, and this parameter
|
||||
will become a no-op. Int valued, bytes. */
|
||||
#define GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES "grpc.http2.lookahead_bytes"
|
||||
/** How much memory to use for hpack decoding. Int valued, bytes. */
|
||||
#define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER \
|
||||
"grpc.http2.hpack_table_size.decoder"
|
||||
/** How much memory to use for hpack encoding. Int valued, bytes. */
|
||||
#define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER \
|
||||
"grpc.http2.hpack_table_size.encoder"
|
||||
/** How big a frame are we willing to receive via HTTP2.
|
||||
Min 16384, max 16777215. Larger values give lower CPU usage for large
|
||||
messages, but more head of line blocking for small messages. */
|
||||
#define GRPC_ARG_HTTP2_MAX_FRAME_SIZE "grpc.http2.max_frame_size"
|
||||
/** Should BDP probing be performed? */
|
||||
#define GRPC_ARG_HTTP2_BDP_PROBE "grpc.http2.bdp_probe"
|
||||
/** Minimum time (in milliseconds) between successive ping frames being sent */
|
||||
#define GRPC_ARG_HTTP2_MIN_TIME_BETWEEN_PINGS_MS \
|
||||
"grpc.http2.min_time_between_pings_ms"
|
||||
/** Channel arg to override the http2 :scheme header */
|
||||
#define GRPC_ARG_HTTP2_SCHEME "grpc.http2_scheme"
|
||||
/** How many pings can we send before needing to send a data frame or header
|
||||
frame? (0 indicates that an infinite number of pings can be sent without
|
||||
sending a data frame or header frame) */
|
||||
#define GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA \
|
||||
"grpc.http2.max_pings_without_data"
|
||||
/** How many misbehaving pings the server can bear before sending goaway and
|
||||
closing the transport? (0 indicates that the server can bear an infinite
|
||||
number of misbehaving pings) */
|
||||
#define GRPC_ARG_HTTP2_MAX_PING_STRIKES "grpc.http2.max_ping_strikes"
|
||||
/** Minimum allowed time between two pings without sending any data frame. Int
|
||||
valued, seconds */
|
||||
#define GRPC_ARG_HTTP2_MIN_PING_INTERVAL_WITHOUT_DATA_MS \
|
||||
"grpc.http2.min_ping_interval_without_data_ms"
|
||||
/** How much data are we willing to queue up per stream if
|
||||
GRPC_WRITE_BUFFER_HINT is set? This is an upper bound */
|
||||
#define GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE "grpc.http2.write_buffer_size"
|
||||
/** Should we allow receipt of true-binary data on http2 connections?
|
||||
Defaults to on (1) */
|
||||
#define GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY "grpc.http2.true_binary"
|
||||
/** After a duration of this time the client/server pings its peer to see if the
|
||||
transport is still alive. Int valued, milliseconds. */
|
||||
#define GRPC_ARG_KEEPALIVE_TIME_MS "grpc.keepalive_time_ms"
|
||||
/** After waiting for a duration of this time, if the keepalive ping sender does
|
||||
not receive the ping ack, it will close the transport. Int valued,
|
||||
milliseconds. */
|
||||
#define GRPC_ARG_KEEPALIVE_TIMEOUT_MS "grpc.keepalive_timeout_ms"
|
||||
/** Is it permissible to send keepalive pings without any outstanding streams.
|
||||
Int valued, 0(false)/1(true). */
|
||||
#define GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS \
|
||||
"grpc.keepalive_permit_without_calls"
|
||||
/** Default authority to pass if none specified on call construction. A string.
|
||||
* */
|
||||
#define GRPC_ARG_DEFAULT_AUTHORITY "grpc.default_authority"
|
||||
/** Primary user agent: goes at the start of the user-agent metadata
|
||||
sent on each request. A string. */
|
||||
#define GRPC_ARG_PRIMARY_USER_AGENT_STRING "grpc.primary_user_agent"
|
||||
/** Secondary user agent: goes at the end of the user-agent metadata
|
||||
sent on each request. A string. */
|
||||
#define GRPC_ARG_SECONDARY_USER_AGENT_STRING "grpc.secondary_user_agent"
|
||||
/** The minimum time between subsequent connection attempts, in ms */
|
||||
#define GRPC_ARG_MIN_RECONNECT_BACKOFF_MS "grpc.min_reconnect_backoff_ms"
|
||||
/** The maximum time between subsequent connection attempts, in ms */
|
||||
#define GRPC_ARG_MAX_RECONNECT_BACKOFF_MS "grpc.max_reconnect_backoff_ms"
|
||||
/** The time between the first and second connection attempts, in ms */
|
||||
#define GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS \
|
||||
"grpc.initial_reconnect_backoff_ms"
|
||||
/** This *should* be used for testing only.
|
||||
The caller of the secure_channel_create functions may override the target
|
||||
name used for SSL host name checking using this channel argument which is of
|
||||
type \a GRPC_ARG_STRING. If this argument is not specified, the name used
|
||||
for SSL host name checking will be the target parameter (assuming that the
|
||||
secure channel is an SSL channel). If this parameter is specified and the
|
||||
underlying is not an SSL channel, it will just be ignored. */
|
||||
#define GRPC_SSL_TARGET_NAME_OVERRIDE_ARG "grpc.ssl_target_name_override"
|
||||
/** Maximum metadata size, in bytes. Note this limit applies to the max sum of
|
||||
all metadata key-value entries in a batch of headers. */
|
||||
#define GRPC_ARG_MAX_METADATA_SIZE "grpc.max_metadata_size"
|
||||
/** If non-zero, allow the use of SO_REUSEPORT if it's available (default 1) */
|
||||
#define GRPC_ARG_ALLOW_REUSEPORT "grpc.so_reuseport"
|
||||
/** If non-zero, a pointer to a buffer pool (a pointer of type
|
||||
* grpc_resource_quota*). (use grpc_resource_quota_arg_vtable() to fetch an
|
||||
* appropriate pointer arg vtable) */
|
||||
#define GRPC_ARG_RESOURCE_QUOTA "grpc.resource_quota"
|
||||
/** If non-zero, expand wildcard addresses to a list of local addresses. */
|
||||
#define GRPC_ARG_EXPAND_WILDCARD_ADDRS "grpc.expand_wildcard_addrs"
|
||||
/** Service config data in JSON form.
|
||||
This value will be ignored if the name resolver returns a service config. */
|
||||
#define GRPC_ARG_SERVICE_CONFIG "grpc.service_config"
|
||||
/** Disable looking up the service config via the name resolver. */
|
||||
#define GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION \
|
||||
"grpc.service_config_disable_resolution"
|
||||
/** LB policy name. */
|
||||
#define GRPC_ARG_LB_POLICY_NAME "grpc.lb_policy_name"
|
||||
/** The grpc_socket_mutator instance that set the socket options. A pointer. */
|
||||
#define GRPC_ARG_SOCKET_MUTATOR "grpc.socket_mutator"
|
||||
/** The grpc_socket_factory instance to create and bind sockets. A pointer. */
|
||||
#define GRPC_ARG_SOCKET_FACTORY "grpc.socket_factory"
|
||||
/** If non-zero, Cronet transport will coalesce packets to fewer frames
|
||||
* when possible. */
|
||||
#define GRPC_ARG_USE_CRONET_PACKET_COALESCING \
|
||||
"grpc.use_cronet_packet_coalescing"
|
||||
/** Channel arg (integer) setting how large a slice to try and read from the
|
||||
wire each time recvmsg (or equivalent) is called **/
|
||||
#define GRPC_ARG_TCP_READ_CHUNK_SIZE "grpc.experimental.tcp_read_chunk_size"
|
||||
/** Note this is not a "channel arg" key. This is the default slice size to use
|
||||
* when trying to read from the wire if the GRPC_ARG_TCP_READ_CHUNK_SIZE
|
||||
* channel arg is unspecified. */
|
||||
#define GRPC_TCP_DEFAULT_READ_SLICE_SIZE 8192
|
||||
#define GRPC_ARG_TCP_MIN_READ_CHUNK_SIZE \
|
||||
"grpc.experimental.tcp_min_read_chunk_size"
|
||||
#define GRPC_ARG_TCP_MAX_READ_CHUNK_SIZE \
|
||||
"grpc.experimental.tcp_max_read_chunk_size"
|
||||
/* Timeout in milliseconds to use for calls to the grpclb load balancer.
|
||||
If 0 or unset, the balancer calls will have no deadline. */
|
||||
#define GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS "grpc.grpclb_timeout_ms"
|
||||
/** If non-zero, grpc server's cronet compression workaround will be enabled */
|
||||
#define GRPC_ARG_WORKAROUND_CRONET_COMPRESSION \
|
||||
"grpc.workaround.cronet_compression"
|
||||
/** String defining the optimization target for a channel.
|
||||
Can be: "latency" - attempt to minimize latency at the cost of throughput
|
||||
"blend" - try to balance latency and throughput
|
||||
"throughput" - attempt to maximize throughput at the expense of
|
||||
latency
|
||||
Defaults to "blend". In the current implementation "blend" is equivalent to
|
||||
"latency". */
|
||||
#define GRPC_ARG_OPTIMIZATION_TARGET "grpc.optimization_target"
|
||||
/** \} */
|
||||
|
||||
/** Result of a grpc call. If the caller satisfies the prerequisites of a
|
||||
particular operation, the grpc_call_error returned will be GRPC_CALL_OK.
|
||||
Receiving any other value listed here is an indication of a bug in the
|
||||
caller. */
|
||||
typedef enum grpc_call_error {
|
||||
/** everything went ok */
|
||||
GRPC_CALL_OK = 0,
|
||||
/** something failed, we don't know what */
|
||||
GRPC_CALL_ERROR,
|
||||
/** this method is not available on the server */
|
||||
GRPC_CALL_ERROR_NOT_ON_SERVER,
|
||||
/** this method is not available on the client */
|
||||
GRPC_CALL_ERROR_NOT_ON_CLIENT,
|
||||
/** this method must be called before server_accept */
|
||||
GRPC_CALL_ERROR_ALREADY_ACCEPTED,
|
||||
/** this method must be called before invoke */
|
||||
GRPC_CALL_ERROR_ALREADY_INVOKED,
|
||||
/** this method must be called after invoke */
|
||||
GRPC_CALL_ERROR_NOT_INVOKED,
|
||||
/** this call is already finished
|
||||
(writes_done or write_status has already been called) */
|
||||
GRPC_CALL_ERROR_ALREADY_FINISHED,
|
||||
/** there is already an outstanding read/write operation on the call */
|
||||
GRPC_CALL_ERROR_TOO_MANY_OPERATIONS,
|
||||
/** the flags value was illegal for this call */
|
||||
GRPC_CALL_ERROR_INVALID_FLAGS,
|
||||
/** invalid metadata was passed to this call */
|
||||
GRPC_CALL_ERROR_INVALID_METADATA,
|
||||
/** invalid message was passed to this call */
|
||||
GRPC_CALL_ERROR_INVALID_MESSAGE,
|
||||
/** completion queue for notification has not been registered
|
||||
* with the server */
|
||||
GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE,
|
||||
/** this batch of operations leads to more operations than allowed */
|
||||
GRPC_CALL_ERROR_BATCH_TOO_BIG,
|
||||
/** payload type requested is not the type registered */
|
||||
GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH,
|
||||
/** completion queue has been shutdown */
|
||||
GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN
|
||||
} grpc_call_error;
|
||||
|
||||
/** Default send/receive message size limits in bytes. -1 for unlimited. */
|
||||
/** TODO(roth) Make this match the default receive limit after next release */
|
||||
#define GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH -1
|
||||
#define GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH (4 * 1024 * 1024)
|
||||
|
||||
/** Write Flags: */
|
||||
/** Hint that the write may be buffered and need not go out on the wire
|
||||
immediately. GRPC is free to buffer the message until the next non-buffered
|
||||
write, or until writes_done, but it need not buffer completely or at all. */
|
||||
#define GRPC_WRITE_BUFFER_HINT (0x00000001u)
|
||||
/** Force compression to be disabled for a particular write
|
||||
(start_write/add_metadata). Illegal on invoke/accept. */
|
||||
#define GRPC_WRITE_NO_COMPRESS (0x00000002u)
|
||||
/** Mask of all valid flags. */
|
||||
#define GRPC_WRITE_USED_MASK (GRPC_WRITE_BUFFER_HINT | GRPC_WRITE_NO_COMPRESS)
|
||||
|
||||
/** Initial metadata flags */
|
||||
/** Signal that the call is idempotent */
|
||||
#define GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST (0x00000010u)
|
||||
/** Signal that the call should not return UNAVAILABLE before it has started */
|
||||
#define GRPC_INITIAL_METADATA_WAIT_FOR_READY (0x00000020u)
|
||||
/** Signal that the call is cacheable. GRPC is free to use GET verb */
|
||||
#define GRPC_INITIAL_METADATA_CACHEABLE_REQUEST (0x00000040u)
|
||||
/** Signal that GRPC_INITIAL_METADATA_WAIT_FOR_READY was explicitly set
|
||||
by the calling application. */
|
||||
#define GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET (0x00000080u)
|
||||
/** Signal that the initial metadata should be corked */
|
||||
#define GRPC_INITIAL_METADATA_CORKED (0x00000100u)
|
||||
|
||||
/** Mask of all valid flags */
|
||||
#define GRPC_INITIAL_METADATA_USED_MASK \
|
||||
(GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST | \
|
||||
GRPC_INITIAL_METADATA_WAIT_FOR_READY | \
|
||||
GRPC_INITIAL_METADATA_CACHEABLE_REQUEST | \
|
||||
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET | \
|
||||
GRPC_INITIAL_METADATA_CORKED)
|
||||
|
||||
/** A single metadata element */
|
||||
typedef struct grpc_metadata {
|
||||
/** the key, value values are expected to line up with grpc_mdelem: if
|
||||
changing them, update metadata.h at the same time. */
|
||||
grpc_slice key;
|
||||
grpc_slice value;
|
||||
|
||||
uint32_t flags;
|
||||
|
||||
/** The following fields are reserved for grpc internal use.
|
||||
There is no need to initialize them, and they will be set to garbage
|
||||
during calls to grpc. */
|
||||
struct /* internal */ {
|
||||
void *obfuscated[4];
|
||||
} internal_data;
|
||||
} grpc_metadata;
|
||||
|
||||
/** The type of completion (for grpc_event) */
|
||||
typedef enum grpc_completion_type {
|
||||
/** Shutting down */
|
||||
GRPC_QUEUE_SHUTDOWN,
|
||||
/** No event before timeout */
|
||||
GRPC_QUEUE_TIMEOUT,
|
||||
/** Operation completion */
|
||||
GRPC_OP_COMPLETE
|
||||
} grpc_completion_type;
|
||||
|
||||
/** The result of an operation.
|
||||
|
||||
Returned by a completion queue when the operation started with tag. */
|
||||
typedef struct grpc_event {
|
||||
/** The type of the completion. */
|
||||
grpc_completion_type type;
|
||||
/** If the grpc_completion_type is GRPC_OP_COMPLETE, this field indicates
|
||||
whether the operation was successful or not; 0 in case of failure and
|
||||
non-zero in case of success.
|
||||
If grpc_completion_type is GRPC_QUEUE_SHUTDOWN or GRPC_QUEUE_TIMEOUT, this
|
||||
field is guaranteed to be 0 */
|
||||
int success;
|
||||
/** The tag passed to grpc_call_start_batch etc to start this operation.
|
||||
Only GRPC_OP_COMPLETE has a tag. */
|
||||
void *tag;
|
||||
} grpc_event;
|
||||
|
||||
typedef struct {
|
||||
size_t count;
|
||||
size_t capacity;
|
||||
grpc_metadata *metadata;
|
||||
} grpc_metadata_array;
|
||||
|
||||
typedef struct {
|
||||
grpc_slice method;
|
||||
grpc_slice host;
|
||||
gpr_timespec deadline;
|
||||
uint32_t flags;
|
||||
void *reserved;
|
||||
} grpc_call_details;
|
||||
|
||||
typedef enum {
|
||||
/** Send initial metadata: one and only one instance MUST be sent for each
|
||||
call, unless the call was cancelled - in which case this can be skipped.
|
||||
This op completes after all bytes of metadata have been accepted by
|
||||
outgoing flow control. */
|
||||
GRPC_OP_SEND_INITIAL_METADATA = 0,
|
||||
/** Send a message: 0 or more of these operations can occur for each call.
|
||||
This op completes after all bytes for the message have been accepted by
|
||||
outgoing flow control. */
|
||||
GRPC_OP_SEND_MESSAGE,
|
||||
/** Send a close from the client: one and only one instance MUST be sent from
|
||||
the client, unless the call was cancelled - in which case this can be
|
||||
skipped. This op completes after all bytes for the call
|
||||
(including the close) have passed outgoing flow control. */
|
||||
GRPC_OP_SEND_CLOSE_FROM_CLIENT,
|
||||
/** Send status from the server: one and only one instance MUST be sent from
|
||||
the server unless the call was cancelled - in which case this can be
|
||||
skipped. This op completes after all bytes for the call
|
||||
(including the status) have passed outgoing flow control. */
|
||||
GRPC_OP_SEND_STATUS_FROM_SERVER,
|
||||
/** Receive initial metadata: one and only one MUST be made on the client,
|
||||
must not be made on the server.
|
||||
This op completes after all initial metadata has been read from the
|
||||
peer. */
|
||||
GRPC_OP_RECV_INITIAL_METADATA,
|
||||
/** Receive a message: 0 or more of these operations can occur for each call.
|
||||
This op completes after all bytes of the received message have been
|
||||
read, or after a half-close has been received on this call. */
|
||||
GRPC_OP_RECV_MESSAGE,
|
||||
/** Receive status on the client: one and only one must be made on the client.
|
||||
This operation always succeeds, meaning ops paired with this operation
|
||||
will also appear to succeed, even though they may not have. In that case
|
||||
the status will indicate some failure.
|
||||
This op completes after all activity on the call has completed. */
|
||||
GRPC_OP_RECV_STATUS_ON_CLIENT,
|
||||
/** Receive close on the server: one and only one must be made on the
|
||||
server. This op completes after the close has been received by the
|
||||
server. This operation always succeeds, meaning ops paired with
|
||||
this operation will also appear to succeed, even though they may not
|
||||
have. */
|
||||
GRPC_OP_RECV_CLOSE_ON_SERVER
|
||||
} grpc_op_type;
|
||||
|
||||
struct grpc_byte_buffer;
|
||||
|
||||
/** Operation data: one field for each op type (except SEND_CLOSE_FROM_CLIENT
|
||||
which has no arguments) */
|
||||
typedef struct grpc_op {
|
||||
/** Operation type, as defined by grpc_op_type */
|
||||
grpc_op_type op;
|
||||
/** Write flags bitset for grpc_begin_messages */
|
||||
uint32_t flags;
|
||||
/** Reserved for future usage */
|
||||
void *reserved;
|
||||
union grpc_op_data {
|
||||
/** Reserved for future usage */
|
||||
struct /* internal */ {
|
||||
void *reserved[8];
|
||||
} reserved;
|
||||
struct grpc_op_send_initial_metadata {
|
||||
size_t count;
|
||||
grpc_metadata *metadata;
|
||||
/** If \a is_set, \a compression_level will be used for the call.
|
||||
* Otherwise, \a compression_level won't be considered */
|
||||
struct grpc_op_send_initial_metadata_maybe_compression_level {
|
||||
uint8_t is_set;
|
||||
grpc_compression_level level;
|
||||
} maybe_compression_level;
|
||||
} send_initial_metadata;
|
||||
struct grpc_op_send_message {
|
||||
struct grpc_byte_buffer *send_message;
|
||||
} send_message;
|
||||
struct grpc_op_send_status_from_server {
|
||||
size_t trailing_metadata_count;
|
||||
grpc_metadata *trailing_metadata;
|
||||
grpc_status_code status;
|
||||
/** optional: set to NULL if no details need sending, non-NULL if they do
|
||||
* pointer will not be retained past the start_batch call
|
||||
*/
|
||||
grpc_slice *status_details;
|
||||
} send_status_from_server;
|
||||
/** ownership of the array is with the caller, but ownership of the elements
|
||||
stays with the call object (ie key, value members are owned by the call
|
||||
object, recv_initial_metadata->array is owned by the caller).
|
||||
After the operation completes, call grpc_metadata_array_destroy on this
|
||||
value, or reuse it in a future op. */
|
||||
struct grpc_op_recv_initial_metadata {
|
||||
grpc_metadata_array *recv_initial_metadata;
|
||||
} recv_initial_metadata;
|
||||
/** ownership of the byte buffer is moved to the caller; the caller must
|
||||
call grpc_byte_buffer_destroy on this value, or reuse it in a future op.
|
||||
*/
|
||||
struct grpc_op_recv_message {
|
||||
struct grpc_byte_buffer **recv_message;
|
||||
} recv_message;
|
||||
struct grpc_op_recv_status_on_client {
|
||||
/** ownership of the array is with the caller, but ownership of the
|
||||
elements stays with the call object (ie key, value members are owned
|
||||
by the call object, trailing_metadata->array is owned by the caller).
|
||||
After the operation completes, call grpc_metadata_array_destroy on
|
||||
this value, or reuse it in a future op. */
|
||||
grpc_metadata_array *trailing_metadata;
|
||||
grpc_status_code *status;
|
||||
grpc_slice *status_details;
|
||||
} recv_status_on_client;
|
||||
struct grpc_op_recv_close_on_server {
|
||||
/** out argument, set to 1 if the call failed in any way (seen as a
|
||||
cancellation on the server), or 0 if the call succeeded */
|
||||
int *cancelled;
|
||||
} recv_close_on_server;
|
||||
} data;
|
||||
} grpc_op;
|
||||
|
||||
/** Information requested from the channel. */
|
||||
typedef struct {
|
||||
/** If non-NULL, will be set to point to a string indicating the LB
|
||||
* policy name. Caller takes ownership. */
|
||||
char **lb_policy_name;
|
||||
/** If non-NULL, will be set to point to a string containing the
|
||||
* service config used by the channel in JSON form. */
|
||||
char **service_config_json;
|
||||
} grpc_channel_info;
|
||||
|
||||
typedef struct grpc_resource_quota grpc_resource_quota;
|
||||
|
||||
/** Completion queues internally MAY maintain a set of file descriptors in a
|
||||
structure called 'pollset'. This enum specifies if a completion queue has an
|
||||
associated pollset and any restrictions on the type of file descriptors that
|
||||
can be present in the pollset.
|
||||
|
||||
I/O progress can only be made when grpc_completion_queue_next() or
|
||||
grpc_completion_queue_pluck() are called on the completion queue (unless the
|
||||
grpc_cq_polling_type is GRPC_CQ_NON_POLLING) and hence it is very important
|
||||
to actively call these APIs */
|
||||
typedef enum {
|
||||
/** The completion queue will have an associated pollset and there is no
|
||||
restriction on the type of file descriptors the pollset may contain */
|
||||
GRPC_CQ_DEFAULT_POLLING,
|
||||
|
||||
/** Similar to GRPC_CQ_DEFAULT_POLLING except that the completion queues will
|
||||
not contain any 'listening file descriptors' (i.e file descriptors used to
|
||||
listen to incoming channels) */
|
||||
GRPC_CQ_NON_LISTENING,
|
||||
|
||||
/** The completion queue will not have an associated pollset. Note that
|
||||
grpc_completion_queue_next() or grpc_completion_queue_pluck() MUST still
|
||||
be called to pop events from the completion queue; it is not required to
|
||||
call them actively to make I/O progress */
|
||||
GRPC_CQ_NON_POLLING
|
||||
} grpc_cq_polling_type;
|
||||
|
||||
/** Specifies the type of APIs to use to pop events from the completion queue */
|
||||
typedef enum {
|
||||
/** Events are popped out by calling grpc_completion_queue_next() API ONLY */
|
||||
GRPC_CQ_NEXT,
|
||||
|
||||
/** Events are popped out by calling grpc_completion_queue_pluck() API ONLY*/
|
||||
GRPC_CQ_PLUCK
|
||||
} grpc_cq_completion_type;
|
||||
|
||||
#define GRPC_CQ_CURRENT_VERSION 1
|
||||
typedef struct grpc_completion_queue_attributes {
|
||||
/** The version number of this structure. More fields might be added to this
|
||||
structure in future. */
|
||||
int version; /** Set to GRPC_CQ_CURRENT_VERSION */
|
||||
|
||||
grpc_cq_completion_type cq_completion_type;
|
||||
|
||||
grpc_cq_polling_type cq_polling_type;
|
||||
} grpc_completion_queue_attributes;
|
||||
|
||||
/** The completion queue factory structure is opaque to the callers of grpc */
|
||||
typedef struct grpc_completion_queue_factory grpc_completion_queue_factory;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_GRPC_TYPES_H */
|
||||
@@ -1,411 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2015 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_PORT_PLATFORM_H
|
||||
#define GRPC_IMPL_CODEGEN_PORT_PLATFORM_H
|
||||
|
||||
/*
|
||||
* Define GPR_BACKWARDS_COMPATIBILITY_MODE to try harder to be ABI
|
||||
* compatible with older platforms (currently only on Linux)
|
||||
* Causes:
|
||||
* - some libc calls to be gotten via dlsym
|
||||
* - some syscalls to be made directly
|
||||
*/
|
||||
|
||||
/* Get windows.h included everywhere (we need it) */
|
||||
#if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif /* WIN32_LEAN_AND_MEAN */
|
||||
|
||||
#ifndef NOMINMAX
|
||||
#define GRPC_NOMINMX_WAS_NOT_DEFINED
|
||||
#define NOMINMAX
|
||||
#endif /* NOMINMAX */
|
||||
|
||||
#ifndef _WIN32_WINNT
|
||||
#error \
|
||||
"Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
|
||||
#else /* !defined(_WIN32_WINNT) */
|
||||
#if (_WIN32_WINNT < 0x0600)
|
||||
#error \
|
||||
"Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
|
||||
#endif /* _WIN32_WINNT < 0x0600 */
|
||||
#endif /* defined(_WIN32_WINNT) */
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#ifdef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
|
||||
#undef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
|
||||
#undef WIN32_LEAN_AND_MEAN
|
||||
#endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
|
||||
|
||||
#ifdef GRPC_NOMINMAX_WAS_NOT_DEFINED
|
||||
#undef GRPC_NOMINMAX_WAS_NOT_DEFINED
|
||||
#undef NOMINMAX
|
||||
#endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
|
||||
#endif /* defined(_WIN64) || defined(WIN64) || defined(_WIN32) || \
|
||||
defined(WIN32) */
|
||||
|
||||
/* Override this file with one for your platform if you need to redefine
|
||||
things. */
|
||||
|
||||
#if !defined(GPR_NO_AUTODETECT_PLATFORM)
|
||||
#if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
|
||||
#if defined(_WIN64) || defined(WIN64)
|
||||
#define GPR_ARCH_64 1
|
||||
#else
|
||||
#define GPR_ARCH_32 1
|
||||
#endif
|
||||
#define GPR_PLATFORM_STRING "windows"
|
||||
#define GPR_WINDOWS 1
|
||||
#define GPR_WINDOWS_SUBPROCESS 1
|
||||
#define GPR_WINDOWS_ENV
|
||||
#ifdef __MSYS__
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#define GPR_MSYS_TMPFILE
|
||||
#define GPR_POSIX_LOG
|
||||
#define GPR_POSIX_STRING
|
||||
#define GPR_POSIX_TIME
|
||||
#else
|
||||
#define GPR_GETPID_IN_PROCESS_H 1
|
||||
#define GPR_WINDOWS_TMPFILE
|
||||
#define GPR_WINDOWS_LOG
|
||||
#define GPR_WINDOWS_CRASH_HANDLER 1
|
||||
#define GPR_WINDOWS_STRING
|
||||
#define GPR_WINDOWS_TIME
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#else
|
||||
#define GPR_WINDOWS_ATOMIC 1
|
||||
#define GPR_MSVC_TLS 1
|
||||
#endif
|
||||
#elif defined(GPR_MANYLINUX1)
|
||||
// TODO(atash): manylinux1 is just another __linux__ but with ancient
|
||||
// libraries; it should be integrated with the `__linux__` definitions below.
|
||||
#define GPR_PLATFORM_STRING "manylinux"
|
||||
#define GPR_POSIX_CRASH_HANDLER 1
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#define GPR_LINUX 1
|
||||
#define GPR_LINUX_LOG 1
|
||||
#define GPR_SUPPORT_CHANNELS_FROM_FD 1
|
||||
#define GPR_LINUX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#elif defined(ANDROID) || defined(__ANDROID__)
|
||||
#define GPR_PLATFORM_STRING "android"
|
||||
#define GPR_ANDROID 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_SYNC 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_ANDROID_LOG 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#define GPR_SUPPORT_CHANNELS_FROM_FD 1
|
||||
#elif defined(__linux__)
|
||||
#define GPR_PLATFORM_STRING "linux"
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE
|
||||
#endif
|
||||
#ifndef _DEFAULT_SOURCE
|
||||
#define _DEFAULT_SOURCE
|
||||
#endif
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
#include <features.h>
|
||||
#define GPR_CPU_LINUX 1
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#define GPR_LINUX 1
|
||||
#define GPR_LINUX_LOG
|
||||
#define GPR_SUPPORT_CHANNELS_FROM_FD 1
|
||||
#define GPR_LINUX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#ifdef __GLIBC__
|
||||
#define GPR_POSIX_CRASH_HANDLER 1
|
||||
#else /* musl libc */
|
||||
#define GPR_MUSL_LIBC_COMPAT 1
|
||||
#endif
|
||||
#elif defined(__APPLE__)
|
||||
#include <Availability.h>
|
||||
#include <TargetConditionals.h>
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE
|
||||
#endif
|
||||
#if TARGET_OS_IPHONE
|
||||
#define GPR_PLATFORM_STRING "ios"
|
||||
#define GPR_CPU_IPHONE 1
|
||||
#define GPR_PTHREAD_TLS 1
|
||||
#else /* TARGET_OS_IPHONE */
|
||||
#define GPR_PLATFORM_STRING "osx"
|
||||
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
|
||||
#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7
|
||||
#define GPR_CPU_IPHONE 1
|
||||
#define GPR_PTHREAD_TLS 1
|
||||
#else /* __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 */
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#endif
|
||||
#else /* __MAC_OS_X_VERSION_MIN_REQUIRED */
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#endif
|
||||
#define GPR_POSIX_CRASH_HANDLER 1
|
||||
#endif
|
||||
#define GPR_APPLE 1
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_POSIX_LOG 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#define GPR_SUPPORT_CHANNELS_FROM_FD 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#elif defined(__FreeBSD__)
|
||||
#define GPR_PLATFORM_STRING "freebsd"
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE
|
||||
#endif
|
||||
#define GPR_FREEBSD 1
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#define GPR_POSIX_LOG 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#define GPR_SUPPORT_CHANNELS_FROM_FD 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#elif defined(__native_client__)
|
||||
#define GPR_PLATFORM_STRING "nacl"
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE
|
||||
#endif
|
||||
#ifndef _DEFAULT_SOURCE
|
||||
#define _DEFAULT_SOURCE
|
||||
#endif
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
#define GPR_NACL 1
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_GCC_TLS 1
|
||||
#define GPR_POSIX_LOG 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#else
|
||||
#error "Could not auto-detect platform"
|
||||
#endif
|
||||
#endif /* GPR_NO_AUTODETECT_PLATFORM */
|
||||
|
||||
#if defined(__has_include)
|
||||
#if __has_include(<atomic>)
|
||||
#define GRPC_HAS_CXX11_ATOMIC
|
||||
#endif /* __has_include(<atomic>) */
|
||||
#endif /* defined(__has_include) */
|
||||
|
||||
#ifndef GPR_PLATFORM_STRING
|
||||
#warning "GPR_PLATFORM_STRING not auto-detected"
|
||||
#define GPR_PLATFORM_STRING "unknown"
|
||||
#endif
|
||||
|
||||
#ifdef GPR_GCOV
|
||||
#undef GPR_FORBID_UNREACHABLE_CODE
|
||||
#define GPR_FORBID_UNREACHABLE_CODE 1
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _PYTHON_MSVC
|
||||
// The Python 3.5 Windows runtime is missing InetNtop
|
||||
#define GPR_WIN_INET_NTOP
|
||||
#endif // _PYTHON_MSVC
|
||||
#if _MSC_VER < 1700
|
||||
typedef __int8 int8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif /* _MSC_VER < 1700 */
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
/* Cache line alignment */
|
||||
#ifndef GPR_CACHELINE_SIZE_LOG
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#define GPR_CACHELINE_SIZE_LOG 6
|
||||
#endif
|
||||
#ifndef GPR_CACHELINE_SIZE_LOG
|
||||
/* A reasonable default guess. Note that overestimates tend to waste more
|
||||
space, while underestimates tend to waste more time. */
|
||||
#define GPR_CACHELINE_SIZE_LOG 6
|
||||
#endif /* GPR_CACHELINE_SIZE_LOG */
|
||||
#endif /* GPR_CACHELINE_SIZE_LOG */
|
||||
|
||||
#define GPR_CACHELINE_SIZE (1 << GPR_CACHELINE_SIZE_LOG)
|
||||
|
||||
/* scrub GCC_ATOMIC if it's not available on this compiler */
|
||||
#if defined(GPR_GCC_ATOMIC) && !defined(__ATOMIC_RELAXED)
|
||||
#undef GPR_GCC_ATOMIC
|
||||
#define GPR_GCC_SYNC 1
|
||||
#endif
|
||||
|
||||
/* Validate platform combinations */
|
||||
#if defined(GPR_GCC_ATOMIC) + defined(GPR_GCC_SYNC) + \
|
||||
defined(GPR_WINDOWS_ATOMIC) != \
|
||||
1
|
||||
#error Must define exactly one of GPR_GCC_ATOMIC, GPR_GCC_SYNC, GPR_WINDOWS_ATOMIC
|
||||
#endif
|
||||
|
||||
#if defined(GPR_ARCH_32) + defined(GPR_ARCH_64) != 1
|
||||
#error Must define exactly one of GPR_ARCH_32, GPR_ARCH_64
|
||||
#endif
|
||||
|
||||
#if defined(GPR_CPU_LINUX) + defined(GPR_CPU_POSIX) + defined(GPR_WINDOWS) + \
|
||||
defined(GPR_CPU_IPHONE) + defined(GPR_CPU_CUSTOM) != \
|
||||
1
|
||||
#error Must define exactly one of GPR_CPU_LINUX, GPR_CPU_POSIX, GPR_WINDOWS, GPR_CPU_IPHONE, GPR_CPU_CUSTOM
|
||||
#endif
|
||||
|
||||
#if defined(GPR_MSVC_TLS) + defined(GPR_GCC_TLS) + defined(GPR_PTHREAD_TLS) + \
|
||||
defined(GPR_CUSTOM_TLS) != \
|
||||
1
|
||||
#error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_CUSTOM_TLS
|
||||
#endif
|
||||
|
||||
/* maximum alignment needed for any type on this platform, rounded up to a
|
||||
power of two */
|
||||
#define GPR_MAX_ALIGNMENT 16
|
||||
|
||||
#ifndef GRPC_ARES
|
||||
#ifdef GPR_WINDOWS
|
||||
#define GRPC_ARES 0
|
||||
#else
|
||||
#define GRPC_ARES 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef GRPC_MUST_USE_RESULT
|
||||
#if defined(__GNUC__) && !defined(__MINGW32__)
|
||||
#define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result))
|
||||
#define GPR_ALIGN_STRUCT(n) __attribute__((aligned(n)))
|
||||
#else
|
||||
#define GRPC_MUST_USE_RESULT
|
||||
#define GPR_ALIGN_STRUCT(n)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef GPR_PRINT_FORMAT_CHECK
|
||||
#ifdef __GNUC__
|
||||
#define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) \
|
||||
__attribute__((format(printf, FORMAT_STR, ARGS)))
|
||||
#else
|
||||
#define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS)
|
||||
#endif
|
||||
#endif /* GPR_PRINT_FORMAT_CHECK */
|
||||
|
||||
#if GPR_FORBID_UNREACHABLE_CODE
|
||||
#define GPR_UNREACHABLE_CODE(STATEMENT)
|
||||
#else
|
||||
#define GPR_UNREACHABLE_CODE(STATEMENT) \
|
||||
do { \
|
||||
gpr_log(GPR_ERROR, "Should never reach here."); \
|
||||
abort(); \
|
||||
STATEMENT; \
|
||||
} while (0)
|
||||
#endif /* GPR_FORBID_UNREACHABLE_CODE */
|
||||
|
||||
#ifndef GPRAPI
|
||||
#define GPRAPI
|
||||
#endif
|
||||
|
||||
#ifndef GRPCAPI
|
||||
#define GRPCAPI GPRAPI
|
||||
#endif
|
||||
|
||||
#ifndef CENSUSAPI
|
||||
#define CENSUSAPI GRPCAPI
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_PORT_PLATFORM_H */
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2016 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H
|
||||
#define GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Propagation bits: this can be bitwise or-ed to form propagation_mask for
|
||||
* grpc_call */
|
||||
/** Propagate deadline */
|
||||
#define GRPC_PROPAGATE_DEADLINE ((uint32_t)1)
|
||||
/** Propagate census context */
|
||||
#define GRPC_PROPAGATE_CENSUS_STATS_CONTEXT ((uint32_t)2)
|
||||
#define GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT ((uint32_t)4)
|
||||
/** Propagate cancellation */
|
||||
#define GRPC_PROPAGATE_CANCELLATION ((uint32_t)8)
|
||||
|
||||
/** Default propagation mask: clients of the core API are encouraged to encode
|
||||
deltas from this in their implementations... ie write:
|
||||
GRPC_PROPAGATE_DEFAULTS & ~GRPC_PROPAGATE_DEADLINE to disable deadline
|
||||
propagation. Doing so gives flexibility in the future to define new
|
||||
propagation types that are default inherited or not. */
|
||||
#define GRPC_PROPAGATE_DEFAULTS \
|
||||
((uint32_t)(( \
|
||||
0xffff | GRPC_PROPAGATE_DEADLINE | GRPC_PROPAGATE_CENSUS_STATS_CONTEXT | \
|
||||
GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT | GRPC_PROPAGATE_CANCELLATION)))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user