mirror of
https://github.com/musix-org/musix-oss
synced 2025-07-02 05:43:37 +00:00
Updated
This commit is contained in:
202
node_modules/grpc/deps/grpc/LICENSE
generated
vendored
Normal file
202
node_modules/grpc/deps/grpc/LICENSE
generated
vendored
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
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.
|
13
node_modules/grpc/deps/grpc/NOTICE.txt
generated
vendored
Normal file
13
node_modules/grpc/deps/grpc/NOTICE.txt
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
Copyright 2014 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.
|
85
node_modules/grpc/deps/grpc/README.md
generated
vendored
Normal file
85
node_modules/grpc/deps/grpc/README.md
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
gRPC - An RPC library and framework
|
||||
===================================
|
||||
|
||||
gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. gRPC enables client and server applications to communicate transparently, and simplifies the building of connected systems.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><b>Homepage:</b></td>
|
||||
<td><a href="https://grpc.io/">grpc.io</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Mailing List:</b></td>
|
||||
<td><a href="https://groups.google.com/forum/#!forum/grpc-io">grpc-io@googlegroups.com</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
[](https://gitter.im/grpc/grpc?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
# To start using gRPC
|
||||
|
||||
To maximize usability, gRPC supports the standard method for adding dependencies to a user's chosen language (if there is one).
|
||||
In most languages, the gRPC runtime comes as a package available in a user's language package manager.
|
||||
|
||||
For instructions on how to use the language-specific gRPC runtime for a project, please refer to these documents
|
||||
|
||||
* [C++](src/cpp): follow the instructions under the `src/cpp` directory
|
||||
* [C#](src/csharp): NuGet package `Grpc`
|
||||
* [Dart](https://github.com/grpc/grpc-dart): pub package `grpc`
|
||||
* [Go](https://github.com/grpc/grpc-go): `go get google.golang.org/grpc`
|
||||
* [Java](https://github.com/grpc/grpc-java): Use JARs from Maven Central Repository
|
||||
* [Node](https://github.com/grpc/grpc-node): `npm install grpc`
|
||||
* [Objective-C](src/objective-c): Add `gRPC-ProtoRPC` dependency to podspec
|
||||
* [PHP](src/php): `pecl install grpc`
|
||||
* [Python](src/python/grpcio): `pip install grpcio`
|
||||
* [Ruby](src/ruby): `gem install grpc`
|
||||
* [WebJS](https://github.com/grpc/grpc-web): follow the grpc-web instructions
|
||||
|
||||
Per-language quickstart guides and tutorials can be found in the [documentation section on the grpc.io website](https://grpc.io/docs/). Code examples are available in the [examples](examples) directory.
|
||||
|
||||
Precompiled bleeding-edge package builds of gRPC `master` branch's `HEAD` are uploaded daily to [packages.grpc.io](https://packages.grpc.io).
|
||||
|
||||
# To start developing gRPC
|
||||
|
||||
Contributions are welcome!
|
||||
|
||||
Please read [How to contribute](CONTRIBUTING.md) which will guide you through the entire workflow of how to build the source code, how to run the tests, and how to contribute changes to
|
||||
the gRPC codebase.
|
||||
The "How to contribute" document also contains info on how the contribution process works and contains best practices for creating contributions.
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
Sometimes things go wrong. Please check out the [Troubleshooting guide](TROUBLESHOOTING.md) if you are experiencing issues with gRPC.
|
||||
|
||||
# Performance
|
||||
|
||||
See the [Performance dashboard](http://performance-dot-grpc-testing.appspot.com/explore?dashboard=5636470266134528) for performance numbers of the latest released version.
|
||||
|
||||
# Concepts
|
||||
|
||||
See [gRPC Concepts](CONCEPTS.md)
|
||||
|
||||
# About This Repository
|
||||
|
||||
This repository contains source code for gRPC libraries implemented in multiple languages written on top of a shared C core library [src/core](src/core).
|
||||
|
||||
Libraries in different languages may be in various states of development. We are seeking contributions for all of these libraries:
|
||||
|
||||
| Language | Source |
|
||||
|-------------------------|-------------------------------------|
|
||||
| Shared C [core library] | [src/core](src/core) |
|
||||
| C++ | [src/cpp](src/cpp) |
|
||||
| Ruby | [src/ruby](src/ruby) |
|
||||
| Python | [src/python](src/python) |
|
||||
| PHP | [src/php](src/php) |
|
||||
| C# | [src/csharp](src/csharp) |
|
||||
| Objective-C | [src/objective-c](src/objective-c) |
|
||||
|
||||
| Language | Source repo |
|
||||
|-------------------------|------------------------------------------------------|
|
||||
| Java | [grpc-java](http://github.com/grpc/grpc-java) |
|
||||
| Go | [grpc-go](http://github.com/grpc/grpc-go) |
|
||||
| NodeJS | [grpc-node](https://github.com/grpc/grpc-node) |
|
||||
| WebJS | [grpc-web](https://github.com/grpc/grpc-web) |
|
||||
| Dart | [grpc-dart](https://github.com/grpc/grpc-dart) |
|
||||
|
4
node_modules/grpc/deps/grpc/etc/README.md
generated
vendored
Normal file
4
node_modules/grpc/deps/grpc/etc/README.md
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
The roots.pem file is periodically generated from:
|
||||
https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt
|
||||
using
|
||||
https://github.com/agl/extract-nss-root-certs
|
4700
node_modules/grpc/deps/grpc/etc/roots.pem
generated
vendored
Normal file
4700
node_modules/grpc/deps/grpc/etc/roots.pem
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
27
node_modules/grpc/deps/grpc/include/grpc/byte_buffer.h
generated
vendored
Normal file
27
node_modules/grpc/deps/grpc/include/grpc/byte_buffer.h
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
*
|
||||
* 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/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/byte_buffer.h>
|
||||
#include <grpc/slice_buffer.h>
|
||||
|
||||
#endif /* GRPC_BYTE_BUFFER_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/byte_buffer_reader.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/byte_buffer_reader.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/byte_buffer_reader.h>
|
||||
|
||||
#endif /* GRPC_BYTE_BUFFER_READER_H */
|
40
node_modules/grpc/deps/grpc/include/grpc/census.h
generated
vendored
Normal file
40
node_modules/grpc/deps/grpc/include/grpc/census.h
generated
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
*
|
||||
* 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_CENSUS_H
|
||||
#define GRPC_CENSUS_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
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). */
|
||||
typedef struct census_context census_context;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_CENSUS_H */
|
75
node_modules/grpc/deps/grpc/include/grpc/compression.h
generated
vendored
Normal file
75
node_modules/grpc/deps/grpc/include/grpc/compression.h
generated
vendored
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
*
|
||||
* 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
|
||||
|
||||
/** Return if an algorithm is message compression algorithm. */
|
||||
GRPCAPI int grpc_compression_algorithm_is_message(
|
||||
grpc_compression_algorithm algorithm);
|
||||
|
||||
/** Return if an algorithm is stream compression algorithm. */
|
||||
GRPCAPI int grpc_compression_algorithm_is_stream(
|
||||
grpc_compression_algorithm algorithm);
|
||||
|
||||
/** Parses the \a slice as a grpc_compression_algorithm instance and 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, const char** name);
|
||||
|
||||
/** Returns the compression algorithm corresponding to \a level for the
|
||||
* compression algorithms encoded in the \a accepted_encodings bitset.*/
|
||||
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 */
|
26
node_modules/grpc/deps/grpc/include/grpc/fork.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/fork.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_FORK_H
|
||||
#define GRPC_FORK_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/fork.h>
|
||||
|
||||
#endif /* GRPC_FORK_H */
|
538
node_modules/grpc/deps/grpc/include/grpc/grpc.h
generated
vendored
Normal file
538
node_modules/grpc/deps/grpc/include/grpc/grpc.h
generated
vendored
Normal file
@ -0,0 +1,538 @@
|
||||
/*
|
||||
*
|
||||
* 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/support/port_platform.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.
|
||||
|
||||
After it's called, a matching invocation to grpc_shutdown() is expected.
|
||||
|
||||
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.
|
||||
|
||||
Before it's called, there should haven been a matching invocation to
|
||||
grpc_init().
|
||||
|
||||
The last call to grpc_shutdown will initiate cleaning up of grpc library
|
||||
internals, which can happen in another thread. Once the clean-up is done,
|
||||
no memory is used by grpc, 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);
|
||||
|
||||
/** EXPERIMENTAL. Returns 1 if the grpc library has been initialized.
|
||||
TODO(ericgribkoff) Decide if this should be promoted to non-experimental as
|
||||
part of stabilizing the fork support API, as tracked in
|
||||
https://github.com/grpc/grpc/issues/15334 */
|
||||
GRPCAPI int grpc_is_initialized(void);
|
||||
|
||||
/** EXPERIMENTAL. Blocking shut down grpc library.
|
||||
This is only for wrapped language to use now. */
|
||||
GRPCAPI void grpc_shutdown_blocking(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);
|
||||
|
||||
/** Helper function to create a completion queue with grpc_cq_completion_type
|
||||
of GRPC_CQ_CALLBACK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING.
|
||||
This function is experimental. */
|
||||
GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_callback(
|
||||
grpc_experimental_completion_queue_functor* shutdown_callback,
|
||||
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);
|
||||
|
||||
/*********** EXPERIMENTAL API ************/
|
||||
/** Initializes a thread local cache for \a cq.
|
||||
* grpc_flush_cq_tls_cache() MUST be called on the same thread,
|
||||
* with the same cq.
|
||||
*/
|
||||
GRPCAPI void grpc_completion_queue_thread_local_cache_init(
|
||||
grpc_completion_queue* cq);
|
||||
|
||||
/*********** EXPERIMENTAL API ************/
|
||||
/** Flushes the thread local cache for \a cq.
|
||||
* Returns 1 if there was contents in the cache. If there was an event
|
||||
* in \a cq tls cache, its tag is placed in tag, and ok is set to the
|
||||
* event success.
|
||||
*/
|
||||
GRPCAPI int grpc_completion_queue_thread_local_cache_flush(
|
||||
grpc_completion_queue* cq, void** tag, int* ok);
|
||||
|
||||
/** 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);
|
||||
|
||||
/** Check whether a grpc channel supports connectivity watcher */
|
||||
GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel* channel);
|
||||
|
||||
/** 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.
|
||||
If a call to grpc_call_start_batch with an empty batch returns
|
||||
GRPC_CALL_OK, the tag is put in the completion queue immediately.
|
||||
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. Access to grpc_call_start_batch with an empty batch is
|
||||
thread-compatible. */
|
||||
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);
|
||||
|
||||
/** EXPERIMENTAL. Resets the channel's connect backoff.
|
||||
TODO(roth): When we see whether this proves useful, either promote
|
||||
to non-experimental or remove it. */
|
||||
GRPCAPI void grpc_channel_reset_connect_backoff(grpc_channel* channel);
|
||||
|
||||
/** 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. The user data in 'args' need only
|
||||
live through the invocation of this function. However, if any args of the
|
||||
'pointer' type are passed, then the referenced vtable must be maintained
|
||||
by the caller until grpc_channel_destroy terminates. See grpc_channel_args
|
||||
definition for more on this. */
|
||||
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. */
|
||||
|
||||
/** Cancel an RPC.
|
||||
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);
|
||||
|
||||
/** Cancel an RPC.
|
||||
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_ref 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. The user data in 'args' need only live through the invocation of
|
||||
this function. However, if any args of the 'pointer' type are passed, then
|
||||
the referenced vtable must be maintained by the caller until
|
||||
grpc_server_destroy terminates. See grpc_channel_args definition for more
|
||||
on this. */
|
||||
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);
|
||||
|
||||
/** Update the size of the maximum number of threads allowed */
|
||||
GRPCAPI void grpc_resource_quota_set_max_threads(
|
||||
grpc_resource_quota* resource_quota, int new_max_threads);
|
||||
|
||||
/** 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);
|
||||
|
||||
/************* CHANNELZ API *************/
|
||||
/** Channelz is under active development. The following APIs will see some
|
||||
churn as the feature is implemented. This comment will be removed once
|
||||
channelz is officially supported, and these APIs become stable. For now
|
||||
you may track the progress by following this github issue:
|
||||
https://github.com/grpc/grpc/issues/15340
|
||||
|
||||
the following APIs return allocated JSON strings that match the response
|
||||
objects from the channelz proto, found here:
|
||||
https://github.com/grpc/grpc/blob/master/src/proto/grpc/channelz/channelz.proto.
|
||||
|
||||
For easy conversion to protobuf, The JSON is formatted according to:
|
||||
https://developers.google.com/protocol-buffers/docs/proto3#json. */
|
||||
|
||||
/* Gets all root channels (i.e. channels the application has directly
|
||||
created). This does not include subchannels nor non-top level channels.
|
||||
The returned string is allocated and must be freed by the application. */
|
||||
GRPCAPI char* grpc_channelz_get_top_channels(intptr_t start_channel_id);
|
||||
|
||||
/* Gets all servers that exist in the process. */
|
||||
GRPCAPI char* grpc_channelz_get_servers(intptr_t start_server_id);
|
||||
|
||||
/* Returns a single Server, or else a NOT_FOUND code. */
|
||||
GRPCAPI char* grpc_channelz_get_server(intptr_t server_id);
|
||||
|
||||
/* Gets all server sockets that exist in the server. */
|
||||
GRPCAPI char* grpc_channelz_get_server_sockets(intptr_t server_id,
|
||||
intptr_t start_socket_id,
|
||||
intptr_t max_results);
|
||||
|
||||
/* Returns a single Channel, or else a NOT_FOUND code. The returned string
|
||||
is allocated and must be freed by the application. */
|
||||
GRPCAPI char* grpc_channelz_get_channel(intptr_t channel_id);
|
||||
|
||||
/* Returns a single Subchannel, or else a NOT_FOUND code. The returned string
|
||||
is allocated and must be freed by the application. */
|
||||
GRPCAPI char* grpc_channelz_get_subchannel(intptr_t subchannel_id);
|
||||
|
||||
/* Returns a single Socket, or else a NOT_FOUND code. The returned string
|
||||
is allocated and must be freed by the application. */
|
||||
GRPCAPI char* grpc_channelz_get_socket(intptr_t socket_id);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_H */
|
38
node_modules/grpc/deps/grpc/include/grpc/grpc_cronet.h
generated
vendored
Normal file
38
node_modules/grpc/deps/grpc/include/grpc/grpc_cronet.h
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
*
|
||||
* 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/support/port_platform.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 */
|
59
node_modules/grpc/deps/grpc/include/grpc/grpc_posix.h
generated
vendored
Normal file
59
node_modules/grpc/deps/grpc/include/grpc/grpc_posix.h
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
*
|
||||
* 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/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.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);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_POSIX_H */
|
934
node_modules/grpc/deps/grpc/include/grpc/grpc_security.h
generated
vendored
Normal file
934
node_modules/grpc/deps/grpc/include/grpc/grpc_security.h
generated
vendored
Normal file
@ -0,0 +1,934 @@
|
||||
/*
|
||||
*
|
||||
* 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/support/port_platform.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);
|
||||
|
||||
/** --- SSL Session Cache. ---
|
||||
|
||||
A SSL session cache object represents a way to cache client sessions
|
||||
between connections. Only ticket-based resumption is supported. */
|
||||
|
||||
typedef struct grpc_ssl_session_cache grpc_ssl_session_cache;
|
||||
|
||||
/** Create LRU cache for client-side SSL sessions with the given capacity.
|
||||
If capacity is < 1, a default capacity is used instead. */
|
||||
GRPCAPI grpc_ssl_session_cache* grpc_ssl_session_cache_create_lru(
|
||||
size_t capacity);
|
||||
|
||||
/** Destroy SSL session cache. */
|
||||
GRPCAPI void grpc_ssl_session_cache_destroy(grpc_ssl_session_cache* cache);
|
||||
|
||||
/** Create a channel arg with the given cache object. */
|
||||
GRPCAPI grpc_arg
|
||||
grpc_ssl_session_cache_create_channel_arg(grpc_ssl_session_cache* cache);
|
||||
|
||||
/** --- 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;
|
||||
|
||||
/** Deprecated in favor of grpc_ssl_verify_peer_options. It will be removed
|
||||
after all of its call sites are migrated to grpc_ssl_verify_peer_options.
|
||||
Object that holds additional peer-verification options on a secure
|
||||
channel. */
|
||||
typedef struct {
|
||||
/** If non-NULL this callback will be invoked with the expected
|
||||
target_name, the peer's certificate (in PEM format), and whatever
|
||||
userdata pointer is set below. If a non-zero value is returned by this
|
||||
callback then it is treated as a verification failure. Invocation of
|
||||
the callback is blocking, so any implementation should be light-weight.
|
||||
*/
|
||||
int (*verify_peer_callback)(const char* target_name, const char* peer_pem,
|
||||
void* userdata);
|
||||
/** Arbitrary userdata that will be passed as the last argument to
|
||||
verify_peer_callback. */
|
||||
void* verify_peer_callback_userdata;
|
||||
/** A destruct callback that will be invoked when the channel is being
|
||||
cleaned up. The userdata argument will be passed to it. The intent is
|
||||
to perform any cleanup associated with that userdata. */
|
||||
void (*verify_peer_destruct)(void* userdata);
|
||||
} verify_peer_options;
|
||||
|
||||
/** Object that holds additional peer-verification options on a secure
|
||||
channel. */
|
||||
typedef struct {
|
||||
/** If non-NULL this callback will be invoked with the expected
|
||||
target_name, the peer's certificate (in PEM format), and whatever
|
||||
userdata pointer is set below. If a non-zero value is returned by this
|
||||
callback then it is treated as a verification failure. Invocation of
|
||||
the callback is blocking, so any implementation should be light-weight.
|
||||
*/
|
||||
int (*verify_peer_callback)(const char* target_name, const char* peer_pem,
|
||||
void* userdata);
|
||||
/** Arbitrary userdata that will be passed as the last argument to
|
||||
verify_peer_callback. */
|
||||
void* verify_peer_callback_userdata;
|
||||
/** A destruct callback that will be invoked when the channel is being
|
||||
cleaned up. The userdata argument will be passed to it. The intent is
|
||||
to perform any cleanup associated with that userdata. */
|
||||
void (*verify_peer_destruct)(void* userdata);
|
||||
} grpc_ssl_verify_peer_options;
|
||||
|
||||
/** Deprecated in favor of grpc_ssl_server_credentials_create_ex. It will be
|
||||
removed after all of its call sites are migrated to
|
||||
grpc_ssl_server_credentials_create_ex. 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).
|
||||
|
||||
gRPC has implemented root cache if the underlying OpenSSL library supports
|
||||
it. The gRPC root certificates cache is only applicable on the default
|
||||
root certificates, which is used when this parameter is nullptr. If user
|
||||
provides their own pem_root_certs, when creating an SSL credential object,
|
||||
gRPC would not be able to cache it, and each subchannel will generate a
|
||||
copy of the root store. So it is recommended to avoid providing large room
|
||||
pem with pem_root_certs parameter to avoid excessive memory consumption,
|
||||
particularly on mobile platforms such as iOS.
|
||||
- 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.
|
||||
- verify_options is an optional verify_peer_options object which holds
|
||||
additional options controlling how peer certificates are verified. For
|
||||
example, you can supply a callback which receives the peer's certificate
|
||||
with which you can do additional verification. Can be NULL, in which
|
||||
case verification will retain default behavior. Any settings in
|
||||
verify_options are copied during this call, so the verify_options
|
||||
object can be released afterwards. */
|
||||
GRPCAPI grpc_channel_credentials* grpc_ssl_credentials_create(
|
||||
const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair,
|
||||
const verify_peer_options* verify_options, void* reserved);
|
||||
|
||||
/* 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).
|
||||
|
||||
gRPC has implemented root cache if the underlying OpenSSL library supports
|
||||
it. The gRPC root certificates cache is only applicable on the default
|
||||
root certificates, which is used when this parameter is nullptr. If user
|
||||
provides their own pem_root_certs, when creating an SSL credential object,
|
||||
gRPC would not be able to cache it, and each subchannel will generate a
|
||||
copy of the root store. So it is recommended to avoid providing large room
|
||||
pem with pem_root_certs parameter to avoid excessive memory consumption,
|
||||
particularly on mobile platforms such as iOS.
|
||||
- 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.
|
||||
- verify_options is an optional verify_peer_options object which holds
|
||||
additional options controlling how peer certificates are verified. For
|
||||
example, you can supply a callback which receives the peer's certificate
|
||||
with which you can do additional verification. Can be NULL, in which
|
||||
case verification will retain default behavior. Any settings in
|
||||
verify_options are copied during this call, so the verify_options
|
||||
object can be released afterwards. */
|
||||
GRPCAPI grpc_channel_credentials* grpc_ssl_credentials_create_ex(
|
||||
const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair,
|
||||
const grpc_ssl_verify_peer_options* verify_options, 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(void);
|
||||
|
||||
/** 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
|
||||
acquired 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);
|
||||
|
||||
/** Options for creating STS Oauth Token Exchange credentials following the IETF
|
||||
draft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16.
|
||||
Optional fields may be set to NULL or empty string. It is the responsibility
|
||||
of the caller to ensure that the subject and actor tokens are refreshed on
|
||||
disk at the specified paths. This API is used for experimental purposes for
|
||||
now and may change in the future. */
|
||||
typedef struct {
|
||||
const char* token_exchange_service_uri; /* Required. */
|
||||
const char* resource; /* Optional. */
|
||||
const char* audience; /* Optional. */
|
||||
const char* scope; /* Optional. */
|
||||
const char* requested_token_type; /* Optional. */
|
||||
const char* subject_token_path; /* Required. */
|
||||
const char* subject_token_type; /* Required. */
|
||||
const char* actor_token_path; /* Optional. */
|
||||
const char* actor_token_type; /* Optional. */
|
||||
} grpc_sts_credentials_options;
|
||||
|
||||
/** Creates an STS credentials following the STS Token Exchanged specifed in the
|
||||
IETF draft https://tools.ietf.org/html/draft-ietf-oauth-token-exchange-16.
|
||||
This API is used for experimental purposes for now and may change in the
|
||||
future. */
|
||||
GRPCAPI grpc_call_credentials* grpc_sts_credentials_create(
|
||||
const grpc_sts_credentials_options* options, 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;
|
||||
|
||||
/** Maximum number of metadata entries returnable by a credentials plugin via
|
||||
a synchronous return. */
|
||||
#define GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX 4
|
||||
|
||||
/** 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, but can
|
||||
be performed synchronously or asynchronously.
|
||||
|
||||
If processing occurs synchronously, returns non-zero and populates
|
||||
creds_md, num_creds_md, status, and error_details. In this case,
|
||||
the caller takes ownership of the entries in creds_md and of
|
||||
error_details. Note that if the plugin needs to return more than
|
||||
GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX entries in creds_md, it must
|
||||
return asynchronously.
|
||||
|
||||
If processing occurs asynchronously, returns zero and invokes \a cb
|
||||
when processing is completed. \a user_data will be passed as the
|
||||
first parameter of the callback. NOTE: \a cb MUST be invoked in a
|
||||
different thread, not from the thread in which \a get_metadata() is
|
||||
invoked.
|
||||
|
||||
\a context is the information that can be used by the plugin to create
|
||||
auth metadata. */
|
||||
int (*get_metadata)(
|
||||
void* state, grpc_auth_metadata_context context,
|
||||
grpc_credentials_plugin_metadata_cb cb, void* user_data,
|
||||
grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX],
|
||||
size_t* num_creds_md, grpc_status_code* status,
|
||||
const char** error_details);
|
||||
|
||||
/** 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. Additional
|
||||
channel level configuration MAY be provided by grpc_channel_args, though
|
||||
the expectation is that most clients will want to simply pass NULL. The
|
||||
user data in 'args' need only live through the invocation of this function.
|
||||
However, if any args of the 'pointer' type are passed, then the referenced
|
||||
vtable must be maintained by the caller until grpc_channel_destroy
|
||||
terminates. See grpc_channel_args definition for more on this. */
|
||||
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);
|
||||
|
||||
/** Server certificate config object holds the server's public certificates and
|
||||
associated private keys, as well as any CA certificates needed for client
|
||||
certificate validation (if applicable). Create using
|
||||
grpc_ssl_server_certificate_config_create(). */
|
||||
typedef struct grpc_ssl_server_certificate_config
|
||||
grpc_ssl_server_certificate_config;
|
||||
|
||||
/** Creates a grpc_ssl_server_certificate_config 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 must be at least 1.
|
||||
- It is the caller's responsibility to free this object via
|
||||
grpc_ssl_server_certificate_config_destroy(). */
|
||||
GRPCAPI grpc_ssl_server_certificate_config*
|
||||
grpc_ssl_server_certificate_config_create(
|
||||
const char* pem_root_certs,
|
||||
const grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs,
|
||||
size_t num_key_cert_pairs);
|
||||
|
||||
/** Destroys a grpc_ssl_server_certificate_config object. */
|
||||
GRPCAPI void grpc_ssl_server_certificate_config_destroy(
|
||||
grpc_ssl_server_certificate_config* config);
|
||||
|
||||
/** Callback to retrieve updated SSL server certificates, private keys, and
|
||||
trusted CAs (for client authentication).
|
||||
- user_data parameter, if not NULL, contains opaque data to be used by the
|
||||
callback.
|
||||
- Use grpc_ssl_server_certificate_config_create to create the config.
|
||||
- The caller assumes ownership of the config. */
|
||||
typedef grpc_ssl_certificate_config_reload_status (
|
||||
*grpc_ssl_server_certificate_config_callback)(
|
||||
void* user_data, grpc_ssl_server_certificate_config** config);
|
||||
|
||||
/** 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);
|
||||
|
||||
/** Deprecated in favor of grpc_ssl_server_credentials_create_with_options.
|
||||
Same as grpc_ssl_server_credentials_create method except uses
|
||||
grpc_ssl_client_certificate_request_type enum to support more ways to
|
||||
authenticate client certificates.*/
|
||||
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);
|
||||
|
||||
typedef struct grpc_ssl_server_credentials_options
|
||||
grpc_ssl_server_credentials_options;
|
||||
|
||||
/** Creates an options object using a certificate config. Use this method when
|
||||
the certificates and keys of the SSL server will not change during the
|
||||
server's lifetime.
|
||||
- Takes ownership of the certificate_config parameter. */
|
||||
GRPCAPI grpc_ssl_server_credentials_options*
|
||||
grpc_ssl_server_credentials_create_options_using_config(
|
||||
grpc_ssl_client_certificate_request_type client_certificate_request,
|
||||
grpc_ssl_server_certificate_config* certificate_config);
|
||||
|
||||
/** Creates an options object using a certificate config fetcher. Use this
|
||||
method to reload the certificates and keys of the SSL server without
|
||||
interrupting the operation of the server. Initial certificate config will be
|
||||
fetched during server initialization.
|
||||
- user_data parameter, if not NULL, contains opaque data which will be passed
|
||||
to the fetcher (see definition of
|
||||
grpc_ssl_server_certificate_config_callback). */
|
||||
GRPCAPI grpc_ssl_server_credentials_options*
|
||||
grpc_ssl_server_credentials_create_options_using_config_fetcher(
|
||||
grpc_ssl_client_certificate_request_type client_certificate_request,
|
||||
grpc_ssl_server_certificate_config_callback cb, void* user_data);
|
||||
|
||||
/** Destroys a grpc_ssl_server_credentials_options object. */
|
||||
GRPCAPI void grpc_ssl_server_credentials_options_destroy(
|
||||
grpc_ssl_server_credentials_options* options);
|
||||
|
||||
/** Creates an SSL server_credentials object using the provided options struct.
|
||||
- Takes ownership of the options parameter. */
|
||||
GRPCAPI grpc_server_credentials*
|
||||
grpc_ssl_server_credentials_create_with_options(
|
||||
grpc_ssl_server_credentials_options* options);
|
||||
|
||||
/** --- 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);
|
||||
|
||||
/** --- ALTS channel/server credentials --- **/
|
||||
|
||||
/**
|
||||
* Main interface for ALTS credentials options. The options will contain
|
||||
* information that will be passed from grpc to TSI layer such as RPC protocol
|
||||
* versions. ALTS client (channel) and server credentials will have their own
|
||||
* implementation of this interface. The APIs listed in this header are
|
||||
* thread-compatible. It is used for experimental purpose for now and subject
|
||||
* to change.
|
||||
*/
|
||||
typedef struct grpc_alts_credentials_options grpc_alts_credentials_options;
|
||||
|
||||
/**
|
||||
* This method creates a grpc ALTS credentials client options instance.
|
||||
* It is used for experimental purpose for now and subject to change.
|
||||
*/
|
||||
GRPCAPI grpc_alts_credentials_options*
|
||||
grpc_alts_credentials_client_options_create(void);
|
||||
|
||||
/**
|
||||
* This method creates a grpc ALTS credentials server options instance.
|
||||
* It is used for experimental purpose for now and subject to change.
|
||||
*/
|
||||
GRPCAPI grpc_alts_credentials_options*
|
||||
grpc_alts_credentials_server_options_create(void);
|
||||
|
||||
/**
|
||||
* This method adds a target service account to grpc client's ALTS credentials
|
||||
* options instance. It is used for experimental purpose for now and subject
|
||||
* to change.
|
||||
*
|
||||
* - options: grpc ALTS credentials options instance.
|
||||
* - service_account: service account of target endpoint.
|
||||
*/
|
||||
GRPCAPI void grpc_alts_credentials_client_options_add_target_service_account(
|
||||
grpc_alts_credentials_options* options, const char* service_account);
|
||||
|
||||
/**
|
||||
* This method destroys a grpc_alts_credentials_options instance by
|
||||
* de-allocating all of its occupied memory. It is used for experimental purpose
|
||||
* for now and subject to change.
|
||||
*
|
||||
* - options: a grpc_alts_credentials_options instance that needs to be
|
||||
* destroyed.
|
||||
*/
|
||||
GRPCAPI void grpc_alts_credentials_options_destroy(
|
||||
grpc_alts_credentials_options* options);
|
||||
|
||||
/**
|
||||
* This method creates an ALTS channel credential object. It is used for
|
||||
* experimental purpose for now and subject to change.
|
||||
*
|
||||
* - options: grpc ALTS credentials options instance for client.
|
||||
*
|
||||
* It returns the created ALTS channel credential object.
|
||||
*/
|
||||
GRPCAPI grpc_channel_credentials* grpc_alts_credentials_create(
|
||||
const grpc_alts_credentials_options* options);
|
||||
|
||||
/**
|
||||
* This method creates an ALTS server credential object. It is used for
|
||||
* experimental purpose for now and subject to change.
|
||||
*
|
||||
* - options: grpc ALTS credentials options instance for server.
|
||||
*
|
||||
* It returns the created ALTS server credential object.
|
||||
*/
|
||||
GRPCAPI grpc_server_credentials* grpc_alts_server_credentials_create(
|
||||
const grpc_alts_credentials_options* options);
|
||||
|
||||
/** --- Local channel/server credentials --- **/
|
||||
|
||||
/**
|
||||
* This method creates a local channel credential object. It is used for
|
||||
* experimental purpose for now and subject to change.
|
||||
*
|
||||
* - type: local connection type
|
||||
*
|
||||
* It returns the created local channel credential object.
|
||||
*/
|
||||
GRPCAPI grpc_channel_credentials* grpc_local_credentials_create(
|
||||
grpc_local_connect_type type);
|
||||
|
||||
/**
|
||||
* This method creates a local server credential object. It is used for
|
||||
* experimental purpose for now and subject to change.
|
||||
*
|
||||
* - type: local connection type
|
||||
*
|
||||
* It returns the created local server credential object.
|
||||
*/
|
||||
GRPCAPI grpc_server_credentials* grpc_local_server_credentials_create(
|
||||
grpc_local_connect_type type);
|
||||
|
||||
/** --- SPIFFE and HTTPS-based TLS channel/server credentials ---
|
||||
* It is used for experimental purpose for now and subject to change. */
|
||||
|
||||
/** Config for TLS key materials. It is used for
|
||||
* experimental purpose for now and subject to change. */
|
||||
typedef struct grpc_tls_key_materials_config grpc_tls_key_materials_config;
|
||||
|
||||
/** Config for TLS credential reload. It is used for
|
||||
* experimental purpose for now and subject to change. */
|
||||
typedef struct grpc_tls_credential_reload_config
|
||||
grpc_tls_credential_reload_config;
|
||||
|
||||
/** Config for TLS server authorization check. It is used for
|
||||
* experimental purpose for now and subject to change. */
|
||||
typedef struct grpc_tls_server_authorization_check_config
|
||||
grpc_tls_server_authorization_check_config;
|
||||
|
||||
/** TLS credentials options. It is used for
|
||||
* experimental purpose for now and subject to change. */
|
||||
typedef struct grpc_tls_credentials_options grpc_tls_credentials_options;
|
||||
|
||||
/** Create an empty TLS credentials options. It is used for
|
||||
* experimental purpose for now and subject to change. */
|
||||
GRPCAPI grpc_tls_credentials_options* grpc_tls_credentials_options_create(void);
|
||||
|
||||
/** Set grpc_ssl_client_certificate_request_type field in credentials options
|
||||
with the provided type. options should not be NULL.
|
||||
It returns 1 on success and 0 on failure. It is used for
|
||||
experimental purpose for now and subject to change. */
|
||||
GRPCAPI int grpc_tls_credentials_options_set_cert_request_type(
|
||||
grpc_tls_credentials_options* options,
|
||||
grpc_ssl_client_certificate_request_type type);
|
||||
|
||||
/** Set grpc_tls_key_materials_config field in credentials options
|
||||
with the provided config struct whose ownership is transferred.
|
||||
Both parameters should not be NULL.
|
||||
It returns 1 on success and 0 on failure. It is used for
|
||||
experimental purpose for now and subject to change. */
|
||||
GRPCAPI int grpc_tls_credentials_options_set_key_materials_config(
|
||||
grpc_tls_credentials_options* options,
|
||||
grpc_tls_key_materials_config* config);
|
||||
|
||||
/** Set grpc_tls_credential_reload_config field in credentials options
|
||||
with the provided config struct whose ownership is transferred.
|
||||
Both parameters should not be NULL.
|
||||
It returns 1 on success and 0 on failure. It is used for
|
||||
experimental purpose for now and subject to change. */
|
||||
GRPCAPI int grpc_tls_credentials_options_set_credential_reload_config(
|
||||
grpc_tls_credentials_options* options,
|
||||
grpc_tls_credential_reload_config* config);
|
||||
|
||||
/** Set grpc_tls_server_authorization_check_config field in credentials options
|
||||
with the provided config struct whose ownership is transferred.
|
||||
Both parameters should not be NULL.
|
||||
It returns 1 on success and 0 on failure. It is used for
|
||||
experimental purpose for now and subject to change. */
|
||||
GRPCAPI int grpc_tls_credentials_options_set_server_authorization_check_config(
|
||||
grpc_tls_credentials_options* options,
|
||||
grpc_tls_server_authorization_check_config* config);
|
||||
|
||||
/** --- TLS key materials config. ---
|
||||
It is used for experimental purpose for now and subject to change. */
|
||||
|
||||
/** Create an empty grpc_tls_key_materials_config instance.
|
||||
* It is used for experimental purpose for now and subject to change. */
|
||||
GRPCAPI grpc_tls_key_materials_config* grpc_tls_key_materials_config_create(
|
||||
void);
|
||||
|
||||
/** Set grpc_tls_key_materials_config instance with provided a TLS certificate.
|
||||
config will take the ownership of pem_root_certs and pem_key_cert_pairs.
|
||||
It's valid for the caller to provide nullptr pem_root_certs, in which case
|
||||
the gRPC-provided root cert will be used. pem_key_cert_pairs should not be
|
||||
NULL. It returns 1 on success and 0 on failure. It is used for
|
||||
experimental purpose for now and subject to change.
|
||||
*/
|
||||
GRPCAPI int grpc_tls_key_materials_config_set_key_materials(
|
||||
grpc_tls_key_materials_config* config, const char* pem_root_certs,
|
||||
const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs,
|
||||
size_t num_key_cert_pairs);
|
||||
|
||||
/** --- TLS credential reload config. ---
|
||||
It is used for experimental purpose for now and subject to change.*/
|
||||
|
||||
typedef struct grpc_tls_credential_reload_arg grpc_tls_credential_reload_arg;
|
||||
|
||||
/** A callback function provided by gRPC to handle the result of credential
|
||||
reload. It is used when schedule API is implemented asynchronously and
|
||||
serves to bring the control back to grpc C core. It is used for
|
||||
experimental purpose for now and subject to change. */
|
||||
typedef void (*grpc_tls_on_credential_reload_done_cb)(
|
||||
grpc_tls_credential_reload_arg* arg);
|
||||
|
||||
/** A struct containing all information necessary to schedule/cancel
|
||||
a credential reload request. cb and cb_user_data represent a gRPC-provided
|
||||
callback and an argument passed to it. key_materials is an in/output
|
||||
parameter containing currently used/newly reloaded credentials. status and
|
||||
error_details are used to hold information about errors occurred when a
|
||||
credential reload request is scheduled/cancelled. It is used for
|
||||
experimental purpose for now and subject to change. */
|
||||
struct grpc_tls_credential_reload_arg {
|
||||
grpc_tls_on_credential_reload_done_cb cb;
|
||||
void* cb_user_data;
|
||||
grpc_tls_key_materials_config* key_materials_config;
|
||||
grpc_ssl_certificate_config_reload_status status;
|
||||
const char* error_details;
|
||||
};
|
||||
|
||||
/** Create a grpc_tls_credential_reload_config instance.
|
||||
- config_user_data is config-specific, read-only user data
|
||||
that works for all channels created with a credential using the config.
|
||||
- schedule is a pointer to an application-provided callback used to invoke
|
||||
credential reload API. The implementation of this method has to be
|
||||
non-blocking, but can be performed synchronously or asynchronously.
|
||||
1) If processing occurs synchronously, it populates arg->key_materials,
|
||||
arg->status, and arg->error_details and returns zero.
|
||||
2) If processing occurs asynchronously, it returns a non-zero value.
|
||||
The application then invokes arg->cb when processing is completed. Note
|
||||
that arg->cb cannot be invoked before schedule API returns.
|
||||
- cancel is a pointer to an application-provided callback used to cancel
|
||||
a credential reload request scheduled via an asynchronous schedule API.
|
||||
arg is used to pinpoint an exact reloading request to be cancelled.
|
||||
The operation may not have any effect if the request has already been
|
||||
processed.
|
||||
- destruct is a pointer to an application-provided callback used to clean up
|
||||
any data associated with the config.
|
||||
It is used for experimental purpose for now and subject to change.
|
||||
*/
|
||||
GRPCAPI grpc_tls_credential_reload_config*
|
||||
grpc_tls_credential_reload_config_create(
|
||||
const void* config_user_data,
|
||||
int (*schedule)(void* config_user_data,
|
||||
grpc_tls_credential_reload_arg* arg),
|
||||
void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg),
|
||||
void (*destruct)(void* config_user_data));
|
||||
|
||||
/** --- TLS server authorization check config. ---
|
||||
* It is used for experimental purpose for now and subject to change. */
|
||||
|
||||
typedef struct grpc_tls_server_authorization_check_arg
|
||||
grpc_tls_server_authorization_check_arg;
|
||||
|
||||
/** callback function provided by gRPC used to handle the result of server
|
||||
authorization check. It is used when schedule API is implemented
|
||||
asynchronously, and serves to bring the control back to gRPC C core. It is
|
||||
used for experimental purpose for now and subject to change. */
|
||||
typedef void (*grpc_tls_on_server_authorization_check_done_cb)(
|
||||
grpc_tls_server_authorization_check_arg* arg);
|
||||
|
||||
/** A struct containing all information necessary to schedule/cancel a server
|
||||
authorization check request. cb and cb_user_data represent a gRPC-provided
|
||||
callback and an argument passed to it. success will store the result of
|
||||
server authorization check. That is, if success returns a non-zero value, it
|
||||
means the authorization check passes and if returning zero, it means the
|
||||
check fails. target_name is the name of an endpoint the channel is connecting
|
||||
to and certificate represents a complete certificate chain including both
|
||||
signing and leaf certificates. status and error_details contain information
|
||||
about errors occurred when a server authorization check request is
|
||||
scheduled/cancelled. It is used for experimental purpose for now and subject
|
||||
to change.*/
|
||||
struct grpc_tls_server_authorization_check_arg {
|
||||
grpc_tls_on_server_authorization_check_done_cb cb;
|
||||
void* cb_user_data;
|
||||
int success;
|
||||
const char* target_name;
|
||||
const char* peer_cert;
|
||||
grpc_status_code status;
|
||||
const char* error_details;
|
||||
};
|
||||
|
||||
/** Create a grpc_tls_server_authorization_check_config instance.
|
||||
- config_user_data is config-specific, read-only user data
|
||||
that works for all channels created with a credential using the config.
|
||||
- schedule is a pointer to an application-provided callback used to invoke
|
||||
server authorization check API. The implementation of this method has to
|
||||
be non-blocking, but can be performed synchronously or asynchronously.
|
||||
1)If processing occurs synchronously, it populates arg->result,
|
||||
arg->status, and arg->error_details and returns zero.
|
||||
2) If processing occurs asynchronously, it returns a non-zero value. The
|
||||
application then invokes arg->cb when processing is completed. Note that
|
||||
arg->cb cannot be invoked before schedule API returns.
|
||||
- cancel is a pointer to an application-provided callback used to cancel a
|
||||
server authorization check request scheduled via an asynchronous schedule
|
||||
API. arg is used to pinpoint an exact check request to be cancelled. The
|
||||
operation may not have any effect if the request has already been
|
||||
processed.
|
||||
- destruct is a pointer to an application-provided callback used to clean up
|
||||
any data associated with the config.
|
||||
It is used for experimental purpose for now and subject to change.
|
||||
*/
|
||||
GRPCAPI grpc_tls_server_authorization_check_config*
|
||||
grpc_tls_server_authorization_check_config_create(
|
||||
const void* config_user_data,
|
||||
int (*schedule)(void* config_user_data,
|
||||
grpc_tls_server_authorization_check_arg* arg),
|
||||
void (*cancel)(void* config_user_data,
|
||||
grpc_tls_server_authorization_check_arg* arg),
|
||||
void (*destruct)(void* config_user_data));
|
||||
|
||||
/** --- SPIFFE channel/server credentials --- **/
|
||||
|
||||
/**
|
||||
* This method creates a TLS SPIFFE channel credential object.
|
||||
* It takes ownership of the options parameter.
|
||||
*
|
||||
* - options: grpc TLS credentials options instance.
|
||||
*
|
||||
* It returns the created credential object.
|
||||
*
|
||||
* It is used for experimental purpose for now and subject
|
||||
* to change.
|
||||
*/
|
||||
|
||||
grpc_channel_credentials* grpc_tls_spiffe_credentials_create(
|
||||
grpc_tls_credentials_options* options);
|
||||
|
||||
/**
|
||||
* This method creates a TLS server credential object.
|
||||
* It takes ownership of the options parameter.
|
||||
*
|
||||
* - options: grpc TLS credentials options instance.
|
||||
*
|
||||
* It returns the created credential object.
|
||||
*
|
||||
* It is used for experimental purpose for now and subject
|
||||
* to change.
|
||||
*/
|
||||
grpc_server_credentials* grpc_tls_spiffe_server_credentials_create(
|
||||
grpc_tls_credentials_options* options);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_SECURITY_H */
|
118
node_modules/grpc/deps/grpc/include/grpc/grpc_security_constants.h
generated
vendored
Normal file
118
node_modules/grpc/deps/grpc/include/grpc/grpc_security_constants.h
generated
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
*
|
||||
* 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"
|
||||
#define GRPC_SSL_SESSION_REUSED_PROPERTY "ssl_session_reused"
|
||||
|
||||
/** 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;
|
||||
|
||||
/** Callback results for dynamically loading a SSL certificate config. */
|
||||
typedef enum {
|
||||
GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED,
|
||||
GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW,
|
||||
GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL
|
||||
} grpc_ssl_certificate_config_reload_status;
|
||||
|
||||
typedef enum {
|
||||
/** Server does not request client certificate.
|
||||
The certificate presented by the client is not checked by the server at
|
||||
all. (A client may present a self signed or signed certificate or not
|
||||
present a certificate at all and any of those option 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 (the necessary metadata will be available to the
|
||||
application via authentication context properties, see grpc_auth_context).
|
||||
|
||||
The client's key certificate pair must 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
|
||||
the gRPC framework. (For a successful connection the client needs to either
|
||||
present a certificate that can be verified against the root certificate
|
||||
configured by the server or not present a certificate at all)
|
||||
|
||||
The client's key certificate pair must be valid for the SSL connection to
|
||||
be established. */
|
||||
GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY,
|
||||
/** Server requests client certificate and enforces that the client presents a
|
||||
certificate.
|
||||
|
||||
If the client presents a certificate, the client authentication is left to
|
||||
the application (the necessary metadata will be available to the
|
||||
application via authentication context properties, see grpc_auth_context).
|
||||
|
||||
The client's key certificate pair must be valid for the SSL connection to
|
||||
be established. */
|
||||
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY,
|
||||
/** Server requests client certificate and enforces that the client presents a
|
||||
certificate.
|
||||
|
||||
The certificate presented by the client is verified by the gRPC framework.
|
||||
(For a successful connection the client needs to present a certificate that
|
||||
can be verified against the root certificate configured by the server)
|
||||
|
||||
The client's key certificate pair must be valid for the SSL connection to
|
||||
be established. */
|
||||
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
|
||||
} grpc_ssl_client_certificate_request_type;
|
||||
|
||||
/**
|
||||
* Type of local connections for which local channel/server credentials will be
|
||||
* applied. It supports UDS and local TCP connections.
|
||||
*/
|
||||
typedef enum { UDS = 0, LOCAL_TCP } grpc_local_connect_type;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_GRPC_SECURITY_CONSTANTS_H */
|
95
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm.h
generated
vendored
Normal file
95
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm.h
generated
vendored
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
*
|
||||
* 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);
|
||||
gpr_atm gpr_atm_no_barrier_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
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#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);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_H */
|
91
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm_gcc_atomic.h
generated
vendored
Normal file
91
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm_gcc_atomic.h
generated
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
*
|
||||
* 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>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef intptr_t gpr_atm;
|
||||
#define GPR_ATM_MAX INTPTR_MAX
|
||||
#define GPR_ATM_MIN INTPTR_MIN
|
||||
|
||||
#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))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */
|
85
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm_gcc_sync.h
generated
vendored
Normal file
85
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm_gcc_sync.h
generated
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
*
|
||||
* 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_MIN INTPTR_MIN
|
||||
#define GPR_ATM_INC_CAS_THEN(blah) blah
|
||||
#define GPR_ATM_INC_ADD_THEN(blah) blah
|
||||
|
||||
#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 */
|
128
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm_windows.h
generated
vendored
Normal file
128
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/atm_windows.h
generated
vendored
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
*
|
||||
* 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_MIN INTPTR_MIN
|
||||
#define GPR_ATM_INC_CAS_THEN(blah) blah
|
||||
#define GPR_ATM_INC_ADD_THEN(blah) blah
|
||||
|
||||
#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 */
|
101
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/byte_buffer.h
generated
vendored
Normal file
101
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/byte_buffer.h
generated
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
*
|
||||
* 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_H
|
||||
#define GRPC_IMPL_CODEGEN_BYTE_BUFFER_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.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);
|
||||
|
||||
/** EXPERIMENTAL API - This function may be removed and changed, in the future.
|
||||
*
|
||||
* 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 making sure
|
||||
* the slice pointer remains valid when accessed.
|
||||
*
|
||||
* NOTE: Do not use this function unless the caller can guarantee that the
|
||||
* underlying grpc_byte_buffer outlasts the use of the slice. This is only
|
||||
* safe when the underlying grpc_byte_buffer remains immutable while slice
|
||||
* is being accessed. */
|
||||
GRPCAPI int grpc_byte_buffer_reader_peek(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_IMPL_CODEGEN_BYTE_BUFFER_H */
|
42
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/byte_buffer_reader.h
generated
vendored
Normal file
42
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/byte_buffer_reader.h
generated
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
*
|
||||
* 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 */
|
108
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/compression_types.h
generated
vendored
Normal file
108
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/compression_types.h
generated
vendored
Normal file
@ -0,0 +1,108 @@
|
||||
/*
|
||||
*
|
||||
* 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 (not sorted by
|
||||
* compression level) */
|
||||
typedef enum {
|
||||
GRPC_COMPRESS_NONE = 0,
|
||||
GRPC_COMPRESS_DEFLATE,
|
||||
GRPC_COMPRESS_GZIP,
|
||||
/* EXPERIMENTAL: Stream compression is currently experimental. */
|
||||
GRPC_COMPRESS_STREAM_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 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 message 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 */
|
44
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/connectivity_state.h
generated
vendored
Normal file
44
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/connectivity_state.h
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
*
|
||||
* 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 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 */
|
48
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/fork.h
generated
vendored
Normal file
48
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/fork.h
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_IMPL_CODEGEN_FORK_H
|
||||
#define GRPC_IMPL_CODEGEN_FORK_H
|
||||
|
||||
/**
|
||||
* gRPC applications should call this before calling fork(). There should be no
|
||||
* active gRPC function calls between calling grpc_prefork() and
|
||||
* grpc_postfork_parent()/grpc_postfork_child().
|
||||
*
|
||||
*
|
||||
* Typical use:
|
||||
* grpc_prefork();
|
||||
* int pid = fork();
|
||||
* if (pid) {
|
||||
* grpc_postfork_parent();
|
||||
* // Parent process..
|
||||
* } else {
|
||||
* grpc_postfork_child();
|
||||
* // Child process...
|
||||
* }
|
||||
*/
|
||||
|
||||
void grpc_prefork(void);
|
||||
|
||||
void grpc_postfork_parent(void);
|
||||
|
||||
void grpc_postfork_child(void);
|
||||
|
||||
void grpc_fork_handlers_auto_register(void);
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_FORK_H */
|
69
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/gpr_slice.h
generated
vendored
Normal file
69
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/gpr_slice.h
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
*
|
||||
* 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 */
|
59
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/gpr_types.h
generated
vendored
Normal file
59
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/gpr_types.h
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
*
|
||||
* 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 measure) */
|
||||
gpr_clock_type clock_type;
|
||||
} gpr_timespec;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_GPR_TYPES_H */
|
748
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/grpc_types.h
generated
vendored
Normal file
748
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/grpc_types.h
generated
vendored
Normal file
@ -0,0 +1,748 @@
|
||||
/*
|
||||
*
|
||||
* 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/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)(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 keys and values in this structure need only live through the
|
||||
creation invocation).
|
||||
|
||||
However, if one of the args has grpc_arg_type==GRPC_ARG_POINTER, then the
|
||||
grpc_arg_pointer_vtable must live until the channel args are done being
|
||||
used by core (i.e. when the object for use with which they were passed
|
||||
is destroyed).
|
||||
|
||||
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, after which the
|
||||
* server will close the connection. 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 channel 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"
|
||||
/** Timeout after the last RPC finishes on the client channel at which the
|
||||
* channel goes back into IDLE state. Int valued, milliseconds. INT_MAX means
|
||||
* unlimited. */
|
||||
/** TODO(qianchengz): Currently the default value is INT_MAX, which means the
|
||||
* client idle filter is disabled by default. After the client idle filter
|
||||
* proves no perfomance issue, we will change the default value to a reasonable
|
||||
* value. */
|
||||
#define GRPC_ARG_CLIENT_IDLE_TIMEOUT_MS "grpc.client_idle_timeout_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 between sending successive ping frames without receiving any
|
||||
data frame, Int valued, milliseconds. */
|
||||
#define GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS \
|
||||
"grpc.http2.min_time_between_pings_ms"
|
||||
/** Minimum allowed time between a server receiving successive ping frames
|
||||
without sending any data frame. Int valued, milliseconds */
|
||||
#define GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS \
|
||||
"grpc.http2.min_ping_interval_without_data_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"
|
||||
/** 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"
|
||||
/** Minimum amount of time between DNS resolutions, in ms */
|
||||
#define GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS \
|
||||
"grpc.dns_min_time_between_resolutions_ms"
|
||||
/** The timeout used on servers for finishing handshaking on an incoming
|
||||
connection. Defaults to 120 seconds. */
|
||||
#define GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS "grpc.server_handshake_timeout_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"
|
||||
/** If non-zero, a pointer to a session cache (a pointer of type
|
||||
grpc_ssl_session_cache*). (use grpc_ssl_session_cache_arg_vtable() to fetch
|
||||
an appropriate pointer arg vtable) */
|
||||
#define GRPC_SSL_SESSION_CACHE_ARG "grpc.ssl_session_cache"
|
||||
/** 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"
|
||||
/** The maximum amount of memory used by trace events per channel trace node.
|
||||
* Once the maximum is reached, subsequent events will evict the oldest events
|
||||
* from the buffer. The unit for this knob is bytes. Setting it to zero causes
|
||||
* channel tracing to be disabled. */
|
||||
#define GRPC_ARG_MAX_CHANNEL_TRACE_EVENT_MEMORY_PER_NODE \
|
||||
"grpc.max_channel_trace_event_memory_per_node"
|
||||
/** If non-zero, gRPC library will track stats and information at at per channel
|
||||
* level. Disabling channelz naturally disables channel tracing. The default
|
||||
* is for channelz to be enabled. */
|
||||
#define GRPC_ARG_ENABLE_CHANNELZ "grpc.enable_channelz"
|
||||
/** 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_call_timeout_ms"
|
||||
/* Timeout in milliseconds to wait for the serverlist from the grpclb load
|
||||
balancer before using fallback backend addresses from the resolver.
|
||||
If 0, enter fallback mode immediately. Default value is 10000. */
|
||||
#define GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS "grpc.grpclb_fallback_timeout_ms"
|
||||
/* Timeout in milliseconds to wait for the serverlist from the xDS load
|
||||
balancer before using fallback backend addresses from the resolver.
|
||||
If 0, enter fallback mode immediately. Default value is 10000. */
|
||||
#define GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS "grpc.xds_fallback_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"
|
||||
/** If set to zero, disables retry behavior. Otherwise, transparent retries
|
||||
are enabled for all RPCs, and configurable retries are enabled when they
|
||||
are configured via the service config. For details, see:
|
||||
https://github.com/grpc/proposal/blob/master/A6-client-retries.md
|
||||
*/
|
||||
#define GRPC_ARG_ENABLE_RETRIES "grpc.enable_retries"
|
||||
/** Per-RPC retry buffer size, in bytes. Default is 256 KiB. */
|
||||
#define GRPC_ARG_PER_RPC_RETRY_BUFFER_SIZE "grpc.per_rpc_retry_buffer_size"
|
||||
/** Channel arg that carries the bridged objective c object for custom metrics
|
||||
* logging filter. */
|
||||
#define GRPC_ARG_MOBILE_LOG_CONTEXT "grpc.mobile_log_context"
|
||||
/** If non-zero, client authority filter is disabled for the channel */
|
||||
#define GRPC_ARG_DISABLE_CLIENT_AUTHORITY_FILTER \
|
||||
"grpc.disable_client_authority_filter"
|
||||
/** If set to zero, disables use of http proxies. Enabled by default. */
|
||||
#define GRPC_ARG_ENABLE_HTTP_PROXY "grpc.enable_http_proxy"
|
||||
/** If set to non zero, surfaces the user agent string to the server. User
|
||||
agent is surfaced by default. */
|
||||
#define GRPC_ARG_SURFACE_USER_AGENT "grpc.surface_user_agent"
|
||||
/** If set, inhibits health checking (which may be enabled via the
|
||||
* service config.) */
|
||||
#define GRPC_ARG_INHIBIT_HEALTH_CHECKING "grpc.inhibit_health_checking"
|
||||
/** If set, the channel's resolver is allowed to query for SRV records.
|
||||
* For example, this is useful as a way to enable the "grpclb"
|
||||
* load balancing policy. Note that this only works with the "ares"
|
||||
* DNS resolver, and isn't supported by the "native" DNS resolver. */
|
||||
#define GRPC_ARG_DNS_ENABLE_SRV_QUERIES "grpc.dns_enable_srv_queries"
|
||||
/** If set, determines an upper bound on the number of milliseconds that the
|
||||
* c-ares based DNS resolver will wait on queries before cancelling them.
|
||||
* The default value is 120,000. Setting this to "0" will disable the
|
||||
* overall timeout entirely. Note that this doesn't include internal c-ares
|
||||
* timeouts/backoff/retry logic, and so the actual DNS resolution may time out
|
||||
* sooner than the value specified here. */
|
||||
#define GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS "grpc.dns_ares_query_timeout"
|
||||
/** If set, uses a local subchannel pool within the channel. Otherwise, uses the
|
||||
* global subchannel pool. */
|
||||
#define GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL "grpc.use_local_subchannel_pool"
|
||||
/** gRPC Objective-C channel pooling domain string. */
|
||||
#define GRPC_ARG_CHANNEL_POOL_DOMAIN "grpc.channel_pooling_domain"
|
||||
/** gRPC Objective-C channel pooling id. */
|
||||
#define GRPC_ARG_CHANNEL_ID "grpc.channel_id"
|
||||
/** \} */
|
||||
|
||||
/** 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)
|
||||
/** Force this message to be written to the socket before completing it */
|
||||
#define GRPC_WRITE_THROUGH (0x00000004u)
|
||||
/** Mask of all valid flags. */
|
||||
#define GRPC_WRITE_USED_MASK \
|
||||
(GRPC_WRITE_BUFFER_HINT | GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_THROUGH)
|
||||
|
||||
/** 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 | GRPC_WRITE_THROUGH)
|
||||
|
||||
/** 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. For all other grpc_completion_type
|
||||
values, tag is uninitialized. */
|
||||
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 {
|
||||
/** This op takes ownership of the slices in send_message. After
|
||||
* a call completes, the contents of send_message are not guaranteed
|
||||
* and likely empty. The original owner should still call
|
||||
* grpc_byte_buffer_destroy() on this object however.
|
||||
*/
|
||||
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.
|
||||
The returned byte buffer will be NULL if trailing metadata was
|
||||
received instead of a message.
|
||||
*/
|
||||
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;
|
||||
/** If this is not nullptr, it will be populated with the full fidelity
|
||||
* error string for debugging purposes. The application is responsible
|
||||
* for freeing the data by using gpr_free(). */
|
||||
const char** error_string;
|
||||
} 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,
|
||||
|
||||
/** EXPERIMENTAL: Events trigger a callback specified as the tag */
|
||||
GRPC_CQ_CALLBACK
|
||||
} grpc_cq_completion_type;
|
||||
|
||||
/** EXPERIMENTAL: Specifies an interface class to be used as a tag
|
||||
for callback-based completion queues. This can be used directly,
|
||||
as the first element of a struct in C, or as a base class in C++.
|
||||
Its "run" value should be assigned to some non-member function, such as
|
||||
a static method. */
|
||||
typedef struct grpc_experimental_completion_queue_functor {
|
||||
/** The run member specifies a function that will be called when this
|
||||
tag is extracted from the completion queue. Its arguments will be a
|
||||
pointer to this functor and a boolean that indicates whether the
|
||||
operation succeeded (non-zero) or failed (zero) */
|
||||
void (*functor_run)(struct grpc_experimental_completion_queue_functor*, int);
|
||||
|
||||
/** The following fields are not API. They are meant for internal use. */
|
||||
int internal_success;
|
||||
struct grpc_experimental_completion_queue_functor* internal_next;
|
||||
} grpc_experimental_completion_queue_functor;
|
||||
|
||||
/* The upgrade to version 2 is currently experimental. */
|
||||
|
||||
#define GRPC_CQ_CURRENT_VERSION 2
|
||||
#define GRPC_CQ_VERSION_MINIMUM_FOR_CALLBACKABLE 2
|
||||
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;
|
||||
|
||||
/* END OF VERSION 1 CQ ATTRIBUTES */
|
||||
|
||||
/* EXPERIMENTAL: START OF VERSION 2 CQ ATTRIBUTES */
|
||||
/** When creating a callbackable CQ, pass in a functor to get invoked when
|
||||
* shutdown is complete */
|
||||
grpc_experimental_completion_queue_functor* cq_shutdown_cb;
|
||||
|
||||
/* END OF VERSION 2 CQ ATTRIBUTES */
|
||||
} 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 */
|
112
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/log.h
generated
vendored
Normal file
112
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/log.h
generated
vendored
Normal file
@ -0,0 +1,112 @@
|
||||
/*
|
||||
*
|
||||
* 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_LOG_H
|
||||
#define GRPC_IMPL_CODEGEN_LOG_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h> /* for abort() */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** GPR log API.
|
||||
|
||||
Usage (within grpc):
|
||||
|
||||
int argument1 = 3;
|
||||
char* argument2 = "hello";
|
||||
gpr_log(GPR_DEBUG, "format string %d", argument1);
|
||||
gpr_log(GPR_INFO, "hello world");
|
||||
gpr_log(GPR_ERROR, "%d %s!!", argument1, argument2); */
|
||||
|
||||
/** The severity of a log message - use the #defines below when calling into
|
||||
gpr_log to additionally supply file and line data */
|
||||
typedef enum gpr_log_severity {
|
||||
GPR_LOG_SEVERITY_DEBUG,
|
||||
GPR_LOG_SEVERITY_INFO,
|
||||
GPR_LOG_SEVERITY_ERROR
|
||||
} gpr_log_severity;
|
||||
|
||||
#define GPR_LOG_VERBOSITY_UNSET -1
|
||||
|
||||
/** Returns a string representation of the log severity */
|
||||
GPRAPI const char* gpr_log_severity_string(gpr_log_severity severity);
|
||||
|
||||
/** Macros to build log contexts at various severity levels */
|
||||
#define GPR_DEBUG __FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG
|
||||
#define GPR_INFO __FILE__, __LINE__, GPR_LOG_SEVERITY_INFO
|
||||
#define GPR_ERROR __FILE__, __LINE__, GPR_LOG_SEVERITY_ERROR
|
||||
|
||||
/** Log a message. It's advised to use GPR_xxx above to generate the context
|
||||
* for each message */
|
||||
GPRAPI void gpr_log(const char* file, int line, gpr_log_severity severity,
|
||||
const char* format, ...) GPR_PRINT_FORMAT_CHECK(4, 5);
|
||||
|
||||
GPRAPI int gpr_should_log(gpr_log_severity severity);
|
||||
|
||||
GPRAPI void gpr_log_message(const char* file, int line,
|
||||
gpr_log_severity severity, const char* message);
|
||||
|
||||
/** Set global log verbosity */
|
||||
GPRAPI void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print);
|
||||
|
||||
GPRAPI void gpr_log_verbosity_init(void);
|
||||
|
||||
/** Log overrides: applications can use this API to intercept logging calls
|
||||
and use their own implementations */
|
||||
|
||||
struct gpr_log_func_args {
|
||||
const char* file;
|
||||
int line;
|
||||
gpr_log_severity severity;
|
||||
const char* message;
|
||||
};
|
||||
|
||||
typedef struct gpr_log_func_args gpr_log_func_args;
|
||||
|
||||
typedef void (*gpr_log_func)(gpr_log_func_args* args);
|
||||
GPRAPI void gpr_set_log_function(gpr_log_func func);
|
||||
|
||||
/** abort() the process if x is zero, having written a line to the log.
|
||||
|
||||
Intended for internal invariants. If the error can be recovered from,
|
||||
without the possibility of corruption, or might best be reflected via
|
||||
an exception in a higher-level language, consider returning error code. */
|
||||
#define GPR_ASSERT(x) \
|
||||
do { \
|
||||
if (GPR_UNLIKELY(!(x))) { \
|
||||
gpr_log(GPR_ERROR, "assertion failed: %s", #x); \
|
||||
abort(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#ifndef NDEBUG
|
||||
#define GPR_DEBUG_ASSERT(x) GPR_ASSERT(x)
|
||||
#else
|
||||
#define GPR_DEBUG_ASSERT(x)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_LOG_H */
|
661
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/port_platform.h
generated
vendored
Normal file
661
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/port_platform.h
generated
vendored
Normal file
@ -0,0 +1,661 @@
|
||||
/*
|
||||
*
|
||||
* 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_HAS_PTHREAD_H 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#ifdef _LP64
|
||||
#define GPR_ARCH_64 1
|
||||
#else /* _LP64 */
|
||||
#define GPR_ARCH_32 1
|
||||
#endif /* _LP64 */
|
||||
#include <linux/version.h>
|
||||
#elif defined(ANDROID) || defined(__ANDROID__)
|
||||
#define GPR_PLATFORM_STRING "android"
|
||||
#define GPR_ANDROID 1
|
||||
// TODO(apolcyn): re-evaluate support for c-ares
|
||||
// on android after upgrading our c-ares dependency.
|
||||
// See https://github.com/grpc/grpc/issues/18038.
|
||||
#define GRPC_ARES 0
|
||||
#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_HAS_PTHREAD_H 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_HAS_PTHREAD_H 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
|
||||
#define GPR_LINUX_PTHREAD_NAME 1
|
||||
#include <linux/version.h>
|
||||
#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
|
||||
#define GRPC_CFSTREAM 1
|
||||
/* the c-ares resolver isnt safe to enable on iOS */
|
||||
#define GRPC_ARES 0
|
||||
#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
|
||||
/* TODO(vjpai): there is a reported issue in bazel build for Mac where __thread
|
||||
in a header is currently not working (bazelbuild/bazel#4341). Remove
|
||||
the following conditional and use GPR_GCC_TLS when that is fixed */
|
||||
#ifndef GRPC_BAZEL_BUILD
|
||||
#define GPR_GCC_TLS 1
|
||||
#else /* GRPC_BAZEL_BUILD */
|
||||
#define GPR_PTHREAD_TLS 1
|
||||
#endif /* GRPC_BAZEL_BUILD */
|
||||
#define GPR_APPLE_PTHREAD_NAME 1
|
||||
#endif
|
||||
#else /* __MAC_OS_X_VERSION_MIN_REQUIRED */
|
||||
#define GPR_CPU_POSIX 1
|
||||
/* TODO(vjpai): Remove the following conditional and use only GPR_GCC_TLS
|
||||
when bazelbuild/bazel#4341 is fixed */
|
||||
#ifndef GRPC_BAZEL_BUILD
|
||||
#define GPR_GCC_TLS 1
|
||||
#else /* GRPC_BAZEL_BUILD */
|
||||
#define GPR_PTHREAD_TLS 1
|
||||
#endif /* GRPC_BAZEL_BUILD */
|
||||
#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_HAS_PTHREAD_H 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#ifndef GRPC_CFSTREAM
|
||||
#define GPR_SUPPORT_CHANNELS_FROM_FD 1
|
||||
#endif
|
||||
#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_HAS_PTHREAD_H 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(__OpenBSD__)
|
||||
#define GPR_PLATFORM_STRING "openbsd"
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE
|
||||
#endif
|
||||
#define GPR_OPENBSD 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_HAS_PTHREAD_H 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(__sun) && defined(__SVR4)
|
||||
#define GPR_PLATFORM_STRING "solaris"
|
||||
#define GPR_SOLARIS 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_HAS_PTHREAD_H 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(_AIX)
|
||||
#define GPR_PLATFORM_STRING "aix"
|
||||
#ifndef _ALL_SOURCE
|
||||
#define _ALL_SOURCE
|
||||
#endif
|
||||
#define GPR_AIX 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_HAS_PTHREAD_H 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(__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_HAS_PTHREAD_H 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(__Fuchsia__)
|
||||
#define GPR_FUCHSIA 1
|
||||
#define GPR_ARCH_64 1
|
||||
#define GPR_PLATFORM_STRING "fuchsia"
|
||||
#include <features.h>
|
||||
// Specifying musl libc affects wrap_memcpy.c. It causes memmove() to be
|
||||
// invoked.
|
||||
#define GPR_MUSL_LIBC_COMPAT 1
|
||||
#define GPR_CPU_POSIX 1
|
||||
#define GPR_GCC_ATOMIC 1
|
||||
#define GPR_PTHREAD_TLS 1
|
||||
#define GPR_POSIX_LOG 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_TMPFILE 1
|
||||
#define GPR_POSIX_SUBPROCESS 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
#define GPR_HAS_PTHREAD_H 1
|
||||
#define GPR_GETPID_IN_UNISTD_H 1
|
||||
#else
|
||||
#error "Could not auto-detect platform"
|
||||
#endif
|
||||
#endif /* GPR_NO_AUTODETECT_PLATFORM */
|
||||
|
||||
#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE)
|
||||
/*
|
||||
* For backward compatibility mode, reset _FORTIFY_SOURCE to prevent
|
||||
* a library from having non-standard symbols such as __asprintf_chk.
|
||||
* This helps non-glibc systems such as alpine using musl to find symbols.
|
||||
*/
|
||||
#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0
|
||||
#undef _FORTIFY_SOURCE
|
||||
#define _FORTIFY_SOURCE 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* There are platforms for which TLS should not be used even though the
|
||||
* compiler makes it seem like it's supported (Android NDK < r12b for example).
|
||||
* This is primarily because of linker problems and toolchain misconfiguration:
|
||||
* TLS isn't supported until NDK r12b per
|
||||
* https://developer.android.com/ndk/downloads/revision_history.html
|
||||
* TLS also does not work with Android NDK if GCC is being used as the compiler
|
||||
* instead of Clang.
|
||||
* Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in
|
||||
* <android/ndk-version.h>. For NDK < r16, users should define these macros,
|
||||
* e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. */
|
||||
#if defined(__ANDROID__) && defined(GPR_GCC_TLS)
|
||||
#if __has_include(<android/ndk-version.h>)
|
||||
#include <android/ndk-version.h>
|
||||
#endif /* __has_include(<android/ndk-version.h>) */
|
||||
#if (defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \
|
||||
((__NDK_MAJOR__ < 12) || \
|
||||
((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))) || \
|
||||
(defined(__GNUC__) && !defined(__clang__))
|
||||
#undef GPR_GCC_TLS
|
||||
#define GPR_PTHREAD_TLS 1
|
||||
#endif
|
||||
#endif /*defined(__ANDROID__) && defined(GPR_GCC_TLS) */
|
||||
|
||||
#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
|
||||
#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
|
||||
#define GRPC_ARES 1
|
||||
#endif
|
||||
|
||||
#ifndef GRPC_IF_NAMETOINDEX
|
||||
#define GRPC_IF_NAMETOINDEX 1
|
||||
#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 GRPC_UNUSED
|
||||
#if defined(__GNUC__) && !defined(__MINGW32__)
|
||||
#define GRPC_UNUSED __attribute__((unused))
|
||||
#else
|
||||
#define GRPC_UNUSED
|
||||
#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
|
||||
|
||||
#ifndef GPR_HAS_ATTRIBUTE
|
||||
#ifdef __has_attribute
|
||||
#define GPR_HAS_ATTRIBUTE(a) __has_attribute(a)
|
||||
#else
|
||||
#define GPR_HAS_ATTRIBUTE(a) 0
|
||||
#endif
|
||||
#endif /* GPR_HAS_ATTRIBUTE */
|
||||
|
||||
#ifndef GPR_HAS_FEATURE
|
||||
#ifdef __has_feature
|
||||
#define GPR_HAS_FEATURE(a) __has_feature(a)
|
||||
#else
|
||||
#define GPR_HAS_FEATURE(a) 0
|
||||
#endif
|
||||
#endif /* GPR_HAS_FEATURE */
|
||||
|
||||
#ifndef GPR_ATTRIBUTE_NOINLINE
|
||||
#if GPR_HAS_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__))
|
||||
#define GPR_ATTRIBUTE_NOINLINE __attribute__((noinline))
|
||||
#define GPR_HAS_ATTRIBUTE_NOINLINE 1
|
||||
#else
|
||||
#define GPR_ATTRIBUTE_NOINLINE
|
||||
#endif
|
||||
#endif /* GPR_ATTRIBUTE_NOINLINE */
|
||||
|
||||
#ifndef GPR_ATTRIBUTE_WEAK
|
||||
/* Attribute weak is broken on LLVM/windows:
|
||||
* https://bugs.llvm.org/show_bug.cgi?id=37598 */
|
||||
#if (GPR_HAS_ATTRIBUTE(weak) || (defined(__GNUC__) && !defined(__clang__))) && \
|
||||
!(defined(__llvm__) && defined(_WIN32))
|
||||
#define GPR_ATTRIBUTE_WEAK __attribute__((weak))
|
||||
#define GPR_HAS_ATTRIBUTE_WEAK 1
|
||||
#else
|
||||
#define GPR_ATTRIBUTE_WEAK
|
||||
#endif
|
||||
#endif /* GPR_ATTRIBUTE_WEAK */
|
||||
|
||||
#ifndef GPR_ATTRIBUTE_NO_TSAN /* (1) */
|
||||
#if GPR_HAS_FEATURE(thread_sanitizer)
|
||||
#define GPR_ATTRIBUTE_NO_TSAN __attribute__((no_sanitize("thread")))
|
||||
#endif /* GPR_HAS_FEATURE */
|
||||
#ifndef GPR_ATTRIBUTE_NO_TSAN /* (2) */
|
||||
#define GPR_ATTRIBUTE_NO_TSAN
|
||||
#endif /* GPR_ATTRIBUTE_NO_TSAN (2) */
|
||||
#endif /* GPR_ATTRIBUTE_NO_TSAN (1) */
|
||||
|
||||
/* GRPC_TSAN_ENABLED will be defined, when compiled with thread sanitizer. */
|
||||
#if defined(__SANITIZE_THREAD__)
|
||||
#define GRPC_TSAN_ENABLED
|
||||
#elif GPR_HAS_FEATURE(thread_sanitizer)
|
||||
#define GRPC_TSAN_ENABLED
|
||||
#endif
|
||||
|
||||
/* GRPC_ASAN_ENABLED will be defined, when compiled with address sanitizer. */
|
||||
#if defined(__SANITIZE_ADDRESS__)
|
||||
#define GRPC_ASAN_ENABLED
|
||||
#elif GPR_HAS_FEATURE(address_sanitizer)
|
||||
#define GRPC_ASAN_ENABLED
|
||||
#endif
|
||||
|
||||
/* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */
|
||||
#ifndef GRPC_ALLOW_EXCEPTIONS
|
||||
/* If not already set, set to 1 on Windows (style guide standard) but to
|
||||
* 0 on non-Windows platforms unless the compiler defines __EXCEPTIONS */
|
||||
#ifdef GPR_WINDOWS
|
||||
#define GRPC_ALLOW_EXCEPTIONS 1
|
||||
#else /* GPR_WINDOWS */
|
||||
#ifdef __EXCEPTIONS
|
||||
#define GRPC_ALLOW_EXCEPTIONS 1
|
||||
#else /* __EXCEPTIONS */
|
||||
#define GRPC_ALLOW_EXCEPTIONS 0
|
||||
#endif /* __EXCEPTIONS */
|
||||
#endif /* __GPR_WINDOWS */
|
||||
#endif /* GRPC_ALLOW_EXCEPTIONS */
|
||||
|
||||
/* Use GPR_LIKELY only in cases where you are sure that a certain outcome is the
|
||||
* most likely. Ideally, also collect performance numbers to justify the claim.
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
#define GPR_LIKELY(x) __builtin_expect((x), 1)
|
||||
#define GPR_UNLIKELY(x) __builtin_expect((x), 0)
|
||||
#else /* __GNUC__ */
|
||||
#define GPR_LIKELY(x) (x)
|
||||
#define GPR_UNLIKELY(x) (x)
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#ifndef __STDC_FORMAT_MACROS
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_PORT_PLATFORM_H */
|
52
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/propagation_bits.h
generated
vendored
Normal file
52
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/propagation_bits.h
generated
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
*
|
||||
* 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 */
|
127
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/slice.h
generated
vendored
Normal file
127
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/slice.h
generated
vendored
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
*
|
||||
* 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_SLICE_H
|
||||
#define GRPC_IMPL_CODEGEN_SLICE_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <grpc/impl/codegen/gpr_slice.h>
|
||||
|
||||
typedef struct grpc_slice grpc_slice;
|
||||
|
||||
/** Slice API
|
||||
|
||||
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.
|
||||
|
||||
The data-structure for slices is exposed here to allow non-gpr code to
|
||||
build slices from whatever data they have available.
|
||||
|
||||
When defining interfaces that handle slices, care should be taken to define
|
||||
reference ownership semantics (who should call unref?) and mutability
|
||||
constraints (is the callee allowed to modify the slice?) */
|
||||
|
||||
/* Inlined half of grpc_slice is allowed to expand the size of the overall type
|
||||
by this many bytes */
|
||||
#define GRPC_SLICE_INLINE_EXTRA_SIZE sizeof(void*)
|
||||
|
||||
#define GRPC_SLICE_INLINED_SIZE \
|
||||
(sizeof(size_t) + sizeof(uint8_t*) - 1 + GRPC_SLICE_INLINE_EXTRA_SIZE)
|
||||
|
||||
struct grpc_slice_refcount;
|
||||
/** A grpc_slice s, if initialized, represents the byte range
|
||||
s.bytes[0..s.length-1].
|
||||
|
||||
It can have an associated ref count which has a destruction routine to be run
|
||||
when the ref count reaches zero (see grpc_slice_new() and grp_slice_unref()).
|
||||
Multiple grpc_slice values may share a ref count.
|
||||
|
||||
If the slice does not have a refcount, it represents an inlined small piece
|
||||
of data that is copied by value. */
|
||||
struct grpc_slice {
|
||||
struct grpc_slice_refcount* refcount;
|
||||
union grpc_slice_data {
|
||||
struct grpc_slice_refcounted {
|
||||
size_t length;
|
||||
uint8_t* bytes;
|
||||
} refcounted;
|
||||
struct grpc_slice_inlined {
|
||||
uint8_t length;
|
||||
uint8_t bytes[GRPC_SLICE_INLINED_SIZE];
|
||||
} inlined;
|
||||
} data;
|
||||
};
|
||||
|
||||
#define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8
|
||||
|
||||
/** Represents an expandable array of slices, to be interpreted as a
|
||||
single item. */
|
||||
typedef struct grpc_slice_buffer {
|
||||
/** This is for internal use only. External users (i.e any code outside grpc
|
||||
* core) MUST NOT use this field */
|
||||
grpc_slice* base_slices;
|
||||
|
||||
/** slices in the array (Points to the first valid grpc_slice in the array) */
|
||||
grpc_slice* slices;
|
||||
/** the number of slices in the array */
|
||||
size_t count;
|
||||
/** the number of slices allocated in the array. External users (i.e any code
|
||||
* outside grpc core) MUST NOT use this field */
|
||||
size_t capacity;
|
||||
/** the combined length of all slices in the array */
|
||||
size_t length;
|
||||
/** inlined elements to avoid allocations */
|
||||
grpc_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS];
|
||||
} grpc_slice_buffer;
|
||||
|
||||
#define GRPC_SLICE_START_PTR(slice) \
|
||||
((slice).refcount ? (slice).data.refcounted.bytes \
|
||||
: (slice).data.inlined.bytes)
|
||||
#define GRPC_SLICE_LENGTH(slice) \
|
||||
((slice).refcount ? (slice).data.refcounted.length \
|
||||
: (slice).data.inlined.length)
|
||||
#define GRPC_SLICE_SET_LENGTH(slice, newlen) \
|
||||
((slice).refcount ? ((slice).data.refcounted.length = (size_t)(newlen)) \
|
||||
: ((slice).data.inlined.length = (uint8_t)(newlen)))
|
||||
#define GRPC_SLICE_END_PTR(slice) \
|
||||
GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(slice)
|
||||
#define GRPC_SLICE_IS_EMPTY(slice) (GRPC_SLICE_LENGTH(slice) == 0)
|
||||
|
||||
#ifdef GRPC_ALLOW_GPR_SLICE_FUNCTIONS
|
||||
|
||||
/* Duplicate GPR_* definitions */
|
||||
#define GPR_SLICE_START_PTR(slice) \
|
||||
((slice).refcount ? (slice).data.refcounted.bytes \
|
||||
: (slice).data.inlined.bytes)
|
||||
#define GPR_SLICE_LENGTH(slice) \
|
||||
((slice).refcount ? (slice).data.refcounted.length \
|
||||
: (slice).data.inlined.length)
|
||||
#define GPR_SLICE_SET_LENGTH(slice, newlen) \
|
||||
((slice).refcount ? ((slice).data.refcounted.length = (size_t)(newlen)) \
|
||||
: ((slice).data.inlined.length = (uint8_t)(newlen)))
|
||||
#define GPR_SLICE_END_PTR(slice) \
|
||||
GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(slice)
|
||||
#define GPR_SLICE_IS_EMPTY(slice) (GRPC_SLICE_LENGTH(slice) == 0)
|
||||
|
||||
#endif /* GRPC_ALLOW_GPR_SLICE_FUNCTIONS */
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_SLICE_H */
|
154
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/status.h
generated
vendored
Normal file
154
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/status.h
generated
vendored
Normal file
@ -0,0 +1,154 @@
|
||||
/*
|
||||
*
|
||||
* 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_STATUS_H
|
||||
#define GRPC_IMPL_CODEGEN_STATUS_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
/** Not an error; returned on success */
|
||||
GRPC_STATUS_OK = 0,
|
||||
|
||||
/** The operation was cancelled (typically by the caller). */
|
||||
GRPC_STATUS_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. */
|
||||
GRPC_STATUS_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). */
|
||||
GRPC_STATUS_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. */
|
||||
GRPC_STATUS_DEADLINE_EXCEEDED = 4,
|
||||
|
||||
/** Some requested entity (e.g., file or directory) was not found. */
|
||||
GRPC_STATUS_NOT_FOUND = 5,
|
||||
|
||||
/** Some entity that we attempted to create (e.g., file or directory)
|
||||
already exists. */
|
||||
GRPC_STATUS_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). */
|
||||
GRPC_STATUS_PERMISSION_DENIED = 7,
|
||||
|
||||
/** The request does not have valid authentication credentials for the
|
||||
operation. */
|
||||
GRPC_STATUS_UNAUTHENTICATED = 16,
|
||||
|
||||
/** Some resource has been exhausted, perhaps a per-user quota, or
|
||||
perhaps the entire file system is out of space. */
|
||||
GRPC_STATUS_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. */
|
||||
GRPC_STATUS_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. */
|
||||
GRPC_STATUS_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. */
|
||||
GRPC_STATUS_OUT_OF_RANGE = 11,
|
||||
|
||||
/** Operation is not implemented or not supported/enabled in this service. */
|
||||
GRPC_STATUS_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. */
|
||||
GRPC_STATUS_INTERNAL = 13,
|
||||
|
||||
/** The service is currently unavailable. This is a most likely a
|
||||
transient condition and may be corrected by retrying with
|
||||
a backoff. Note that it is not always safe to retry non-idempotent
|
||||
operations.
|
||||
|
||||
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. */
|
||||
GRPC_STATUS_UNAVAILABLE = 14,
|
||||
|
||||
/** Unrecoverable data loss or corruption. */
|
||||
GRPC_STATUS_DATA_LOSS = 15,
|
||||
|
||||
/** Force users to include a default branch: */
|
||||
GRPC_STATUS__DO_NOT_USE = -1
|
||||
} grpc_status_code;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_STATUS_H */
|
63
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync.h
generated
vendored
Normal file
63
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync.h
generated
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
*
|
||||
* 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_SYNC_H
|
||||
#define GRPC_IMPL_CODEGEN_SYNC_H
|
||||
/** Synchronization primitives for GPR.
|
||||
|
||||
The type gpr_mu provides a non-reentrant mutex (lock).
|
||||
|
||||
The type gpr_cv provides a condition variable.
|
||||
|
||||
The type gpr_once provides for one-time initialization.
|
||||
|
||||
The type gpr_event provides one-time-setting, reading, and
|
||||
waiting of a void*, with memory barriers.
|
||||
|
||||
The type gpr_refcount provides an object reference counter,
|
||||
with memory barriers suitable to control
|
||||
object lifetimes.
|
||||
|
||||
The type gpr_stats_counter provides an atomic statistics counter. It
|
||||
provides no memory barriers.
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Platform-specific type declarations of gpr_mu and gpr_cv. */
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_generic.h>
|
||||
|
||||
#if defined(GPR_POSIX_SYNC)
|
||||
#include <grpc/impl/codegen/sync_posix.h>
|
||||
#elif defined(GPR_WINDOWS)
|
||||
#include <grpc/impl/codegen/sync_windows.h>
|
||||
#elif defined(GPR_CUSTOM_SYNC)
|
||||
#include <grpc/impl/codegen/sync_custom.h>
|
||||
#else
|
||||
#error Unable to determine platform for sync
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_SYNC_H */
|
38
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_custom.h
generated
vendored
Normal file
38
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_custom.h
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H
|
||||
#define GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_generic.h>
|
||||
|
||||
/* Users defining GPR_CUSTOM_SYNC need to define the following macros. */
|
||||
|
||||
#ifdef GPR_CUSTOM_SYNC
|
||||
|
||||
typedef GPR_CUSTOM_MU_TYPE gpr_mu;
|
||||
typedef GPR_CUSTOM_CV_TYPE gpr_cv;
|
||||
typedef GPR_CUSTOM_ONCE_TYPE gpr_once;
|
||||
|
||||
#define GPR_ONCE_INIT GPR_CUSTOM_ONCE_INIT
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H */
|
48
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_generic.h
generated
vendored
Normal file
48
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_generic.h
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
*
|
||||
* 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_SYNC_GENERIC_H
|
||||
#define GRPC_IMPL_CODEGEN_SYNC_GENERIC_H
|
||||
/* Generic type defintions for gpr_sync. */
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/atm.h>
|
||||
|
||||
/* gpr_event */
|
||||
typedef struct {
|
||||
gpr_atm state;
|
||||
} gpr_event;
|
||||
|
||||
#define GPR_EVENT_INIT \
|
||||
{ 0 }
|
||||
|
||||
/* gpr_refcount */
|
||||
typedef struct {
|
||||
gpr_atm count;
|
||||
} gpr_refcount;
|
||||
|
||||
/* gpr_stats_counter */
|
||||
typedef struct {
|
||||
gpr_atm value;
|
||||
} gpr_stats_counter;
|
||||
|
||||
#define GPR_STATS_INIT \
|
||||
{ 0 }
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_SYNC_GENERIC_H */
|
52
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_posix.h
generated
vendored
Normal file
52
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_posix.h
generated
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
*
|
||||
* 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_SYNC_POSIX_H
|
||||
#define GRPC_IMPL_CODEGEN_SYNC_POSIX_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_generic.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef GRPC_ASAN_ENABLED
|
||||
/* The member |leak_checker| is used to check whether there is a memory leak
|
||||
* caused by upper layer logic that's missing the |gpr_xx_destroy| call
|
||||
* to the object before freeing it.
|
||||
* This issue was reported at https://github.com/grpc/grpc/issues/17563
|
||||
* and discussed at https://github.com/grpc/grpc/pull/17586
|
||||
*/
|
||||
typedef struct {
|
||||
pthread_mutex_t mutex;
|
||||
int* leak_checker;
|
||||
} gpr_mu;
|
||||
|
||||
typedef struct {
|
||||
pthread_cond_t cond_var;
|
||||
int* leak_checker;
|
||||
} gpr_cv;
|
||||
#else
|
||||
typedef pthread_mutex_t gpr_mu;
|
||||
typedef pthread_cond_t gpr_cv;
|
||||
#endif
|
||||
typedef pthread_once_t gpr_once;
|
||||
|
||||
#define GPR_ONCE_INIT PTHREAD_ONCE_INIT
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_SYNC_POSIX_H */
|
36
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_windows.h
generated
vendored
Normal file
36
node_modules/grpc/deps/grpc/include/grpc/impl/codegen/sync_windows.h
generated
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
*
|
||||
* 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_SYNC_WINDOWS_H
|
||||
#define GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_generic.h>
|
||||
|
||||
typedef struct {
|
||||
CRITICAL_SECTION cs; /* Not an SRWLock until Vista is unsupported */
|
||||
int locked;
|
||||
} gpr_mu;
|
||||
|
||||
typedef CONDITION_VARIABLE gpr_cv;
|
||||
|
||||
typedef INIT_ONCE gpr_once;
|
||||
#define GPR_ONCE_INIT INIT_ONCE_STATIC_INIT
|
||||
|
||||
#endif /* GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H */
|
48
node_modules/grpc/deps/grpc/include/grpc/load_reporting.h
generated
vendored
Normal file
48
node_modules/grpc/deps/grpc/include/grpc/load_reporting.h
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_LOAD_REPORTING_H
|
||||
#define GRPC_LOAD_REPORTING_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Metadata key for the gRPC LB load balancer token.
|
||||
*
|
||||
* The value corresponding to this key is an opaque token that is given to the
|
||||
* frontend as part of each pick; the frontend sends this token to the backend
|
||||
* in each request it sends when using that pick. The token is used by the
|
||||
* backend to verify the request and to allow the backend to report load to the
|
||||
* gRPC LB system. */
|
||||
#define GRPC_LB_TOKEN_MD_KEY "lb-token"
|
||||
|
||||
/** Metadata key for gRPC LB cost reporting.
|
||||
*
|
||||
* The value corresponding to this key is an opaque binary blob reported by the
|
||||
* backend as part of its trailing metadata containing cost information for the
|
||||
* call. */
|
||||
#define GRPC_LB_COST_MD_KEY "lb-cost-bin"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_LOAD_REPORTING_H */
|
172
node_modules/grpc/deps/grpc/include/grpc/slice.h
generated
vendored
Normal file
172
node_modules/grpc/deps/grpc/include/grpc/slice.h
generated
vendored
Normal file
@ -0,0 +1,172 @@
|
||||
/*
|
||||
*
|
||||
* 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_SLICE_H
|
||||
#define GRPC_SLICE_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/slice.h>
|
||||
#include <grpc/support/sync.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Increment the refcount of s. Requires slice is initialized.
|
||||
Returns s. */
|
||||
GPRAPI grpc_slice grpc_slice_ref(grpc_slice s);
|
||||
|
||||
/** Decrement the ref count of s. If the ref count of s reaches zero, all
|
||||
slices sharing the ref count are destroyed, and considered no longer
|
||||
initialized. If s is ultimately derived from a call to grpc_slice_new(start,
|
||||
len, dest) where dest!=NULL , then (*dest)(start) is called, else if s is
|
||||
ultimately derived from a call to grpc_slice_new_with_len(start, len, dest)
|
||||
where dest!=NULL , then (*dest)(start, len). Requires s initialized. */
|
||||
GPRAPI void grpc_slice_unref(grpc_slice s);
|
||||
|
||||
/** Copy slice - create a new slice that contains the same data as s */
|
||||
GPRAPI grpc_slice grpc_slice_copy(grpc_slice s);
|
||||
|
||||
/** 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 pointer
|
||||
passed in at destruction. */
|
||||
GPRAPI grpc_slice grpc_slice_new(void* p, size_t len, void (*destroy)(void*));
|
||||
|
||||
/** Equivalent to grpc_slice_new, but with a separate pointer that is
|
||||
passed to the destroy function. This function can be useful when
|
||||
the data is part of a larger structure that must be destroyed when
|
||||
the data is no longer needed. */
|
||||
GPRAPI grpc_slice grpc_slice_new_with_user_data(void* p, size_t len,
|
||||
void (*destroy)(void*),
|
||||
void* user_data);
|
||||
|
||||
/** Equivalent to grpc_slice_new, but with a two argument destroy function that
|
||||
also takes the slice length. */
|
||||
GPRAPI grpc_slice grpc_slice_new_with_len(void* p, size_t len,
|
||||
void (*destroy)(void*, size_t));
|
||||
|
||||
/** Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc()
|
||||
call.
|
||||
Aborts if malloc() fails. */
|
||||
GPRAPI grpc_slice grpc_slice_malloc(size_t length);
|
||||
GPRAPI grpc_slice grpc_slice_malloc_large(size_t length);
|
||||
|
||||
#define GRPC_SLICE_MALLOC(len) grpc_slice_malloc(len)
|
||||
|
||||
/** Intern a slice:
|
||||
|
||||
The return value for two invocations of this function with the same sequence
|
||||
of bytes is a slice which points to the same memory. */
|
||||
GPRAPI grpc_slice grpc_slice_intern(grpc_slice slice);
|
||||
|
||||
/** Create a slice by copying a string.
|
||||
Does not preserve null terminators.
|
||||
Equivalent to:
|
||||
size_t len = strlen(source);
|
||||
grpc_slice slice = grpc_slice_malloc(len);
|
||||
memcpy(slice->data, source, len); */
|
||||
GPRAPI grpc_slice grpc_slice_from_copied_string(const char* source);
|
||||
|
||||
/** Create a slice by copying a buffer.
|
||||
Equivalent to:
|
||||
grpc_slice slice = grpc_slice_malloc(len);
|
||||
memcpy(slice->data, source, len); */
|
||||
GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t len);
|
||||
|
||||
/** Create a slice pointing to constant memory */
|
||||
GPRAPI grpc_slice grpc_slice_from_static_string(const char* source);
|
||||
|
||||
/** Create a slice pointing to constant memory */
|
||||
GPRAPI grpc_slice grpc_slice_from_static_buffer(const void* source, size_t len);
|
||||
|
||||
/** Return a result slice derived from s, which shares a ref count with \a s,
|
||||
where result.data==s.data+begin, and result.length==end-begin. The ref count
|
||||
of \a s is increased by one. Do not assign result back to \a s.
|
||||
Requires s initialized, begin <= end, begin <= s.length, and
|
||||
end <= source->length. */
|
||||
GPRAPI grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end);
|
||||
|
||||
/** The same as grpc_slice_sub, but without altering the ref count */
|
||||
GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end);
|
||||
|
||||
/** Splits s into two: modifies s to be s[0:split], and returns a new slice,
|
||||
sharing a refcount with s, that contains s[split:s.length].
|
||||
Requires s initialized, split <= s.length */
|
||||
GPRAPI grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split);
|
||||
|
||||
typedef enum {
|
||||
GRPC_SLICE_REF_TAIL = 1,
|
||||
GRPC_SLICE_REF_HEAD = 2,
|
||||
GRPC_SLICE_REF_BOTH = 1 + 2
|
||||
} grpc_slice_ref_whom;
|
||||
|
||||
/** The same as grpc_slice_split_tail, but with an option to skip altering
|
||||
* refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to
|
||||
* grpc_slice_split_tail(...)) */
|
||||
GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice* s, size_t split,
|
||||
grpc_slice_ref_whom ref_whom);
|
||||
|
||||
/** Splits s into two: modifies s to be s[split:s.length], and returns a new
|
||||
slice, sharing a refcount with s, that contains s[0:split].
|
||||
Requires s initialized, split <= s.length */
|
||||
GPRAPI grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split);
|
||||
|
||||
GPRAPI grpc_slice grpc_empty_slice(void);
|
||||
|
||||
GPRAPI uint32_t grpc_slice_default_hash_impl(grpc_slice s);
|
||||
GPRAPI int grpc_slice_default_eq_impl(grpc_slice a, grpc_slice b);
|
||||
|
||||
GPRAPI int grpc_slice_eq(grpc_slice a, grpc_slice b);
|
||||
|
||||
/** Returns <0 if a < b, ==0 if a == b, >0 if a > b
|
||||
The order is arbitrary, and is not guaranteed to be stable across different
|
||||
versions of the API. */
|
||||
GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b);
|
||||
GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char* b);
|
||||
|
||||
/** return non-zero if the first blen bytes of a are equal to b */
|
||||
GPRAPI int grpc_slice_buf_start_eq(grpc_slice a, const void* b, size_t blen);
|
||||
|
||||
/** return the index of the last instance of \a c in \a s, or -1 if not found */
|
||||
GPRAPI int grpc_slice_rchr(grpc_slice s, char c);
|
||||
GPRAPI int grpc_slice_chr(grpc_slice s, char c);
|
||||
|
||||
/** return the index of the first occurrence of \a needle in \a haystack, or -1
|
||||
if it's not found */
|
||||
GPRAPI int grpc_slice_slice(grpc_slice haystack, grpc_slice needle);
|
||||
|
||||
GPRAPI uint32_t grpc_slice_hash(grpc_slice s);
|
||||
|
||||
/** Do two slices point at the same memory, with the same length
|
||||
If a or b is inlined, actually compares data */
|
||||
GPRAPI int grpc_slice_is_equivalent(grpc_slice a, grpc_slice b);
|
||||
|
||||
/** Return a slice pointing to newly allocated memory that has the same contents
|
||||
* as \a s */
|
||||
GPRAPI grpc_slice grpc_slice_dup(grpc_slice a);
|
||||
|
||||
/** Return a copy of slice as a C string. Offers no protection against embedded
|
||||
NULL's. Returned string must be freed with gpr_free. */
|
||||
GPRAPI char* grpc_slice_to_c_string(grpc_slice s);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SLICE_H */
|
84
node_modules/grpc/deps/grpc/include/grpc/slice_buffer.h
generated
vendored
Normal file
84
node_modules/grpc/deps/grpc/include/grpc/slice_buffer.h
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
*
|
||||
* 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_SLICE_BUFFER_H
|
||||
#define GRPC_SLICE_BUFFER_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/slice.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** initialize a slice buffer */
|
||||
GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer* sb);
|
||||
/** destroy a slice buffer - unrefs any held elements */
|
||||
GPRAPI void grpc_slice_buffer_destroy(grpc_slice_buffer* sb);
|
||||
/** Add an element to a slice buffer - takes ownership of the slice.
|
||||
This function is allowed to concatenate the passed in slice to the end of
|
||||
some other slice if desired by the slice buffer. */
|
||||
GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice);
|
||||
/** add an element to a slice buffer - takes ownership of the slice and returns
|
||||
the index of the slice.
|
||||
Guarantees that the slice will not be concatenated at the end of another
|
||||
slice (i.e. the data for this slice will begin at the first byte of the
|
||||
slice at the returned index in sb->slices)
|
||||
The implementation MAY decide to concatenate data at the end of a small
|
||||
slice added in this fashion. */
|
||||
GPRAPI size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer* sb,
|
||||
grpc_slice slice);
|
||||
GPRAPI void grpc_slice_buffer_addn(grpc_slice_buffer* sb, grpc_slice* slices,
|
||||
size_t n);
|
||||
/** add a very small (less than 8 bytes) amount of data to the end of a slice
|
||||
buffer: returns a pointer into which to add the data */
|
||||
GPRAPI uint8_t* grpc_slice_buffer_tiny_add(grpc_slice_buffer* sb, size_t len);
|
||||
/** pop the last buffer, but don't unref it */
|
||||
GPRAPI void grpc_slice_buffer_pop(grpc_slice_buffer* sb);
|
||||
/** clear a slice buffer, unref all elements */
|
||||
GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer* sb);
|
||||
/** swap the contents of two slice buffers */
|
||||
GPRAPI void grpc_slice_buffer_swap(grpc_slice_buffer* a, grpc_slice_buffer* b);
|
||||
/** move all of the elements of src into dst */
|
||||
GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer* src,
|
||||
grpc_slice_buffer* dst);
|
||||
/** remove n bytes from the end of a slice buffer */
|
||||
GPRAPI void grpc_slice_buffer_trim_end(grpc_slice_buffer* src, size_t n,
|
||||
grpc_slice_buffer* garbage);
|
||||
/** move the first n bytes of src into dst */
|
||||
GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer* src, size_t n,
|
||||
grpc_slice_buffer* dst);
|
||||
/** move the first n bytes of src into dst without adding references */
|
||||
GPRAPI void grpc_slice_buffer_move_first_no_ref(grpc_slice_buffer* src,
|
||||
size_t n,
|
||||
grpc_slice_buffer* dst);
|
||||
/** move the first n bytes of src into dst (copying them) */
|
||||
GPRAPI void grpc_slice_buffer_move_first_into_buffer(grpc_slice_buffer* src,
|
||||
size_t n, void* dst);
|
||||
/** take the first slice in the slice buffer */
|
||||
GPRAPI grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer* src);
|
||||
/** undo the above with (a possibly different) \a slice */
|
||||
GPRAPI void grpc_slice_buffer_undo_take_first(grpc_slice_buffer* src,
|
||||
grpc_slice slice);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SLICE_BUFFER_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/status.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/status.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_STATUS_H
|
||||
#define GRPC_STATUS_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/status.h>
|
||||
|
||||
#endif /* GRPC_STATUS_H */
|
68
node_modules/grpc/deps/grpc/include/grpc/support/alloc.h
generated
vendored
Normal file
68
node_modules/grpc/deps/grpc/include/grpc/support/alloc.h
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_ALLOC_H
|
||||
#define GRPC_SUPPORT_ALLOC_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct gpr_allocation_functions {
|
||||
void* (*malloc_fn)(size_t size);
|
||||
void* (*zalloc_fn)(size_t size); /** if NULL, uses malloc_fn then memset */
|
||||
void* (*realloc_fn)(void* ptr, size_t size);
|
||||
void (*free_fn)(void* ptr);
|
||||
} gpr_allocation_functions;
|
||||
|
||||
/** malloc.
|
||||
* If size==0, always returns NULL. Otherwise this function never returns NULL.
|
||||
* The pointer returned is suitably aligned for any kind of variable it could
|
||||
* contain.
|
||||
*/
|
||||
GPRAPI void* gpr_malloc(size_t size);
|
||||
/** like malloc, but zero all bytes before returning them */
|
||||
GPRAPI void* gpr_zalloc(size_t size);
|
||||
/** free */
|
||||
GPRAPI void gpr_free(void* ptr);
|
||||
/** realloc, never returns NULL */
|
||||
GPRAPI void* gpr_realloc(void* p, size_t size);
|
||||
/** aligned malloc, never returns NULL, will align to alignment, which
|
||||
* must be a power of 2. */
|
||||
GPRAPI void* gpr_malloc_aligned(size_t size, size_t alignment);
|
||||
/** free memory allocated by gpr_malloc_aligned */
|
||||
GPRAPI void gpr_free_aligned(void* ptr);
|
||||
|
||||
/** Request the family of allocation functions in \a functions be used. NOTE
|
||||
* that this request will be honored in a *best effort* basis and that no
|
||||
* guarantees are made about the default functions (eg, malloc) being called.
|
||||
* The functions.free_fn implementation must be a no-op for NULL input. */
|
||||
GPRAPI void gpr_set_allocation_functions(gpr_allocation_functions functions);
|
||||
|
||||
/** Return the family of allocation functions currently in effect. */
|
||||
GPRAPI gpr_allocation_functions gpr_get_allocation_functions(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_ALLOC_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/atm.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/atm.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_ATM_H
|
||||
#define GRPC_SUPPORT_ATM_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/atm.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_ATM_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/atm_gcc_atomic.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/atm_gcc_atomic.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_ATM_GCC_ATOMIC_H
|
||||
#define GRPC_SUPPORT_ATM_GCC_ATOMIC_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/atm_gcc_atomic.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_ATM_GCC_ATOMIC_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/atm_gcc_sync.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/atm_gcc_sync.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_ATM_GCC_SYNC_H
|
||||
#define GRPC_SUPPORT_ATM_GCC_SYNC_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/atm_gcc_sync.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_ATM_GCC_SYNC_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/atm_windows.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/atm_windows.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_ATM_WINDOWS_H
|
||||
#define GRPC_SUPPORT_ATM_WINDOWS_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/atm_windows.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_ATM_WINDOWS_H */
|
44
node_modules/grpc/deps/grpc/include/grpc/support/cpu.h
generated
vendored
Normal file
44
node_modules/grpc/deps/grpc/include/grpc/support/cpu.h
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_CPU_H
|
||||
#define GRPC_SUPPORT_CPU_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Interface providing CPU information for currently running system */
|
||||
|
||||
/** Return the number of CPU cores on the current system. Will return 0 if
|
||||
the information is not available. */
|
||||
GPRAPI unsigned gpr_cpu_num_cores(void);
|
||||
|
||||
/** Return the CPU on which the current thread is executing; N.B. This should
|
||||
be considered advisory only - it is possible that the thread is switched
|
||||
to a different CPU at any time. Returns a value in range
|
||||
[0, gpr_cpu_num_cores() - 1] */
|
||||
GPRAPI unsigned gpr_cpu_current_cpu(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_CPU_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/log.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/log.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_LOG_H
|
||||
#define GRPC_SUPPORT_LOG_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/log.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_LOG_H */
|
38
node_modules/grpc/deps/grpc/include/grpc/support/log_windows.h
generated
vendored
Normal file
38
node_modules/grpc/deps/grpc/include/grpc/support/log_windows.h
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_LOG_WINDOWS_H
|
||||
#define GRPC_SUPPORT_LOG_WINDOWS_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Returns a string allocated with gpr_malloc that contains a UTF-8
|
||||
* formatted error message, corresponding to the error messageid.
|
||||
* Use in conjunction with GetLastError() et al.
|
||||
*/
|
||||
GPRAPI char* gpr_format_message(int messageid);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_LOG_WINDOWS_H */
|
24
node_modules/grpc/deps/grpc/include/grpc/support/port_platform.h
generated
vendored
Normal file
24
node_modules/grpc/deps/grpc/include/grpc/support/port_platform.h
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_PORT_PLATFORM_H
|
||||
#define GRPC_SUPPORT_PORT_PLATFORM_H
|
||||
|
||||
#include <grpc/impl/codegen/port_platform.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_PORT_PLATFORM_H */
|
51
node_modules/grpc/deps/grpc/include/grpc/support/string_util.h
generated
vendored
Normal file
51
node_modules/grpc/deps/grpc/include/grpc/support/string_util.h
generated
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_STRING_UTIL_H
|
||||
#define GRPC_SUPPORT_STRING_UTIL_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/gpr_types.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** String utility functions */
|
||||
|
||||
/** Returns a copy of src that can be passed to gpr_free().
|
||||
If allocation fails or if src is NULL, returns NULL. */
|
||||
GPRAPI char* gpr_strdup(const char* src);
|
||||
|
||||
/** printf to a newly-allocated string. The set of supported formats may vary
|
||||
between platforms.
|
||||
|
||||
On success, returns the number of bytes printed (excluding the final '\0'),
|
||||
and *strp points to a string which must later be destroyed with gpr_free().
|
||||
|
||||
On error, returns -1 and sets *strp to NULL. If the format string is bad,
|
||||
the result is undefined. */
|
||||
GPRAPI int gpr_asprintf(char** strp, const char* format, ...)
|
||||
GPR_PRINT_FORMAT_CHECK(2, 3);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_STRING_UTIL_H */
|
282
node_modules/grpc/deps/grpc/include/grpc/support/sync.h
generated
vendored
Normal file
282
node_modules/grpc/deps/grpc/include/grpc/support/sync.h
generated
vendored
Normal file
@ -0,0 +1,282 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_SYNC_H
|
||||
#define GRPC_SUPPORT_SYNC_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/gpr_types.h> /* for gpr_timespec */
|
||||
#include <grpc/impl/codegen/sync.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** --- Mutex interface ---
|
||||
|
||||
At most one thread may hold an exclusive lock on a mutex at any given time.
|
||||
Actions taken by a thread that holds a mutex exclusively happen after
|
||||
actions taken by all previous holders of the mutex. Variables of type
|
||||
gpr_mu are uninitialized when first declared. */
|
||||
|
||||
/** Initialize *mu. Requires: *mu uninitialized. */
|
||||
GPRAPI void gpr_mu_init(gpr_mu* mu);
|
||||
|
||||
/** Cause *mu no longer to be initialized, freeing any memory in use. Requires:
|
||||
*mu initialized; no other concurrent operation on *mu. */
|
||||
GPRAPI void gpr_mu_destroy(gpr_mu* mu);
|
||||
|
||||
/** Wait until no thread has a lock on *mu, cause the calling thread to own an
|
||||
exclusive lock on *mu, then return. May block indefinitely or crash if the
|
||||
calling thread has a lock on *mu. Requires: *mu initialized. */
|
||||
GPRAPI void gpr_mu_lock(gpr_mu* mu);
|
||||
|
||||
/** Release an exclusive lock on *mu held by the calling thread. Requires: *mu
|
||||
initialized; the calling thread holds an exclusive lock on *mu. */
|
||||
GPRAPI void gpr_mu_unlock(gpr_mu* mu);
|
||||
|
||||
/** Without blocking, attempt to acquire an exclusive lock on *mu for the
|
||||
calling thread, then return non-zero iff success. Fail, if any thread holds
|
||||
the lock; succeeds with high probability if no thread holds the lock.
|
||||
Requires: *mu initialized. */
|
||||
GPRAPI int gpr_mu_trylock(gpr_mu* mu);
|
||||
|
||||
/** --- Condition variable interface ---
|
||||
|
||||
A while-loop should be used with gpr_cv_wait() when waiting for conditions
|
||||
to become true. See the example below. Variables of type gpr_cv are
|
||||
uninitialized when first declared. */
|
||||
|
||||
/** Initialize *cv. Requires: *cv uninitialized. */
|
||||
GPRAPI void gpr_cv_init(gpr_cv* cv);
|
||||
|
||||
/** Cause *cv no longer to be initialized, freeing any memory in use. Requires:
|
||||
*cv initialized; no other concurrent operation on *cv.*/
|
||||
GPRAPI void gpr_cv_destroy(gpr_cv* cv);
|
||||
|
||||
/** Atomically release *mu and wait on *cv. When the calling thread is woken
|
||||
from *cv or the deadline abs_deadline is exceeded, execute gpr_mu_lock(mu)
|
||||
and return whether the deadline was exceeded. Use
|
||||
abs_deadline==gpr_inf_future for no deadline. abs_deadline can be either
|
||||
an absolute deadline, or a GPR_TIMESPAN. May return even when not
|
||||
woken explicitly. Requires: *mu and *cv initialized; the calling thread
|
||||
holds an exclusive lock on *mu. */
|
||||
GPRAPI int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline);
|
||||
|
||||
/** If any threads are waiting on *cv, wake at least one.
|
||||
Clients may treat this as an optimization of gpr_cv_broadcast()
|
||||
for use in the case where waking more than one waiter is not useful.
|
||||
Requires: *cv initialized. */
|
||||
GPRAPI void gpr_cv_signal(gpr_cv* cv);
|
||||
|
||||
/** Wake all threads waiting on *cv. Requires: *cv initialized. */
|
||||
GPRAPI void gpr_cv_broadcast(gpr_cv* cv);
|
||||
|
||||
/** --- One-time initialization ---
|
||||
|
||||
gpr_once must be declared with static storage class, and initialized with
|
||||
GPR_ONCE_INIT. e.g.,
|
||||
static gpr_once once_var = GPR_ONCE_INIT; */
|
||||
|
||||
/** Ensure that (*init_routine)() has been called exactly once (for the
|
||||
specified gpr_once instance) and then return.
|
||||
If multiple threads call gpr_once() on the same gpr_once instance, one of
|
||||
them will call (*init_routine)(), and the others will block until that call
|
||||
finishes.*/
|
||||
GPRAPI void gpr_once_init(gpr_once* once, void (*init_routine)(void));
|
||||
|
||||
/** --- One-time event notification ---
|
||||
|
||||
These operations act on a gpr_event, which should be initialized with
|
||||
gpr_ev_init(), or with GPR_EVENT_INIT if static, e.g.,
|
||||
static gpr_event event_var = GPR_EVENT_INIT;
|
||||
It requires no destruction. */
|
||||
|
||||
/** Initialize *ev. */
|
||||
GPRAPI void gpr_event_init(gpr_event* ev);
|
||||
|
||||
/** Set *ev so that gpr_event_get() and gpr_event_wait() will return value.
|
||||
Requires: *ev initialized; value != NULL; no prior or concurrent calls to
|
||||
gpr_event_set(ev, ...) since initialization. */
|
||||
GPRAPI void gpr_event_set(gpr_event* ev, void* value);
|
||||
|
||||
/** Return the value set by gpr_event_set(ev, ...), or NULL if no such call has
|
||||
completed. If the result is non-NULL, all operations that occurred prior to
|
||||
the gpr_event_set(ev, ...) set will be visible after this call returns.
|
||||
Requires: *ev initialized. This operation is faster than acquiring a mutex
|
||||
on most platforms. */
|
||||
GPRAPI void* gpr_event_get(gpr_event* ev);
|
||||
|
||||
/** Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is
|
||||
exceeded, then return gpr_event_get(ev). Requires: *ev initialized. Use
|
||||
abs_deadline==gpr_inf_future for no deadline. When the event has been
|
||||
signalled before the call, this operation is faster than acquiring a mutex
|
||||
on most platforms. */
|
||||
GPRAPI void* gpr_event_wait(gpr_event* ev, gpr_timespec abs_deadline);
|
||||
|
||||
/** --- Reference counting ---
|
||||
|
||||
These calls act on the type gpr_refcount. It requires no destruction. */
|
||||
|
||||
/** Initialize *r to value n. */
|
||||
GPRAPI void gpr_ref_init(gpr_refcount* r, int n);
|
||||
|
||||
/** Increment the reference count *r. Requires *r initialized. */
|
||||
GPRAPI void gpr_ref(gpr_refcount* r);
|
||||
|
||||
/** Increment the reference count *r. Requires *r initialized.
|
||||
Crashes if refcount is zero */
|
||||
GPRAPI void gpr_ref_non_zero(gpr_refcount* r);
|
||||
|
||||
/** Increment the reference count *r by n. Requires *r initialized, n > 0. */
|
||||
GPRAPI void gpr_refn(gpr_refcount* r, int n);
|
||||
|
||||
/** Decrement the reference count *r and return non-zero iff it has reached
|
||||
zero. . Requires *r initialized. */
|
||||
GPRAPI int gpr_unref(gpr_refcount* r);
|
||||
|
||||
/** Return non-zero iff the reference count of *r is one, and thus is owned
|
||||
by exactly one object. */
|
||||
GPRAPI int gpr_ref_is_unique(gpr_refcount* r);
|
||||
|
||||
/** --- Stats counters ---
|
||||
|
||||
These calls act on the integral type gpr_stats_counter. It requires no
|
||||
destruction. Static instances may be initialized with
|
||||
gpr_stats_counter c = GPR_STATS_INIT;
|
||||
Beware: These operations do not imply memory barriers. Do not use them to
|
||||
synchronize other events. */
|
||||
|
||||
/** Initialize *c to the value n. */
|
||||
GPRAPI void gpr_stats_init(gpr_stats_counter* c, intptr_t n);
|
||||
|
||||
/** *c += inc. Requires: *c initialized. */
|
||||
GPRAPI void gpr_stats_inc(gpr_stats_counter* c, intptr_t inc);
|
||||
|
||||
/** Return *c. Requires: *c initialized. */
|
||||
GPRAPI intptr_t gpr_stats_read(const gpr_stats_counter* c);
|
||||
|
||||
/** ==================Example use of interface===================
|
||||
A producer-consumer queue of up to N integers,
|
||||
illustrating the use of the calls in this interface. */
|
||||
#if 0
|
||||
|
||||
#define N 4
|
||||
|
||||
typedef struct queue {
|
||||
gpr_cv non_empty; /* Signalled when length becomes non-zero. */
|
||||
gpr_cv non_full; /* Signalled when length becomes non-N. */
|
||||
gpr_mu mu; /* Protects all fields below.
|
||||
(That is, except during initialization or
|
||||
destruction, the fields below should be accessed
|
||||
only by a thread that holds mu.) */
|
||||
int head; /* Index of head of queue 0..N-1. */
|
||||
int length; /* Number of valid elements in queue 0..N. */
|
||||
int elem[N]; /* elem[head .. head+length-1] are queue elements. */
|
||||
} queue;
|
||||
|
||||
/* Initialize *q. */
|
||||
void queue_init(queue *q) {
|
||||
gpr_mu_init(&q->mu);
|
||||
gpr_cv_init(&q->non_empty);
|
||||
gpr_cv_init(&q->non_full);
|
||||
q->head = 0;
|
||||
q->length = 0;
|
||||
}
|
||||
|
||||
/* Free storage associated with *q. */
|
||||
void queue_destroy(queue *q) {
|
||||
gpr_mu_destroy(&q->mu);
|
||||
gpr_cv_destroy(&q->non_empty);
|
||||
gpr_cv_destroy(&q->non_full);
|
||||
}
|
||||
|
||||
/* Wait until there is room in *q, then append x to *q. */
|
||||
void queue_append(queue *q, int x) {
|
||||
gpr_mu_lock(&q->mu);
|
||||
/* To wait for a predicate without a deadline, loop on the negation of the
|
||||
predicate, and use gpr_cv_wait(..., gpr_inf_future) inside the loop
|
||||
to release the lock, wait, and reacquire on each iteration. Code that
|
||||
makes the condition true should use gpr_cv_broadcast() on the
|
||||
corresponding condition variable. The predicate must be on state
|
||||
protected by the lock. */
|
||||
while (q->length == N) {
|
||||
gpr_cv_wait(&q->non_full, &q->mu, gpr_inf_future);
|
||||
}
|
||||
if (q->length == 0) { /* Wake threads blocked in queue_remove(). */
|
||||
/* It's normal to use gpr_cv_broadcast() or gpr_signal() while
|
||||
holding the lock. */
|
||||
gpr_cv_broadcast(&q->non_empty);
|
||||
}
|
||||
q->elem[(q->head + q->length) % N] = x;
|
||||
q->length++;
|
||||
gpr_mu_unlock(&q->mu);
|
||||
}
|
||||
|
||||
/* If it can be done without blocking, append x to *q and return non-zero.
|
||||
Otherwise return 0. */
|
||||
int queue_try_append(queue *q, int x) {
|
||||
int result = 0;
|
||||
if (gpr_mu_trylock(&q->mu)) {
|
||||
if (q->length != N) {
|
||||
if (q->length == 0) { /* Wake threads blocked in queue_remove(). */
|
||||
gpr_cv_broadcast(&q->non_empty);
|
||||
}
|
||||
q->elem[(q->head + q->length) % N] = x;
|
||||
q->length++;
|
||||
result = 1;
|
||||
}
|
||||
gpr_mu_unlock(&q->mu);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Wait until the *q is non-empty or deadline abs_deadline passes. If the
|
||||
queue is non-empty, remove its head entry, place it in *head, and return
|
||||
non-zero. Otherwise return 0. */
|
||||
int queue_remove(queue *q, int *head, gpr_timespec abs_deadline) {
|
||||
int result = 0;
|
||||
gpr_mu_lock(&q->mu);
|
||||
/* To wait for a predicate with a deadline, loop on the negation of the
|
||||
predicate or until gpr_cv_wait() returns true. Code that makes
|
||||
the condition true should use gpr_cv_broadcast() on the corresponding
|
||||
condition variable. The predicate must be on state protected by the
|
||||
lock. */
|
||||
while (q->length == 0 &&
|
||||
!gpr_cv_wait(&q->non_empty, &q->mu, abs_deadline)) {
|
||||
}
|
||||
if (q->length != 0) { /* Queue is non-empty. */
|
||||
result = 1;
|
||||
if (q->length == N) { /* Wake threads blocked in queue_append(). */
|
||||
gpr_cv_broadcast(&q->non_full);
|
||||
}
|
||||
*head = q->elem[q->head];
|
||||
q->head = (q->head + 1) % N;
|
||||
q->length--;
|
||||
} /* else deadline exceeded */
|
||||
gpr_mu_unlock(&q->mu);
|
||||
return result;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_SYNC_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_custom.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_custom.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_SUPPORT_SYNC_CUSTOM_H
|
||||
#define GRPC_SUPPORT_SYNC_CUSTOM_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_custom.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_SYNC_CUSTOM_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_generic.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_generic.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_SYNC_GENERIC_H
|
||||
#define GRPC_SUPPORT_SYNC_GENERIC_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_generic.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_SYNC_GENERIC_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_posix.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_posix.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_SYNC_POSIX_H
|
||||
#define GRPC_SUPPORT_SYNC_POSIX_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_posix.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_SYNC_POSIX_H */
|
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_windows.h
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/include/grpc/support/sync_windows.h
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_SYNC_WINDOWS_H
|
||||
#define GRPC_SUPPORT_SYNC_WINDOWS_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/sync_windows.h>
|
||||
|
||||
#endif /* GRPC_SUPPORT_SYNC_WINDOWS_H */
|
44
node_modules/grpc/deps/grpc/include/grpc/support/thd_id.h
generated
vendored
Normal file
44
node_modules/grpc/deps/grpc/include/grpc/support/thd_id.h
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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_SUPPORT_THD_ID_H
|
||||
#define GRPC_SUPPORT_THD_ID_H
|
||||
/** Thread ID interface for GPR.
|
||||
|
||||
Used by some wrapped languages for logging purposes.
|
||||
|
||||
Types
|
||||
gpr_thd_id a unique opaque identifier for a thread.
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef uintptr_t gpr_thd_id;
|
||||
|
||||
/** Returns the identifier of the current thread. */
|
||||
GPRAPI gpr_thd_id gpr_thd_currentid(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_THD_ID_H */
|
92
node_modules/grpc/deps/grpc/include/grpc/support/time.h
generated
vendored
Normal file
92
node_modules/grpc/deps/grpc/include/grpc/support/time.h
generated
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_TIME_H
|
||||
#define GRPC_SUPPORT_TIME_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/gpr_types.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** Time constants. */
|
||||
GPRAPI gpr_timespec
|
||||
gpr_time_0(gpr_clock_type type); /** The zero time interval. */
|
||||
GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type); /** The far future */
|
||||
GPRAPI gpr_timespec gpr_inf_past(gpr_clock_type type); /** The far past. */
|
||||
|
||||
#define GPR_MS_PER_SEC 1000
|
||||
#define GPR_US_PER_SEC 1000000
|
||||
#define GPR_NS_PER_SEC 1000000000
|
||||
#define GPR_NS_PER_MS 1000000
|
||||
#define GPR_NS_PER_US 1000
|
||||
#define GPR_US_PER_MS 1000
|
||||
|
||||
/** initialize time subsystem */
|
||||
GPRAPI void gpr_time_init(void);
|
||||
|
||||
/** Return the current time measured from the given clocks epoch. */
|
||||
GPRAPI gpr_timespec gpr_now(gpr_clock_type clock);
|
||||
|
||||
/** Convert a timespec from one clock to another */
|
||||
GPRAPI gpr_timespec gpr_convert_clock_type(gpr_timespec t,
|
||||
gpr_clock_type target_clock);
|
||||
|
||||
/** Return -ve, 0, or +ve according to whether a < b, a == b, or a > b
|
||||
respectively. */
|
||||
GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b);
|
||||
|
||||
GPRAPI gpr_timespec gpr_time_max(gpr_timespec a, gpr_timespec b);
|
||||
GPRAPI gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b);
|
||||
|
||||
/** Add and subtract times. Calculations saturate at infinities. */
|
||||
GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b);
|
||||
GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b);
|
||||
|
||||
/** Return a timespec representing a given number of time units. INT64_MIN is
|
||||
interpreted as gpr_inf_past, and INT64_MAX as gpr_inf_future. */
|
||||
GPRAPI gpr_timespec gpr_time_from_micros(int64_t x, gpr_clock_type clock_type);
|
||||
GPRAPI gpr_timespec gpr_time_from_nanos(int64_t x, gpr_clock_type clock_type);
|
||||
GPRAPI gpr_timespec gpr_time_from_millis(int64_t x, gpr_clock_type clock_type);
|
||||
GPRAPI gpr_timespec gpr_time_from_seconds(int64_t x, gpr_clock_type clock_type);
|
||||
GPRAPI gpr_timespec gpr_time_from_minutes(int64_t x, gpr_clock_type clock_type);
|
||||
GPRAPI gpr_timespec gpr_time_from_hours(int64_t x, gpr_clock_type clock_type);
|
||||
|
||||
GPRAPI int32_t gpr_time_to_millis(gpr_timespec timespec);
|
||||
|
||||
/** Return 1 if two times are equal or within threshold of each other,
|
||||
0 otherwise */
|
||||
GPRAPI int gpr_time_similar(gpr_timespec a, gpr_timespec b,
|
||||
gpr_timespec threshold);
|
||||
|
||||
/** Sleep until at least 'until' - an absolute timeout */
|
||||
GPRAPI void gpr_sleep_until(gpr_timespec until);
|
||||
|
||||
GPRAPI double gpr_timespec_to_micros(gpr_timespec t);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GRPC_SUPPORT_TIME_H */
|
31
node_modules/grpc/deps/grpc/include/grpc/support/workaround_list.h
generated
vendored
Normal file
31
node_modules/grpc/deps/grpc/include/grpc/support/workaround_list.h
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
*
|
||||
* 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_SUPPORT_WORKAROUND_LIST_H
|
||||
#define GRPC_SUPPORT_WORKAROUND_LIST_H
|
||||
|
||||
/* The list of IDs of server workarounds currently maintained by gRPC. For
|
||||
* explanation and detailed descriptions of workarounds, see
|
||||
* /doc/workarounds.md
|
||||
*/
|
||||
typedef enum {
|
||||
GRPC_WORKAROUND_ID_CRONET_COMPRESSION = 0,
|
||||
GRPC_MAX_WORKAROUND_ID
|
||||
} grpc_workaround_list;
|
||||
|
||||
#endif /* GRPC_SUPPORT_WORKAROUND_LIST_H */
|
1362
node_modules/grpc/deps/grpc/src/boringssl/err_data.c
generated
vendored
Normal file
1362
node_modules/grpc/deps/grpc/src/boringssl/err_data.c
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4
node_modules/grpc/deps/grpc/src/core/README.md
generated
vendored
Normal file
4
node_modules/grpc/deps/grpc/src/core/README.md
generated
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# Overview
|
||||
|
||||
This directory contains source code for C library (a.k.a the *gRPC C core*) that provides all gRPC's core functionality through a low level API. Libraries in other languages in this repository (C++, C#, Ruby,
|
||||
Python, PHP, NodeJS, Objective-C) are layered on top of this library.
|
5
node_modules/grpc/deps/grpc/src/core/ext/README.md
generated
vendored
Normal file
5
node_modules/grpc/deps/grpc/src/core/ext/README.md
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
Optional plugins for gRPC Core: Modules in this directory extend gRPC Core in
|
||||
useful ways. All optional code belongs here.
|
||||
|
||||
NOTE: The movement of code between lib and ext is an ongoing effort, so this
|
||||
directory currently contains too much of the core library.
|
38
node_modules/grpc/deps/grpc/src/core/ext/filters/census/grpc_context.cc
generated
vendored
Normal file
38
node_modules/grpc/deps/grpc/src/core/ext/filters/census/grpc_context.cc
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/census.h>
|
||||
#include <grpc/grpc.h>
|
||||
#include "src/core/lib/surface/api_trace.h"
|
||||
#include "src/core/lib/surface/call.h"
|
||||
|
||||
void grpc_census_call_set_context(grpc_call* call, census_context* context) {
|
||||
GRPC_API_TRACE("grpc_census_call_set_context(call=%p, census_context=%p)", 2,
|
||||
(call, context));
|
||||
if (context != nullptr) {
|
||||
grpc_call_context_set(call, GRPC_CONTEXT_TRACING, context, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
census_context* grpc_census_call_get_context(grpc_call* call) {
|
||||
GRPC_API_TRACE("grpc_census_call_get_context(call=%p)", 1, (call));
|
||||
return static_cast<census_context*>(
|
||||
grpc_call_context_get(call, GRPC_CONTEXT_TRACING));
|
||||
}
|
49
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/README.md
generated
vendored
Normal file
49
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/README.md
generated
vendored
Normal file
@ -0,0 +1,49 @@
|
||||
Client Configuration Support for GRPC
|
||||
=====================================
|
||||
|
||||
This library provides high level configuration machinery to construct client
|
||||
channels and load balance between them.
|
||||
|
||||
Each `grpc_channel` is created with a `Resolver`. It is the resolver's duty
|
||||
to resolve a name into a set of arguments for the channel. Such arguments
|
||||
might include:
|
||||
|
||||
- a list of (ip, port) addresses to connect to
|
||||
- a load balancing policy to decide which server to send a request to
|
||||
- a set of filters to mutate outgoing requests (say, by adding metadata)
|
||||
|
||||
The resolver provides this data as a stream of `grpc_channel_args` objects to
|
||||
the channel. We represent arguments as a stream so that they can be changed
|
||||
by the resolver during execution, by reacting to external events (such as
|
||||
new service configuration data being pushed to some store).
|
||||
|
||||
|
||||
Load Balancing
|
||||
--------------
|
||||
|
||||
Load balancing configuration is provided by a `LoadBalancingPolicy` object.
|
||||
|
||||
The primary job of the load balancing policies is to pick a target server
|
||||
given only the initial metadata for a request. It does this by providing
|
||||
a `ConnectedSubchannel` object to the owning channel.
|
||||
|
||||
|
||||
Sub-Channels
|
||||
------------
|
||||
|
||||
A sub-channel provides a connection to a server for a client channel. It has a
|
||||
connectivity state like a regular channel, and so can be connected or
|
||||
disconnected. This connectivity state can be used to inform load balancing
|
||||
decisions (for example, by avoiding disconnected backends).
|
||||
|
||||
Configured sub-channels are fully setup to participate in the grpc data plane.
|
||||
Their behavior is specified by a set of grpc channel filters defined at their
|
||||
construction. To customize this behavior, transports build
|
||||
`ClientChannelFactory` objects, which customize construction arguments for
|
||||
concrete subchannel instances.
|
||||
|
||||
|
||||
Naming for GRPC
|
||||
===============
|
||||
|
||||
See [/doc/naming.md](gRPC name resolution).
|
181
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/backup_poller.cc
generated
vendored
Normal file
181
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/backup_poller.cc
generated
vendored
Normal file
@ -0,0 +1,181 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/backup_poller.h"
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/sync.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel.h"
|
||||
#include "src/core/lib/gpr/string.h"
|
||||
#include "src/core/lib/gprpp/global_config.h"
|
||||
#include "src/core/lib/iomgr/error.h"
|
||||
#include "src/core/lib/iomgr/iomgr.h"
|
||||
#include "src/core/lib/iomgr/pollset.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
#include "src/core/lib/surface/channel.h"
|
||||
#include "src/core/lib/surface/completion_queue.h"
|
||||
|
||||
#define DEFAULT_POLL_INTERVAL_MS 5000
|
||||
|
||||
namespace {
|
||||
struct backup_poller {
|
||||
grpc_timer polling_timer;
|
||||
grpc_closure run_poller_closure;
|
||||
grpc_closure shutdown_closure;
|
||||
gpr_mu* pollset_mu;
|
||||
grpc_pollset* pollset; // guarded by pollset_mu
|
||||
bool shutting_down; // guarded by pollset_mu
|
||||
gpr_refcount refs;
|
||||
gpr_refcount shutdown_refs;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
static gpr_once g_once = GPR_ONCE_INIT;
|
||||
static gpr_mu g_poller_mu;
|
||||
static backup_poller* g_poller = nullptr; // guarded by g_poller_mu
|
||||
// g_poll_interval_ms is set only once at the first time
|
||||
// grpc_client_channel_start_backup_polling() is called, after that it is
|
||||
// treated as const.
|
||||
static int g_poll_interval_ms = DEFAULT_POLL_INTERVAL_MS;
|
||||
|
||||
GPR_GLOBAL_CONFIG_DEFINE_INT32(
|
||||
grpc_client_channel_backup_poll_interval_ms, DEFAULT_POLL_INTERVAL_MS,
|
||||
"Declares the interval in ms between two backup polls on client channels. "
|
||||
"These polls are run in the timer thread so that gRPC can process "
|
||||
"connection failures while there is no active polling thread. "
|
||||
"They help reconnect disconnected client channels (mostly due to "
|
||||
"idleness), so that the next RPC on this channel won't fail. Set to 0 to "
|
||||
"turn off the backup polls.");
|
||||
|
||||
void grpc_client_channel_global_init_backup_polling() {
|
||||
gpr_once_init(&g_once, [] { gpr_mu_init(&g_poller_mu); });
|
||||
int32_t poll_interval_ms =
|
||||
GPR_GLOBAL_CONFIG_GET(grpc_client_channel_backup_poll_interval_ms);
|
||||
if (poll_interval_ms < 0) {
|
||||
gpr_log(GPR_ERROR,
|
||||
"Invalid GRPC_CLIENT_CHANNEL_BACKUP_POLL_INTERVAL_MS: %d, "
|
||||
"default value %d will be used.",
|
||||
poll_interval_ms, g_poll_interval_ms);
|
||||
} else {
|
||||
g_poll_interval_ms = poll_interval_ms;
|
||||
}
|
||||
}
|
||||
|
||||
static void backup_poller_shutdown_unref(backup_poller* p) {
|
||||
if (gpr_unref(&p->shutdown_refs)) {
|
||||
grpc_pollset_destroy(p->pollset);
|
||||
gpr_free(p->pollset);
|
||||
gpr_free(p);
|
||||
}
|
||||
}
|
||||
|
||||
static void done_poller(void* arg, grpc_error* error) {
|
||||
backup_poller_shutdown_unref(static_cast<backup_poller*>(arg));
|
||||
}
|
||||
|
||||
static void g_poller_unref() {
|
||||
gpr_mu_lock(&g_poller_mu);
|
||||
if (gpr_unref(&g_poller->refs)) {
|
||||
backup_poller* p = g_poller;
|
||||
g_poller = nullptr;
|
||||
gpr_mu_unlock(&g_poller_mu);
|
||||
gpr_mu_lock(p->pollset_mu);
|
||||
p->shutting_down = true;
|
||||
grpc_pollset_shutdown(
|
||||
p->pollset, GRPC_CLOSURE_INIT(&p->shutdown_closure, done_poller, p,
|
||||
grpc_schedule_on_exec_ctx));
|
||||
gpr_mu_unlock(p->pollset_mu);
|
||||
grpc_timer_cancel(&p->polling_timer);
|
||||
} else {
|
||||
gpr_mu_unlock(&g_poller_mu);
|
||||
}
|
||||
}
|
||||
|
||||
static void run_poller(void* arg, grpc_error* error) {
|
||||
backup_poller* p = static_cast<backup_poller*>(arg);
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
if (error != GRPC_ERROR_CANCELLED) {
|
||||
GRPC_LOG_IF_ERROR("run_poller", GRPC_ERROR_REF(error));
|
||||
}
|
||||
backup_poller_shutdown_unref(p);
|
||||
return;
|
||||
}
|
||||
gpr_mu_lock(p->pollset_mu);
|
||||
if (p->shutting_down) {
|
||||
gpr_mu_unlock(p->pollset_mu);
|
||||
backup_poller_shutdown_unref(p);
|
||||
return;
|
||||
}
|
||||
grpc_error* err =
|
||||
grpc_pollset_work(p->pollset, nullptr, grpc_core::ExecCtx::Get()->Now());
|
||||
gpr_mu_unlock(p->pollset_mu);
|
||||
GRPC_LOG_IF_ERROR("Run client channel backup poller", err);
|
||||
grpc_timer_init(&p->polling_timer,
|
||||
grpc_core::ExecCtx::Get()->Now() + g_poll_interval_ms,
|
||||
&p->run_poller_closure);
|
||||
}
|
||||
|
||||
static void g_poller_init_locked() {
|
||||
if (g_poller == nullptr) {
|
||||
g_poller = static_cast<backup_poller*>(gpr_zalloc(sizeof(backup_poller)));
|
||||
g_poller->pollset =
|
||||
static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
|
||||
g_poller->shutting_down = false;
|
||||
grpc_pollset_init(g_poller->pollset, &g_poller->pollset_mu);
|
||||
gpr_ref_init(&g_poller->refs, 0);
|
||||
// one for timer cancellation, one for pollset shutdown
|
||||
gpr_ref_init(&g_poller->shutdown_refs, 2);
|
||||
GRPC_CLOSURE_INIT(&g_poller->run_poller_closure, run_poller, g_poller,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
grpc_timer_init(&g_poller->polling_timer,
|
||||
grpc_core::ExecCtx::Get()->Now() + g_poll_interval_ms,
|
||||
&g_poller->run_poller_closure);
|
||||
}
|
||||
}
|
||||
|
||||
void grpc_client_channel_start_backup_polling(
|
||||
grpc_pollset_set* interested_parties) {
|
||||
if (g_poll_interval_ms == 0 || grpc_iomgr_run_in_background()) {
|
||||
return;
|
||||
}
|
||||
gpr_mu_lock(&g_poller_mu);
|
||||
g_poller_init_locked();
|
||||
gpr_ref(&g_poller->refs);
|
||||
/* Get a reference to g_poller->pollset before releasing g_poller_mu to make
|
||||
* TSAN happy. Otherwise, reading from g_poller (i.e g_poller->pollset) after
|
||||
* releasing the lock and setting g_poller to NULL in g_poller_unref() is
|
||||
* being flagged as a data-race by TSAN */
|
||||
grpc_pollset* pollset = g_poller->pollset;
|
||||
gpr_mu_unlock(&g_poller_mu);
|
||||
|
||||
grpc_pollset_set_add_pollset(interested_parties, pollset);
|
||||
}
|
||||
|
||||
void grpc_client_channel_stop_backup_polling(
|
||||
grpc_pollset_set* interested_parties) {
|
||||
if (g_poll_interval_ms == 0 || grpc_iomgr_run_in_background()) {
|
||||
return;
|
||||
}
|
||||
grpc_pollset_set_del_pollset(interested_parties, g_poller->pollset);
|
||||
g_poller_unref();
|
||||
}
|
41
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/backup_poller.h
generated
vendored
Normal file
41
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/backup_poller.h
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_BACKUP_POLLER_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_BACKUP_POLLER_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/lib/gprpp/global_config.h"
|
||||
|
||||
GPR_GLOBAL_CONFIG_DECLARE_INT32(grpc_client_channel_backup_poll_interval_ms);
|
||||
|
||||
/* Initializes backup polling. */
|
||||
void grpc_client_channel_global_init_backup_polling();
|
||||
|
||||
/* Starts polling \a interested_parties periodically in the timer thread. */
|
||||
void grpc_client_channel_start_backup_polling(
|
||||
grpc_pollset_set* interested_parties);
|
||||
|
||||
/* Stops polling \a interested_parties. */
|
||||
void grpc_client_channel_stop_backup_polling(
|
||||
grpc_pollset_set* interested_parties);
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_BACKUP_POLLER_H */
|
250
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/channel_connectivity.cc
generated
vendored
Normal file
250
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/channel_connectivity.cc
generated
vendored
Normal file
@ -0,0 +1,250 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/lib/surface/channel.h"
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
#include "src/core/lib/surface/api_trace.h"
|
||||
#include "src/core/lib/surface/completion_queue.h"
|
||||
|
||||
grpc_connectivity_state grpc_channel_check_connectivity_state(
|
||||
grpc_channel* channel, int try_to_connect) {
|
||||
/* forward through to the underlying client channel */
|
||||
grpc_channel_element* client_channel_elem =
|
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
||||
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
||||
grpc_core::ExecCtx exec_ctx;
|
||||
grpc_connectivity_state state;
|
||||
GRPC_API_TRACE(
|
||||
"grpc_channel_check_connectivity_state(channel=%p, try_to_connect=%d)", 2,
|
||||
(channel, try_to_connect));
|
||||
if (GPR_LIKELY(client_channel_elem->filter == &grpc_client_channel_filter)) {
|
||||
state = grpc_client_channel_check_connectivity_state(client_channel_elem,
|
||||
try_to_connect);
|
||||
|
||||
return state;
|
||||
}
|
||||
gpr_log(GPR_ERROR,
|
||||
"grpc_channel_check_connectivity_state called on something that is "
|
||||
"not a client channel, but '%s'",
|
||||
client_channel_elem->filter->name);
|
||||
|
||||
return GRPC_CHANNEL_SHUTDOWN;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
WAITING,
|
||||
READY_TO_CALL_BACK,
|
||||
CALLING_BACK_AND_FINISHED,
|
||||
} callback_phase;
|
||||
|
||||
namespace {
|
||||
struct state_watcher {
|
||||
gpr_mu mu;
|
||||
callback_phase phase;
|
||||
grpc_closure on_complete;
|
||||
grpc_closure on_timeout;
|
||||
grpc_closure watcher_timer_init;
|
||||
grpc_timer alarm;
|
||||
grpc_connectivity_state state;
|
||||
grpc_completion_queue* cq;
|
||||
grpc_cq_completion completion_storage;
|
||||
grpc_channel* channel;
|
||||
grpc_error* error;
|
||||
void* tag;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
static void delete_state_watcher(state_watcher* w) {
|
||||
grpc_channel_element* client_channel_elem = grpc_channel_stack_last_element(
|
||||
grpc_channel_get_channel_stack(w->channel));
|
||||
if (client_channel_elem->filter == &grpc_client_channel_filter) {
|
||||
GRPC_CHANNEL_INTERNAL_UNREF(w->channel, "watch_channel_connectivity");
|
||||
} else {
|
||||
abort();
|
||||
}
|
||||
gpr_mu_destroy(&w->mu);
|
||||
gpr_free(w);
|
||||
}
|
||||
|
||||
static void finished_completion(void* pw, grpc_cq_completion* ignored) {
|
||||
bool should_delete = false;
|
||||
state_watcher* w = static_cast<state_watcher*>(pw);
|
||||
gpr_mu_lock(&w->mu);
|
||||
switch (w->phase) {
|
||||
case WAITING:
|
||||
case READY_TO_CALL_BACK:
|
||||
GPR_UNREACHABLE_CODE(return );
|
||||
case CALLING_BACK_AND_FINISHED:
|
||||
should_delete = true;
|
||||
break;
|
||||
}
|
||||
gpr_mu_unlock(&w->mu);
|
||||
|
||||
if (should_delete) {
|
||||
delete_state_watcher(w);
|
||||
}
|
||||
}
|
||||
|
||||
static void partly_done(state_watcher* w, bool due_to_completion,
|
||||
grpc_error* error) {
|
||||
if (due_to_completion) {
|
||||
grpc_timer_cancel(&w->alarm);
|
||||
} else {
|
||||
grpc_channel_element* client_channel_elem = grpc_channel_stack_last_element(
|
||||
grpc_channel_get_channel_stack(w->channel));
|
||||
grpc_client_channel_watch_connectivity_state(
|
||||
client_channel_elem,
|
||||
grpc_polling_entity_create_from_pollset(grpc_cq_pollset(w->cq)),
|
||||
nullptr, &w->on_complete, nullptr);
|
||||
}
|
||||
|
||||
gpr_mu_lock(&w->mu);
|
||||
|
||||
if (due_to_completion) {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures)) {
|
||||
GRPC_LOG_IF_ERROR("watch_completion_error", GRPC_ERROR_REF(error));
|
||||
}
|
||||
GRPC_ERROR_UNREF(error);
|
||||
error = GRPC_ERROR_NONE;
|
||||
} else {
|
||||
if (error == GRPC_ERROR_NONE) {
|
||||
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
||||
"Timed out waiting for connection state change");
|
||||
} else if (error == GRPC_ERROR_CANCELLED) {
|
||||
error = GRPC_ERROR_NONE;
|
||||
}
|
||||
}
|
||||
switch (w->phase) {
|
||||
case WAITING:
|
||||
GRPC_ERROR_REF(error);
|
||||
w->error = error;
|
||||
w->phase = READY_TO_CALL_BACK;
|
||||
break;
|
||||
case READY_TO_CALL_BACK:
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
GPR_ASSERT(!due_to_completion);
|
||||
GRPC_ERROR_UNREF(w->error);
|
||||
GRPC_ERROR_REF(error);
|
||||
w->error = error;
|
||||
}
|
||||
w->phase = CALLING_BACK_AND_FINISHED;
|
||||
grpc_cq_end_op(w->cq, w->tag, w->error, finished_completion, w,
|
||||
&w->completion_storage);
|
||||
break;
|
||||
case CALLING_BACK_AND_FINISHED:
|
||||
GPR_UNREACHABLE_CODE(return );
|
||||
break;
|
||||
}
|
||||
gpr_mu_unlock(&w->mu);
|
||||
|
||||
GRPC_ERROR_UNREF(error);
|
||||
}
|
||||
|
||||
static void watch_complete(void* pw, grpc_error* error) {
|
||||
partly_done(static_cast<state_watcher*>(pw), true, GRPC_ERROR_REF(error));
|
||||
}
|
||||
|
||||
static void timeout_complete(void* pw, grpc_error* error) {
|
||||
partly_done(static_cast<state_watcher*>(pw), false, GRPC_ERROR_REF(error));
|
||||
}
|
||||
|
||||
int grpc_channel_num_external_connectivity_watchers(grpc_channel* channel) {
|
||||
grpc_channel_element* client_channel_elem =
|
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
||||
return grpc_client_channel_num_external_connectivity_watchers(
|
||||
client_channel_elem);
|
||||
}
|
||||
|
||||
typedef struct watcher_timer_init_arg {
|
||||
state_watcher* w;
|
||||
gpr_timespec deadline;
|
||||
} watcher_timer_init_arg;
|
||||
|
||||
static void watcher_timer_init(void* arg, grpc_error* error_ignored) {
|
||||
watcher_timer_init_arg* wa = static_cast<watcher_timer_init_arg*>(arg);
|
||||
|
||||
grpc_timer_init(&wa->w->alarm, grpc_timespec_to_millis_round_up(wa->deadline),
|
||||
&wa->w->on_timeout);
|
||||
gpr_free(wa);
|
||||
}
|
||||
|
||||
int grpc_channel_support_connectivity_watcher(grpc_channel* channel) {
|
||||
grpc_channel_element* client_channel_elem =
|
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
||||
return client_channel_elem->filter != &grpc_client_channel_filter ? 0 : 1;
|
||||
}
|
||||
|
||||
void grpc_channel_watch_connectivity_state(
|
||||
grpc_channel* channel, grpc_connectivity_state last_observed_state,
|
||||
gpr_timespec deadline, grpc_completion_queue* cq, void* tag) {
|
||||
grpc_channel_element* client_channel_elem =
|
||||
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
|
||||
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
||||
grpc_core::ExecCtx exec_ctx;
|
||||
state_watcher* w = static_cast<state_watcher*>(gpr_malloc(sizeof(*w)));
|
||||
|
||||
GRPC_API_TRACE(
|
||||
"grpc_channel_watch_connectivity_state("
|
||||
"channel=%p, last_observed_state=%d, "
|
||||
"deadline=gpr_timespec { tv_sec: %" PRId64
|
||||
", tv_nsec: %d, clock_type: %d }, "
|
||||
"cq=%p, tag=%p)",
|
||||
7,
|
||||
(channel, (int)last_observed_state, deadline.tv_sec, deadline.tv_nsec,
|
||||
(int)deadline.clock_type, cq, tag));
|
||||
|
||||
GPR_ASSERT(grpc_cq_begin_op(cq, tag));
|
||||
|
||||
gpr_mu_init(&w->mu);
|
||||
GRPC_CLOSURE_INIT(&w->on_complete, watch_complete, w,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
GRPC_CLOSURE_INIT(&w->on_timeout, timeout_complete, w,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
w->phase = WAITING;
|
||||
w->state = last_observed_state;
|
||||
w->cq = cq;
|
||||
w->tag = tag;
|
||||
w->channel = channel;
|
||||
w->error = nullptr;
|
||||
|
||||
watcher_timer_init_arg* wa = static_cast<watcher_timer_init_arg*>(
|
||||
gpr_malloc(sizeof(watcher_timer_init_arg)));
|
||||
wa->w = w;
|
||||
wa->deadline = deadline;
|
||||
GRPC_CLOSURE_INIT(&w->watcher_timer_init, watcher_timer_init, wa,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
|
||||
if (client_channel_elem->filter == &grpc_client_channel_filter) {
|
||||
GRPC_CHANNEL_INTERNAL_REF(channel, "watch_channel_connectivity");
|
||||
grpc_client_channel_watch_connectivity_state(
|
||||
client_channel_elem,
|
||||
grpc_polling_entity_create_from_pollset(grpc_cq_pollset(cq)), &w->state,
|
||||
&w->on_complete, &w->watcher_timer_init);
|
||||
} else {
|
||||
abort();
|
||||
}
|
||||
}
|
3903
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel.cc
generated
vendored
Normal file
3903
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel.cc
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
58
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel.h
generated
vendored
Normal file
58
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel.h
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
||||
#include "src/core/ext/filters/client_channel/client_channel_factory.h"
|
||||
#include "src/core/ext/filters/client_channel/resolver.h"
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
|
||||
extern grpc_core::TraceFlag grpc_client_channel_trace;
|
||||
|
||||
// Channel arg key for server URI string.
|
||||
#define GRPC_ARG_SERVER_URI "grpc.server_uri"
|
||||
|
||||
/* A client channel is a channel that begins disconnected, and can connect
|
||||
to some endpoint on demand. If that endpoint disconnects, it will be
|
||||
connected to again later.
|
||||
|
||||
Calls on a disconnected client channel are queued until a connection is
|
||||
established. */
|
||||
|
||||
extern const grpc_channel_filter grpc_client_channel_filter;
|
||||
|
||||
grpc_connectivity_state grpc_client_channel_check_connectivity_state(
|
||||
grpc_channel_element* elem, int try_to_connect);
|
||||
|
||||
int grpc_client_channel_num_external_connectivity_watchers(
|
||||
grpc_channel_element* elem);
|
||||
|
||||
void grpc_client_channel_watch_connectivity_state(
|
||||
grpc_channel_element* elem, grpc_polling_entity pollent,
|
||||
grpc_connectivity_state* state, grpc_closure* on_complete,
|
||||
grpc_closure* watcher_timer_init);
|
||||
|
||||
/* Debug helper: pull the subchannel call from a call stack element */
|
||||
grpc_core::RefCountedPtr<grpc_core::SubchannelCall>
|
||||
grpc_client_channel_get_subchannel_call(grpc_call_element* elem);
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_H */
|
112
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_channelz.cc
generated
vendored
Normal file
112
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_channelz.cc
generated
vendored
Normal file
@ -0,0 +1,112 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel.h"
|
||||
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
||||
#include "src/core/lib/channel/channelz_registry.h"
|
||||
#include "src/core/lib/gpr/useful.h"
|
||||
#include "src/core/lib/surface/channel.h"
|
||||
#include "src/core/lib/transport/connectivity_state.h"
|
||||
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
namespace grpc_core {
|
||||
namespace channelz {
|
||||
|
||||
SubchannelNode::SubchannelNode(const char* target_address,
|
||||
size_t channel_tracer_max_nodes)
|
||||
: BaseNode(EntityType::kSubchannel,
|
||||
UniquePtr<char>(gpr_strdup(target_address))),
|
||||
target_(UniquePtr<char>(gpr_strdup(target_address))),
|
||||
trace_(channel_tracer_max_nodes) {}
|
||||
|
||||
SubchannelNode::~SubchannelNode() {}
|
||||
|
||||
void SubchannelNode::UpdateConnectivityState(grpc_connectivity_state state) {
|
||||
connectivity_state_.Store(state, MemoryOrder::RELAXED);
|
||||
}
|
||||
|
||||
void SubchannelNode::SetChildSocket(RefCountedPtr<SocketNode> socket) {
|
||||
MutexLock lock(&socket_mu_);
|
||||
child_socket_ = std::move(socket);
|
||||
}
|
||||
|
||||
void SubchannelNode::PopulateConnectivityState(grpc_json* json) {
|
||||
grpc_connectivity_state state =
|
||||
connectivity_state_.Load(MemoryOrder::RELAXED);
|
||||
json = grpc_json_create_child(nullptr, json, "state", nullptr,
|
||||
GRPC_JSON_OBJECT, false);
|
||||
grpc_json_create_child(nullptr, json, "state",
|
||||
grpc_connectivity_state_name(state), GRPC_JSON_STRING,
|
||||
false);
|
||||
}
|
||||
|
||||
grpc_json* SubchannelNode::RenderJson() {
|
||||
grpc_json* top_level_json = grpc_json_create(GRPC_JSON_OBJECT);
|
||||
grpc_json* json = top_level_json;
|
||||
grpc_json* json_iterator = nullptr;
|
||||
json_iterator = grpc_json_create_child(json_iterator, json, "ref", nullptr,
|
||||
GRPC_JSON_OBJECT, false);
|
||||
json = json_iterator;
|
||||
json_iterator = nullptr;
|
||||
json_iterator = grpc_json_add_number_string_child(json, json_iterator,
|
||||
"subchannelId", uuid());
|
||||
// reset json iterators to top level object
|
||||
json = top_level_json;
|
||||
json_iterator = nullptr;
|
||||
// create and fill the data child.
|
||||
grpc_json* data = grpc_json_create_child(json_iterator, json, "data", nullptr,
|
||||
GRPC_JSON_OBJECT, false);
|
||||
json = data;
|
||||
json_iterator = nullptr;
|
||||
PopulateConnectivityState(json);
|
||||
GPR_ASSERT(target_.get() != nullptr);
|
||||
grpc_json_create_child(nullptr, json, "target", target_.get(),
|
||||
GRPC_JSON_STRING, false);
|
||||
// fill in the channel trace if applicable
|
||||
grpc_json* trace_json = trace_.RenderJson();
|
||||
if (trace_json != nullptr) {
|
||||
trace_json->key = "trace"; // this object is named trace in channelz.proto
|
||||
grpc_json_link_child(json, trace_json, nullptr);
|
||||
}
|
||||
// ask CallCountingHelper to populate trace and call count data.
|
||||
call_counter_.PopulateCallCounts(json);
|
||||
json = top_level_json;
|
||||
// populate the child socket.
|
||||
RefCountedPtr<SocketNode> child_socket;
|
||||
{
|
||||
MutexLock lock(&socket_mu_);
|
||||
child_socket = child_socket_;
|
||||
}
|
||||
if (child_socket != nullptr && child_socket->uuid() != 0) {
|
||||
grpc_json* array_parent = grpc_json_create_child(
|
||||
nullptr, json, "socketRef", nullptr, GRPC_JSON_ARRAY, false);
|
||||
json_iterator = grpc_json_create_child(json_iterator, array_parent, nullptr,
|
||||
nullptr, GRPC_JSON_OBJECT, false);
|
||||
grpc_json* sibling_iterator = grpc_json_add_number_string_child(
|
||||
json_iterator, nullptr, "socketId", child_socket->uuid());
|
||||
grpc_json_create_child(sibling_iterator, json_iterator, "name",
|
||||
child_socket->name(), GRPC_JSON_STRING, false);
|
||||
}
|
||||
return top_level_json;
|
||||
}
|
||||
|
||||
} // namespace channelz
|
||||
} // namespace grpc_core
|
78
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_channelz.h
generated
vendored
Normal file
78
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_channelz.h
generated
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_CHANNELZ_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_CHANNELZ_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/lib/channel/channel_trace.h"
|
||||
#include "src/core/lib/channel/channelz.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
class Subchannel;
|
||||
|
||||
namespace channelz {
|
||||
|
||||
class SubchannelNode : public BaseNode {
|
||||
public:
|
||||
SubchannelNode(const char* target_address, size_t channel_tracer_max_nodes);
|
||||
~SubchannelNode() override;
|
||||
|
||||
// Sets the subchannel's connectivity state without health checking.
|
||||
void UpdateConnectivityState(grpc_connectivity_state state);
|
||||
|
||||
// Used when the subchannel's child socket changes. This should be set when
|
||||
// the subchannel's transport is created and set to nullptr when the
|
||||
// subchannel unrefs the transport.
|
||||
void SetChildSocket(RefCountedPtr<SocketNode> socket);
|
||||
|
||||
grpc_json* RenderJson() override;
|
||||
|
||||
// proxy methods to composed classes.
|
||||
void AddTraceEvent(ChannelTrace::Severity severity, const grpc_slice& data) {
|
||||
trace_.AddTraceEvent(severity, data);
|
||||
}
|
||||
void AddTraceEventWithReference(ChannelTrace::Severity severity,
|
||||
const grpc_slice& data,
|
||||
RefCountedPtr<BaseNode> referenced_channel) {
|
||||
trace_.AddTraceEventWithReference(severity, data,
|
||||
std::move(referenced_channel));
|
||||
}
|
||||
void RecordCallStarted() { call_counter_.RecordCallStarted(); }
|
||||
void RecordCallFailed() { call_counter_.RecordCallFailed(); }
|
||||
void RecordCallSucceeded() { call_counter_.RecordCallSucceeded(); }
|
||||
|
||||
private:
|
||||
void PopulateConnectivityState(grpc_json* json);
|
||||
|
||||
Atomic<grpc_connectivity_state> connectivity_state_{GRPC_CHANNEL_IDLE};
|
||||
Mutex socket_mu_;
|
||||
RefCountedPtr<SocketNode> child_socket_;
|
||||
UniquePtr<char> target_;
|
||||
CallCountingHelper call_counter_;
|
||||
ChannelTrace trace_;
|
||||
};
|
||||
|
||||
} // namespace channelz
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_CHANNELZ_H */
|
55
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_factory.cc
generated
vendored
Normal file
55
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_factory.cc
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel_factory.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
|
||||
// Channel arg key for client channel factory.
|
||||
#define GRPC_ARG_CLIENT_CHANNEL_FACTORY "grpc.client_channel_factory"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
namespace {
|
||||
|
||||
void* factory_arg_copy(void* f) { return f; }
|
||||
void factory_arg_destroy(void* f) {}
|
||||
int factory_arg_cmp(void* factory1, void* factory2) {
|
||||
return GPR_ICMP(factory1, factory2);
|
||||
}
|
||||
const grpc_arg_pointer_vtable factory_arg_vtable = {
|
||||
factory_arg_copy, factory_arg_destroy, factory_arg_cmp};
|
||||
|
||||
} // namespace
|
||||
|
||||
grpc_arg ClientChannelFactory::CreateChannelArg(ClientChannelFactory* factory) {
|
||||
return grpc_channel_arg_pointer_create(
|
||||
const_cast<char*>(GRPC_ARG_CLIENT_CHANNEL_FACTORY), factory,
|
||||
&factory_arg_vtable);
|
||||
}
|
||||
|
||||
ClientChannelFactory* ClientChannelFactory::GetFromChannelArgs(
|
||||
const grpc_channel_args* args) {
|
||||
const grpc_arg* arg =
|
||||
grpc_channel_args_find(args, GRPC_ARG_CLIENT_CHANNEL_FACTORY);
|
||||
if (arg == nullptr || arg->type != GRPC_ARG_POINTER) return nullptr;
|
||||
return static_cast<ClientChannelFactory*>(arg->value.pointer.p);
|
||||
}
|
||||
|
||||
} // namespace grpc_core
|
55
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_factory.h
generated
vendored
Normal file
55
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_factory.h
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_FACTORY_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_FACTORY_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/subchannel.h"
|
||||
#include "src/core/lib/gprpp/abstract.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
class ClientChannelFactory {
|
||||
public:
|
||||
virtual ~ClientChannelFactory() = default;
|
||||
|
||||
// Creates a subchannel with the specified args.
|
||||
virtual Subchannel* CreateSubchannel(const grpc_channel_args* args)
|
||||
GRPC_ABSTRACT;
|
||||
|
||||
// Creates a channel for the specified target with the specified args.
|
||||
virtual grpc_channel* CreateChannel(
|
||||
const char* target, const grpc_channel_args* args) GRPC_ABSTRACT;
|
||||
|
||||
// Returns a channel arg containing the specified factory.
|
||||
static grpc_arg CreateChannelArg(ClientChannelFactory* factory);
|
||||
|
||||
// Returns the factory from args, or null if not found.
|
||||
static ClientChannelFactory* GetFromChannelArgs(
|
||||
const grpc_channel_args* args);
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
};
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CLIENT_CHANNEL_FACTORY_H */
|
69
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_plugin.cc
generated
vendored
Normal file
69
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/client_channel_plugin.cc
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/backup_poller.h"
|
||||
#include "src/core/ext/filters/client_channel/client_channel.h"
|
||||
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
||||
#include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
|
||||
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
|
||||
#include "src/core/ext/filters/client_channel/http_proxy.h"
|
||||
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
||||
#include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
|
||||
#include "src/core/ext/filters/client_channel/resolver_registry.h"
|
||||
#include "src/core/ext/filters/client_channel/resolver_result_parsing.h"
|
||||
#include "src/core/ext/filters/client_channel/retry_throttle.h"
|
||||
#include "src/core/lib/surface/channel_init.h"
|
||||
|
||||
static bool append_filter(grpc_channel_stack_builder* builder, void* arg) {
|
||||
return grpc_channel_stack_builder_append_filter(
|
||||
builder, static_cast<const grpc_channel_filter*>(arg), nullptr, nullptr);
|
||||
}
|
||||
|
||||
void grpc_client_channel_init(void) {
|
||||
grpc_core::ServiceConfig::Init();
|
||||
grpc_core::internal::ClientChannelServiceConfigParser::Register();
|
||||
grpc_core::LoadBalancingPolicyRegistry::Builder::InitRegistry();
|
||||
grpc_core::ResolverRegistry::Builder::InitRegistry();
|
||||
grpc_core::internal::ServerRetryThrottleMap::Init();
|
||||
grpc_proxy_mapper_registry_init();
|
||||
grpc_register_http_proxy_mapper();
|
||||
grpc_core::GlobalSubchannelPool::Init();
|
||||
grpc_channel_init_register_stage(
|
||||
GRPC_CLIENT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, append_filter,
|
||||
(void*)&grpc_client_channel_filter);
|
||||
grpc_http_connect_register_handshaker_factory();
|
||||
grpc_client_channel_global_init_backup_polling();
|
||||
}
|
||||
|
||||
void grpc_client_channel_shutdown(void) {
|
||||
grpc_core::GlobalSubchannelPool::Shutdown();
|
||||
grpc_channel_init_shutdown();
|
||||
grpc_proxy_mapper_registry_shutdown();
|
||||
grpc_core::internal::ServerRetryThrottleMap::Shutdown();
|
||||
grpc_core::ResolverRegistry::Builder::ShutdownRegistry();
|
||||
grpc_core::LoadBalancingPolicyRegistry::Builder::ShutdownRegistry();
|
||||
grpc_core::ServiceConfig::Shutdown();
|
||||
}
|
41
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/connector.cc
generated
vendored
Normal file
41
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/connector.cc
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/connector.h"
|
||||
|
||||
grpc_connector* grpc_connector_ref(grpc_connector* connector) {
|
||||
connector->vtable->ref(connector);
|
||||
return connector;
|
||||
}
|
||||
|
||||
void grpc_connector_unref(grpc_connector* connector) {
|
||||
connector->vtable->unref(connector);
|
||||
}
|
||||
|
||||
void grpc_connector_connect(grpc_connector* connector,
|
||||
const grpc_connect_in_args* in_args,
|
||||
grpc_connect_out_args* out_args,
|
||||
grpc_closure* notify) {
|
||||
connector->vtable->connect(connector, in_args, out_args, notify);
|
||||
}
|
||||
|
||||
void grpc_connector_shutdown(grpc_connector* connector, grpc_error* why) {
|
||||
connector->vtable->shutdown(connector, why);
|
||||
}
|
84
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/connector.h
generated
vendored
Normal file
84
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/connector.h
generated
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_CONNECTOR_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CONNECTOR_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/lib/channel/channelz.h"
|
||||
#include "src/core/lib/iomgr/resolve_address.h"
|
||||
#include "src/core/lib/transport/transport.h"
|
||||
|
||||
typedef struct grpc_connector grpc_connector;
|
||||
typedef struct grpc_connector_vtable grpc_connector_vtable;
|
||||
|
||||
struct grpc_connector {
|
||||
const grpc_connector_vtable* vtable;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
/** set of pollsets interested in this connection */
|
||||
grpc_pollset_set* interested_parties;
|
||||
/** deadline for connection */
|
||||
grpc_millis deadline;
|
||||
/** channel arguments (to be passed to transport) */
|
||||
const grpc_channel_args* channel_args;
|
||||
} grpc_connect_in_args;
|
||||
|
||||
typedef struct {
|
||||
/** the connected transport */
|
||||
grpc_transport* transport;
|
||||
|
||||
/** channel arguments (to be passed to the filters) */
|
||||
grpc_channel_args* channel_args;
|
||||
|
||||
/** channelz socket node of the connected transport. nullptr if not available
|
||||
*/
|
||||
grpc_core::RefCountedPtr<grpc_core::channelz::SocketNode> socket;
|
||||
|
||||
void reset() {
|
||||
transport = nullptr;
|
||||
channel_args = nullptr;
|
||||
socket = nullptr;
|
||||
}
|
||||
} grpc_connect_out_args;
|
||||
|
||||
struct grpc_connector_vtable {
|
||||
void (*ref)(grpc_connector* connector);
|
||||
void (*unref)(grpc_connector* connector);
|
||||
/** Implementation of grpc_connector_shutdown */
|
||||
void (*shutdown)(grpc_connector* connector, grpc_error* why);
|
||||
/** Implementation of grpc_connector_connect */
|
||||
void (*connect)(grpc_connector* connector,
|
||||
const grpc_connect_in_args* in_args,
|
||||
grpc_connect_out_args* out_args, grpc_closure* notify);
|
||||
};
|
||||
|
||||
grpc_connector* grpc_connector_ref(grpc_connector* connector);
|
||||
void grpc_connector_unref(grpc_connector* connector);
|
||||
/** Connect using the connector: max one outstanding call at a time */
|
||||
void grpc_connector_connect(grpc_connector* connector,
|
||||
const grpc_connect_in_args* in_args,
|
||||
grpc_connect_out_args* out_args,
|
||||
grpc_closure* notify);
|
||||
/** Cancel any pending connection */
|
||||
void grpc_connector_shutdown(grpc_connector* connector, grpc_error* why);
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_CONNECTOR_H */
|
179
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/global_subchannel_pool.cc
generated
vendored
Normal file
179
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/global_subchannel_pool.cc
generated
vendored
Normal file
@ -0,0 +1,179 @@
|
||||
//
|
||||
//
|
||||
// Copyright 2018 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.
|
||||
//
|
||||
//
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
|
||||
|
||||
#include "src/core/ext/filters/client_channel/subchannel.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
GlobalSubchannelPool::GlobalSubchannelPool() {
|
||||
subchannel_map_ = grpc_avl_create(&subchannel_avl_vtable_);
|
||||
gpr_mu_init(&mu_);
|
||||
}
|
||||
|
||||
GlobalSubchannelPool::~GlobalSubchannelPool() {
|
||||
gpr_mu_destroy(&mu_);
|
||||
grpc_avl_unref(subchannel_map_, nullptr);
|
||||
}
|
||||
|
||||
void GlobalSubchannelPool::Init() {
|
||||
instance_ = New<RefCountedPtr<GlobalSubchannelPool>>(
|
||||
MakeRefCounted<GlobalSubchannelPool>());
|
||||
}
|
||||
|
||||
void GlobalSubchannelPool::Shutdown() {
|
||||
// To ensure Init() was called before.
|
||||
GPR_ASSERT(instance_ != nullptr);
|
||||
// To ensure Shutdown() was not called before.
|
||||
GPR_ASSERT(*instance_ != nullptr);
|
||||
instance_->reset();
|
||||
Delete(instance_);
|
||||
}
|
||||
|
||||
RefCountedPtr<GlobalSubchannelPool> GlobalSubchannelPool::instance() {
|
||||
GPR_ASSERT(instance_ != nullptr);
|
||||
GPR_ASSERT(*instance_ != nullptr);
|
||||
return *instance_;
|
||||
}
|
||||
|
||||
Subchannel* GlobalSubchannelPool::RegisterSubchannel(SubchannelKey* key,
|
||||
Subchannel* constructed) {
|
||||
Subchannel* c = nullptr;
|
||||
// Compare and swap (CAS) loop:
|
||||
while (c == nullptr) {
|
||||
// Ref the shared map to have a local copy.
|
||||
gpr_mu_lock(&mu_);
|
||||
grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
|
||||
gpr_mu_unlock(&mu_);
|
||||
// Check to see if a subchannel already exists.
|
||||
c = static_cast<Subchannel*>(grpc_avl_get(old_map, key, nullptr));
|
||||
if (c != nullptr) {
|
||||
// The subchannel already exists. Try to reuse it.
|
||||
c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "subchannel_register+reuse");
|
||||
if (c != nullptr) {
|
||||
GRPC_SUBCHANNEL_UNREF(constructed,
|
||||
"subchannel_register+found_existing");
|
||||
// Exit the CAS loop without modifying the shared map.
|
||||
} // Else, reuse failed, so retry CAS loop.
|
||||
} else {
|
||||
// There hasn't been such subchannel. Add one.
|
||||
// Note that we should ref the old map first because grpc_avl_add() will
|
||||
// unref it while we still need to access it later.
|
||||
grpc_avl new_map = grpc_avl_add(
|
||||
grpc_avl_ref(old_map, nullptr), New<SubchannelKey>(*key),
|
||||
GRPC_SUBCHANNEL_WEAK_REF(constructed, "subchannel_register+new"),
|
||||
nullptr);
|
||||
// Try to publish the change to the shared map. It may happen (but
|
||||
// unlikely) that some other thread has changed the shared map, so compare
|
||||
// to make sure it's unchanged before swapping. Retry if it's changed.
|
||||
gpr_mu_lock(&mu_);
|
||||
if (old_map.root == subchannel_map_.root) {
|
||||
GPR_SWAP(grpc_avl, new_map, subchannel_map_);
|
||||
c = constructed;
|
||||
}
|
||||
gpr_mu_unlock(&mu_);
|
||||
grpc_avl_unref(new_map, nullptr);
|
||||
}
|
||||
grpc_avl_unref(old_map, nullptr);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void GlobalSubchannelPool::UnregisterSubchannel(SubchannelKey* key) {
|
||||
bool done = false;
|
||||
// Compare and swap (CAS) loop:
|
||||
while (!done) {
|
||||
// Ref the shared map to have a local copy.
|
||||
gpr_mu_lock(&mu_);
|
||||
grpc_avl old_map = grpc_avl_ref(subchannel_map_, nullptr);
|
||||
gpr_mu_unlock(&mu_);
|
||||
// Remove the subchannel.
|
||||
// Note that we should ref the old map first because grpc_avl_remove() will
|
||||
// unref it while we still need to access it later.
|
||||
grpc_avl new_map =
|
||||
grpc_avl_remove(grpc_avl_ref(old_map, nullptr), key, nullptr);
|
||||
// Try to publish the change to the shared map. It may happen (but
|
||||
// unlikely) that some other thread has changed the shared map, so compare
|
||||
// to make sure it's unchanged before swapping. Retry if it's changed.
|
||||
gpr_mu_lock(&mu_);
|
||||
if (old_map.root == subchannel_map_.root) {
|
||||
GPR_SWAP(grpc_avl, new_map, subchannel_map_);
|
||||
done = true;
|
||||
}
|
||||
gpr_mu_unlock(&mu_);
|
||||
grpc_avl_unref(new_map, nullptr);
|
||||
grpc_avl_unref(old_map, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
Subchannel* GlobalSubchannelPool::FindSubchannel(SubchannelKey* key) {
|
||||
// Lock, and take a reference to the subchannel map.
|
||||
// We don't need to do the search under a lock as AVL's are immutable.
|
||||
gpr_mu_lock(&mu_);
|
||||
grpc_avl index = grpc_avl_ref(subchannel_map_, nullptr);
|
||||
gpr_mu_unlock(&mu_);
|
||||
Subchannel* c = static_cast<Subchannel*>(grpc_avl_get(index, key, nullptr));
|
||||
if (c != nullptr) c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "found_from_pool");
|
||||
grpc_avl_unref(index, nullptr);
|
||||
return c;
|
||||
}
|
||||
|
||||
RefCountedPtr<GlobalSubchannelPool>* GlobalSubchannelPool::instance_ = nullptr;
|
||||
|
||||
namespace {
|
||||
|
||||
void sck_avl_destroy(void* p, void* user_data) {
|
||||
SubchannelKey* key = static_cast<SubchannelKey*>(p);
|
||||
Delete(key);
|
||||
}
|
||||
|
||||
void* sck_avl_copy(void* p, void* unused) {
|
||||
const SubchannelKey* key = static_cast<const SubchannelKey*>(p);
|
||||
auto* new_key = New<SubchannelKey>(*key);
|
||||
return static_cast<void*>(new_key);
|
||||
}
|
||||
|
||||
long sck_avl_compare(void* a, void* b, void* unused) {
|
||||
const SubchannelKey* key_a = static_cast<const SubchannelKey*>(a);
|
||||
const SubchannelKey* key_b = static_cast<const SubchannelKey*>(b);
|
||||
return key_a->Cmp(*key_b);
|
||||
}
|
||||
|
||||
void scv_avl_destroy(void* p, void* user_data) {
|
||||
GRPC_SUBCHANNEL_WEAK_UNREF((Subchannel*)p, "global_subchannel_pool");
|
||||
}
|
||||
|
||||
void* scv_avl_copy(void* p, void* unused) {
|
||||
GRPC_SUBCHANNEL_WEAK_REF((Subchannel*)p, "global_subchannel_pool");
|
||||
return p;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
const grpc_avl_vtable GlobalSubchannelPool::subchannel_avl_vtable_ = {
|
||||
sck_avl_destroy, // destroy_key
|
||||
sck_avl_copy, // copy_key
|
||||
sck_avl_compare, // compare_keys
|
||||
scv_avl_destroy, // destroy_value
|
||||
scv_avl_copy // copy_value
|
||||
};
|
||||
|
||||
} // namespace grpc_core
|
68
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/global_subchannel_pool.h
generated
vendored
Normal file
68
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/global_subchannel_pool.h
generated
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
// The global subchannel pool. It shares subchannels among channels. There
|
||||
// should be only one instance of this class. Init() should be called once at
|
||||
// the filter initialization time; Shutdown() should be called once at the
|
||||
// filter shutdown time.
|
||||
// TODO(juanlishen): Enable subchannel retention.
|
||||
class GlobalSubchannelPool final : public SubchannelPoolInterface {
|
||||
public:
|
||||
// The ctor and dtor are not intended to use directly.
|
||||
GlobalSubchannelPool();
|
||||
~GlobalSubchannelPool() override;
|
||||
|
||||
// Should be called exactly once at filter initialization time.
|
||||
static void Init();
|
||||
// Should be called exactly once at filter shutdown time.
|
||||
static void Shutdown();
|
||||
|
||||
// Gets the singleton instance.
|
||||
static RefCountedPtr<GlobalSubchannelPool> instance();
|
||||
|
||||
// Implements interface methods.
|
||||
Subchannel* RegisterSubchannel(SubchannelKey* key,
|
||||
Subchannel* constructed) override;
|
||||
void UnregisterSubchannel(SubchannelKey* key) override;
|
||||
Subchannel* FindSubchannel(SubchannelKey* key) override;
|
||||
|
||||
private:
|
||||
// The singleton instance. (It's a pointer to RefCountedPtr so that this
|
||||
// non-local static object can be trivially destructible.)
|
||||
static RefCountedPtr<GlobalSubchannelPool>* instance_;
|
||||
|
||||
// The vtable for subchannel operations in an AVL tree.
|
||||
static const grpc_avl_vtable subchannel_avl_vtable_;
|
||||
// A map from subchannel key to subchannel.
|
||||
grpc_avl subchannel_map_;
|
||||
// To protect subchannel_map_.
|
||||
gpr_mu mu_;
|
||||
};
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_GLOBAL_SUBCHANNEL_POOL_H */
|
23
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health.pb.c
generated
vendored
Normal file
23
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health.pb.c
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
/* Automatically generated nanopb constant definitions */
|
||||
/* Generated by nanopb-0.3.7-dev */
|
||||
|
||||
#include "src/core/ext/filters/client_channel/health/health.pb.h"
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
const pb_field_t grpc_health_v1_HealthCheckRequest_fields[2] = {
|
||||
PB_FIELD( 1, STRING , OPTIONAL, STATIC , FIRST, grpc_health_v1_HealthCheckRequest, service, service, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t grpc_health_v1_HealthCheckResponse_fields[2] = {
|
||||
PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, grpc_health_v1_HealthCheckResponse, status, status, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
|
||||
/* @@protoc_insertion_point(eof) */
|
73
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health.pb.h
generated
vendored
Normal file
73
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health.pb.h
generated
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
/* Automatically generated nanopb header */
|
||||
/* Generated by nanopb-0.3.7-dev */
|
||||
|
||||
#ifndef PB_GRPC_HEALTH_V1_HEALTH_PB_H_INCLUDED
|
||||
#define PB_GRPC_HEALTH_V1_HEALTH_PB_H_INCLUDED
|
||||
#include "pb.h"
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Enum definitions */
|
||||
typedef enum _grpc_health_v1_HealthCheckResponse_ServingStatus {
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_UNKNOWN = 0,
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_SERVING = 1,
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_NOT_SERVING = 2,
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_SERVICE_UNKNOWN = 3
|
||||
} grpc_health_v1_HealthCheckResponse_ServingStatus;
|
||||
#define _grpc_health_v1_HealthCheckResponse_ServingStatus_MIN grpc_health_v1_HealthCheckResponse_ServingStatus_UNKNOWN
|
||||
#define _grpc_health_v1_HealthCheckResponse_ServingStatus_MAX grpc_health_v1_HealthCheckResponse_ServingStatus_SERVICE_UNKNOWN
|
||||
#define _grpc_health_v1_HealthCheckResponse_ServingStatus_ARRAYSIZE ((grpc_health_v1_HealthCheckResponse_ServingStatus)(grpc_health_v1_HealthCheckResponse_ServingStatus_SERVICE_UNKNOWN+1))
|
||||
|
||||
/* Struct definitions */
|
||||
typedef struct _grpc_health_v1_HealthCheckRequest {
|
||||
bool has_service;
|
||||
char service[200];
|
||||
/* @@protoc_insertion_point(struct:grpc_health_v1_HealthCheckRequest) */
|
||||
} grpc_health_v1_HealthCheckRequest;
|
||||
|
||||
typedef struct _grpc_health_v1_HealthCheckResponse {
|
||||
bool has_status;
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus status;
|
||||
/* @@protoc_insertion_point(struct:grpc_health_v1_HealthCheckResponse) */
|
||||
} grpc_health_v1_HealthCheckResponse;
|
||||
|
||||
/* Default values for struct fields */
|
||||
|
||||
/* Initializer values for message structs */
|
||||
#define grpc_health_v1_HealthCheckRequest_init_default {false, ""}
|
||||
#define grpc_health_v1_HealthCheckResponse_init_default {false, (grpc_health_v1_HealthCheckResponse_ServingStatus)0}
|
||||
#define grpc_health_v1_HealthCheckRequest_init_zero {false, ""}
|
||||
#define grpc_health_v1_HealthCheckResponse_init_zero {false, (grpc_health_v1_HealthCheckResponse_ServingStatus)0}
|
||||
|
||||
/* Field tags (for use in manual encoding/decoding) */
|
||||
#define grpc_health_v1_HealthCheckRequest_service_tag 1
|
||||
#define grpc_health_v1_HealthCheckResponse_status_tag 1
|
||||
|
||||
/* Struct field encoding specification for nanopb */
|
||||
extern const pb_field_t grpc_health_v1_HealthCheckRequest_fields[2];
|
||||
extern const pb_field_t grpc_health_v1_HealthCheckResponse_fields[2];
|
||||
|
||||
/* Maximum encoded size of messages (where known) */
|
||||
#define grpc_health_v1_HealthCheckRequest_size 203
|
||||
#define grpc_health_v1_HealthCheckResponse_size 2
|
||||
|
||||
/* Message IDs (where set with "msgid" option) */
|
||||
#ifdef PB_MSGID
|
||||
|
||||
#define HEALTH_MESSAGES \
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
/* @@protoc_insertion_point(eof) */
|
||||
|
||||
#endif
|
654
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health_check_client.cc
generated
vendored
Normal file
654
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health_check_client.cc
generated
vendored
Normal file
@ -0,0 +1,654 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/health/health_check_client.h"
|
||||
|
||||
#include "pb_decode.h"
|
||||
#include "pb_encode.h"
|
||||
#include "src/core/ext/filters/client_channel/health/health.pb.h"
|
||||
#include "src/core/lib/debug/trace.h"
|
||||
#include "src/core/lib/gprpp/sync.h"
|
||||
#include "src/core/lib/slice/slice_internal.h"
|
||||
#include "src/core/lib/transport/error_utils.h"
|
||||
#include "src/core/lib/transport/status_metadata.h"
|
||||
|
||||
#define HEALTH_CHECK_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
||||
#define HEALTH_CHECK_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
||||
#define HEALTH_CHECK_RECONNECT_MAX_BACKOFF_SECONDS 120
|
||||
#define HEALTH_CHECK_RECONNECT_JITTER 0.2
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
TraceFlag grpc_health_check_client_trace(false, "health_check_client");
|
||||
|
||||
//
|
||||
// HealthCheckClient
|
||||
//
|
||||
|
||||
HealthCheckClient::HealthCheckClient(
|
||||
const char* service_name,
|
||||
RefCountedPtr<ConnectedSubchannel> connected_subchannel,
|
||||
grpc_pollset_set* interested_parties,
|
||||
RefCountedPtr<channelz::SubchannelNode> channelz_node)
|
||||
: InternallyRefCounted<HealthCheckClient>(&grpc_health_check_client_trace),
|
||||
service_name_(service_name),
|
||||
connected_subchannel_(std::move(connected_subchannel)),
|
||||
interested_parties_(interested_parties),
|
||||
channelz_node_(std::move(channelz_node)),
|
||||
retry_backoff_(
|
||||
BackOff::Options()
|
||||
.set_initial_backoff(
|
||||
HEALTH_CHECK_INITIAL_CONNECT_BACKOFF_SECONDS * 1000)
|
||||
.set_multiplier(HEALTH_CHECK_RECONNECT_BACKOFF_MULTIPLIER)
|
||||
.set_jitter(HEALTH_CHECK_RECONNECT_JITTER)
|
||||
.set_max_backoff(HEALTH_CHECK_RECONNECT_MAX_BACKOFF_SECONDS *
|
||||
1000)) {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "created HealthCheckClient %p", this);
|
||||
}
|
||||
GRPC_CLOSURE_INIT(&retry_timer_callback_, OnRetryTimer, this,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
StartCall();
|
||||
}
|
||||
|
||||
HealthCheckClient::~HealthCheckClient() {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "destroying HealthCheckClient %p", this);
|
||||
}
|
||||
GRPC_ERROR_UNREF(error_);
|
||||
}
|
||||
|
||||
void HealthCheckClient::NotifyOnHealthChange(grpc_connectivity_state* state,
|
||||
grpc_closure* closure) {
|
||||
MutexLock lock(&mu_);
|
||||
GPR_ASSERT(notify_state_ == nullptr);
|
||||
if (*state != state_) {
|
||||
*state = state_;
|
||||
GRPC_CLOSURE_SCHED(closure, GRPC_ERROR_REF(error_));
|
||||
return;
|
||||
}
|
||||
notify_state_ = state;
|
||||
on_health_changed_ = closure;
|
||||
}
|
||||
|
||||
void HealthCheckClient::SetHealthStatus(grpc_connectivity_state state,
|
||||
grpc_error* error) {
|
||||
MutexLock lock(&mu_);
|
||||
SetHealthStatusLocked(state, error);
|
||||
}
|
||||
|
||||
void HealthCheckClient::SetHealthStatusLocked(grpc_connectivity_state state,
|
||||
grpc_error* error) {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: setting state=%d error=%s", this,
|
||||
state, grpc_error_string(error));
|
||||
}
|
||||
if (notify_state_ != nullptr && *notify_state_ != state) {
|
||||
*notify_state_ = state;
|
||||
notify_state_ = nullptr;
|
||||
GRPC_CLOSURE_SCHED(on_health_changed_, GRPC_ERROR_REF(error));
|
||||
on_health_changed_ = nullptr;
|
||||
}
|
||||
state_ = state;
|
||||
GRPC_ERROR_UNREF(error_);
|
||||
error_ = error;
|
||||
}
|
||||
|
||||
void HealthCheckClient::Orphan() {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: shutting down", this);
|
||||
}
|
||||
{
|
||||
MutexLock lock(&mu_);
|
||||
if (on_health_changed_ != nullptr) {
|
||||
*notify_state_ = GRPC_CHANNEL_SHUTDOWN;
|
||||
notify_state_ = nullptr;
|
||||
GRPC_CLOSURE_SCHED(on_health_changed_, GRPC_ERROR_NONE);
|
||||
on_health_changed_ = nullptr;
|
||||
}
|
||||
shutting_down_ = true;
|
||||
call_state_.reset();
|
||||
if (retry_timer_callback_pending_) {
|
||||
grpc_timer_cancel(&retry_timer_);
|
||||
}
|
||||
}
|
||||
Unref(DEBUG_LOCATION, "orphan");
|
||||
}
|
||||
|
||||
void HealthCheckClient::StartCall() {
|
||||
MutexLock lock(&mu_);
|
||||
StartCallLocked();
|
||||
}
|
||||
|
||||
void HealthCheckClient::StartCallLocked() {
|
||||
if (shutting_down_) return;
|
||||
GPR_ASSERT(call_state_ == nullptr);
|
||||
SetHealthStatusLocked(GRPC_CHANNEL_CONNECTING, GRPC_ERROR_NONE);
|
||||
call_state_ = MakeOrphanable<CallState>(Ref(), interested_parties_);
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: created CallState %p", this,
|
||||
call_state_.get());
|
||||
}
|
||||
call_state_->StartCall();
|
||||
}
|
||||
|
||||
void HealthCheckClient::StartRetryTimer() {
|
||||
MutexLock lock(&mu_);
|
||||
SetHealthStatusLocked(
|
||||
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
||||
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
||||
"health check call failed; will retry after backoff"));
|
||||
grpc_millis next_try = retry_backoff_.NextAttemptTime();
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: health check call lost...", this);
|
||||
grpc_millis timeout = next_try - ExecCtx::Get()->Now();
|
||||
if (timeout > 0) {
|
||||
gpr_log(GPR_INFO,
|
||||
"HealthCheckClient %p: ... will retry in %" PRId64 "ms.", this,
|
||||
timeout);
|
||||
} else {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: ... retrying immediately.",
|
||||
this);
|
||||
}
|
||||
}
|
||||
// Ref for callback, tracked manually.
|
||||
Ref(DEBUG_LOCATION, "health_retry_timer").release();
|
||||
retry_timer_callback_pending_ = true;
|
||||
grpc_timer_init(&retry_timer_, next_try, &retry_timer_callback_);
|
||||
}
|
||||
|
||||
void HealthCheckClient::OnRetryTimer(void* arg, grpc_error* error) {
|
||||
HealthCheckClient* self = static_cast<HealthCheckClient*>(arg);
|
||||
{
|
||||
MutexLock lock(&self->mu_);
|
||||
self->retry_timer_callback_pending_ = false;
|
||||
if (!self->shutting_down_ && error == GRPC_ERROR_NONE &&
|
||||
self->call_state_ == nullptr) {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: restarting health check call",
|
||||
self);
|
||||
}
|
||||
self->StartCallLocked();
|
||||
}
|
||||
}
|
||||
self->Unref(DEBUG_LOCATION, "health_retry_timer");
|
||||
}
|
||||
|
||||
//
|
||||
// protobuf helpers
|
||||
//
|
||||
|
||||
namespace {
|
||||
|
||||
void EncodeRequest(const char* service_name,
|
||||
ManualConstructor<SliceBufferByteStream>* send_message) {
|
||||
grpc_health_v1_HealthCheckRequest request_struct;
|
||||
request_struct.has_service = true;
|
||||
snprintf(request_struct.service, sizeof(request_struct.service), "%s",
|
||||
service_name);
|
||||
pb_ostream_t ostream;
|
||||
memset(&ostream, 0, sizeof(ostream));
|
||||
pb_encode(&ostream, grpc_health_v1_HealthCheckRequest_fields,
|
||||
&request_struct);
|
||||
grpc_slice request_slice = GRPC_SLICE_MALLOC(ostream.bytes_written);
|
||||
ostream = pb_ostream_from_buffer(GRPC_SLICE_START_PTR(request_slice),
|
||||
GRPC_SLICE_LENGTH(request_slice));
|
||||
GPR_ASSERT(pb_encode(&ostream, grpc_health_v1_HealthCheckRequest_fields,
|
||||
&request_struct) != 0);
|
||||
grpc_slice_buffer slice_buffer;
|
||||
grpc_slice_buffer_init(&slice_buffer);
|
||||
grpc_slice_buffer_add(&slice_buffer, request_slice);
|
||||
send_message->Init(&slice_buffer, 0);
|
||||
grpc_slice_buffer_destroy_internal(&slice_buffer);
|
||||
}
|
||||
|
||||
// Returns true if healthy.
|
||||
// If there was an error parsing the response, sets *error and returns false.
|
||||
bool DecodeResponse(grpc_slice_buffer* slice_buffer, grpc_error** error) {
|
||||
// If message is empty, assume unhealthy.
|
||||
if (slice_buffer->length == 0) {
|
||||
*error =
|
||||
GRPC_ERROR_CREATE_FROM_STATIC_STRING("health check response was empty");
|
||||
return false;
|
||||
}
|
||||
// Concatenate the slices to form a single string.
|
||||
UniquePtr<uint8_t> recv_message_deleter;
|
||||
uint8_t* recv_message;
|
||||
if (slice_buffer->count == 1) {
|
||||
recv_message = GRPC_SLICE_START_PTR(slice_buffer->slices[0]);
|
||||
} else {
|
||||
recv_message = static_cast<uint8_t*>(gpr_malloc(slice_buffer->length));
|
||||
recv_message_deleter.reset(recv_message);
|
||||
size_t offset = 0;
|
||||
for (size_t i = 0; i < slice_buffer->count; ++i) {
|
||||
memcpy(recv_message + offset,
|
||||
GRPC_SLICE_START_PTR(slice_buffer->slices[i]),
|
||||
GRPC_SLICE_LENGTH(slice_buffer->slices[i]));
|
||||
offset += GRPC_SLICE_LENGTH(slice_buffer->slices[i]);
|
||||
}
|
||||
}
|
||||
// Deserialize message.
|
||||
grpc_health_v1_HealthCheckResponse response_struct;
|
||||
pb_istream_t istream =
|
||||
pb_istream_from_buffer(recv_message, slice_buffer->length);
|
||||
if (!pb_decode(&istream, grpc_health_v1_HealthCheckResponse_fields,
|
||||
&response_struct)) {
|
||||
// Can't parse message; assume unhealthy.
|
||||
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
||||
"cannot parse health check response");
|
||||
return false;
|
||||
}
|
||||
if (!response_struct.has_status) {
|
||||
// Field not present; assume unhealthy.
|
||||
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
||||
"status field not present in health check response");
|
||||
return false;
|
||||
}
|
||||
return response_struct.status ==
|
||||
grpc_health_v1_HealthCheckResponse_ServingStatus_SERVING;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
//
|
||||
// HealthCheckClient::CallState
|
||||
//
|
||||
|
||||
HealthCheckClient::CallState::CallState(
|
||||
RefCountedPtr<HealthCheckClient> health_check_client,
|
||||
grpc_pollset_set* interested_parties)
|
||||
: health_check_client_(std::move(health_check_client)),
|
||||
pollent_(grpc_polling_entity_create_from_pollset_set(interested_parties)),
|
||||
arena_(Arena::Create(health_check_client_->connected_subchannel_
|
||||
->GetInitialCallSizeEstimate(0))),
|
||||
payload_(context_) {}
|
||||
|
||||
HealthCheckClient::CallState::~CallState() {
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO, "HealthCheckClient %p: destroying CallState %p",
|
||||
health_check_client_.get(), this);
|
||||
}
|
||||
for (size_t i = 0; i < GRPC_CONTEXT_COUNT; i++) {
|
||||
if (context_[i].destroy != nullptr) {
|
||||
context_[i].destroy(context_[i].value);
|
||||
}
|
||||
}
|
||||
// Unset the call combiner cancellation closure. This has the
|
||||
// effect of scheduling the previously set cancellation closure, if
|
||||
// any, so that it can release any internal references it may be
|
||||
// holding to the call stack. Also flush the closures on exec_ctx so that
|
||||
// filters that schedule cancel notification closures on exec_ctx do not
|
||||
// need to take a ref of the call stack to guarantee closure liveness.
|
||||
call_combiner_.SetNotifyOnCancel(nullptr);
|
||||
ExecCtx::Get()->Flush();
|
||||
arena_->Destroy();
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::Orphan() {
|
||||
call_combiner_.Cancel(GRPC_ERROR_CANCELLED);
|
||||
Cancel();
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::StartCall() {
|
||||
SubchannelCall::Args args = {
|
||||
health_check_client_->connected_subchannel_,
|
||||
&pollent_,
|
||||
GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH,
|
||||
gpr_now(GPR_CLOCK_MONOTONIC), // start_time
|
||||
GRPC_MILLIS_INF_FUTURE, // deadline
|
||||
arena_,
|
||||
context_,
|
||||
&call_combiner_,
|
||||
0, // parent_data_size
|
||||
};
|
||||
grpc_error* error = GRPC_ERROR_NONE;
|
||||
call_ = SubchannelCall::Create(std::move(args), &error).release();
|
||||
// Register after-destruction callback.
|
||||
GRPC_CLOSURE_INIT(&after_call_stack_destruction_, AfterCallStackDestruction,
|
||||
this, grpc_schedule_on_exec_ctx);
|
||||
call_->SetAfterCallStackDestroy(&after_call_stack_destruction_);
|
||||
// Check if creation failed.
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
gpr_log(GPR_ERROR,
|
||||
"HealthCheckClient %p CallState %p: error creating health "
|
||||
"checking call on subchannel (%s); will retry",
|
||||
health_check_client_.get(), this, grpc_error_string(error));
|
||||
GRPC_ERROR_UNREF(error);
|
||||
// Schedule instead of running directly, since we must not be
|
||||
// holding health_check_client_->mu_ when CallEnded() is called.
|
||||
call_->Ref(DEBUG_LOCATION, "call_end_closure").release();
|
||||
GRPC_CLOSURE_SCHED(
|
||||
GRPC_CLOSURE_INIT(&batch_.handler_private.closure, CallEndedRetry, this,
|
||||
grpc_schedule_on_exec_ctx),
|
||||
GRPC_ERROR_NONE);
|
||||
return;
|
||||
}
|
||||
// Initialize payload and batch.
|
||||
payload_.context = context_;
|
||||
batch_.payload = &payload_;
|
||||
// on_complete callback takes ref, handled manually.
|
||||
call_->Ref(DEBUG_LOCATION, "on_complete").release();
|
||||
batch_.on_complete = GRPC_CLOSURE_INIT(&on_complete_, OnComplete, this,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
// Add send_initial_metadata op.
|
||||
grpc_metadata_batch_init(&send_initial_metadata_);
|
||||
error = grpc_metadata_batch_add_head(
|
||||
&send_initial_metadata_, &path_metadata_storage_,
|
||||
grpc_mdelem_from_slices(
|
||||
GRPC_MDSTR_PATH,
|
||||
GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH));
|
||||
GPR_ASSERT(error == GRPC_ERROR_NONE);
|
||||
payload_.send_initial_metadata.send_initial_metadata =
|
||||
&send_initial_metadata_;
|
||||
payload_.send_initial_metadata.send_initial_metadata_flags = 0;
|
||||
payload_.send_initial_metadata.peer_string = nullptr;
|
||||
batch_.send_initial_metadata = true;
|
||||
// Add send_message op.
|
||||
EncodeRequest(health_check_client_->service_name_, &send_message_);
|
||||
payload_.send_message.send_message.reset(send_message_.get());
|
||||
batch_.send_message = true;
|
||||
// Add send_trailing_metadata op.
|
||||
grpc_metadata_batch_init(&send_trailing_metadata_);
|
||||
payload_.send_trailing_metadata.send_trailing_metadata =
|
||||
&send_trailing_metadata_;
|
||||
batch_.send_trailing_metadata = true;
|
||||
// Add recv_initial_metadata op.
|
||||
grpc_metadata_batch_init(&recv_initial_metadata_);
|
||||
payload_.recv_initial_metadata.recv_initial_metadata =
|
||||
&recv_initial_metadata_;
|
||||
payload_.recv_initial_metadata.recv_flags = nullptr;
|
||||
payload_.recv_initial_metadata.trailing_metadata_available = nullptr;
|
||||
payload_.recv_initial_metadata.peer_string = nullptr;
|
||||
// recv_initial_metadata_ready callback takes ref, handled manually.
|
||||
call_->Ref(DEBUG_LOCATION, "recv_initial_metadata_ready").release();
|
||||
payload_.recv_initial_metadata.recv_initial_metadata_ready =
|
||||
GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
|
||||
this, grpc_schedule_on_exec_ctx);
|
||||
batch_.recv_initial_metadata = true;
|
||||
// Add recv_message op.
|
||||
payload_.recv_message.recv_message = &recv_message_;
|
||||
// recv_message callback takes ref, handled manually.
|
||||
call_->Ref(DEBUG_LOCATION, "recv_message_ready").release();
|
||||
payload_.recv_message.recv_message_ready = GRPC_CLOSURE_INIT(
|
||||
&recv_message_ready_, RecvMessageReady, this, grpc_schedule_on_exec_ctx);
|
||||
batch_.recv_message = true;
|
||||
// Start batch.
|
||||
StartBatch(&batch_);
|
||||
// Initialize recv_trailing_metadata batch.
|
||||
recv_trailing_metadata_batch_.payload = &payload_;
|
||||
// Add recv_trailing_metadata op.
|
||||
grpc_metadata_batch_init(&recv_trailing_metadata_);
|
||||
payload_.recv_trailing_metadata.recv_trailing_metadata =
|
||||
&recv_trailing_metadata_;
|
||||
payload_.recv_trailing_metadata.collect_stats = &collect_stats_;
|
||||
// This callback signals the end of the call, so it relies on the
|
||||
// initial ref instead of taking a new ref. When it's invoked, the
|
||||
// initial ref is released.
|
||||
payload_.recv_trailing_metadata.recv_trailing_metadata_ready =
|
||||
GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready_,
|
||||
RecvTrailingMetadataReady, this,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
recv_trailing_metadata_batch_.recv_trailing_metadata = true;
|
||||
// Start recv_trailing_metadata batch.
|
||||
StartBatch(&recv_trailing_metadata_batch_);
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::StartBatchInCallCombiner(void* arg,
|
||||
grpc_error* error) {
|
||||
grpc_transport_stream_op_batch* batch =
|
||||
static_cast<grpc_transport_stream_op_batch*>(arg);
|
||||
SubchannelCall* call =
|
||||
static_cast<SubchannelCall*>(batch->handler_private.extra_arg);
|
||||
call->StartTransportStreamOpBatch(batch);
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::StartBatch(
|
||||
grpc_transport_stream_op_batch* batch) {
|
||||
batch->handler_private.extra_arg = call_;
|
||||
GRPC_CLOSURE_INIT(&batch->handler_private.closure, StartBatchInCallCombiner,
|
||||
batch, grpc_schedule_on_exec_ctx);
|
||||
GRPC_CALL_COMBINER_START(&call_combiner_, &batch->handler_private.closure,
|
||||
GRPC_ERROR_NONE, "start_subchannel_batch");
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::AfterCallStackDestruction(
|
||||
void* arg, grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
Delete(self);
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::OnCancelComplete(void* arg,
|
||||
grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "health_cancel");
|
||||
self->call_->Unref(DEBUG_LOCATION, "cancel");
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::StartCancel(void* arg, grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
auto* batch = grpc_make_transport_stream_op(
|
||||
GRPC_CLOSURE_CREATE(OnCancelComplete, self, grpc_schedule_on_exec_ctx));
|
||||
batch->cancel_stream = true;
|
||||
batch->payload->cancel_stream.cancel_error = GRPC_ERROR_CANCELLED;
|
||||
self->call_->StartTransportStreamOpBatch(batch);
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::Cancel() {
|
||||
bool expected = false;
|
||||
if (cancelled_.CompareExchangeStrong(&expected, true, MemoryOrder::ACQ_REL,
|
||||
MemoryOrder::ACQUIRE)) {
|
||||
call_->Ref(DEBUG_LOCATION, "cancel").release();
|
||||
GRPC_CALL_COMBINER_START(
|
||||
&call_combiner_,
|
||||
GRPC_CLOSURE_CREATE(StartCancel, this, grpc_schedule_on_exec_ctx),
|
||||
GRPC_ERROR_NONE, "health_cancel");
|
||||
}
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::OnComplete(void* arg, grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "on_complete");
|
||||
grpc_metadata_batch_destroy(&self->send_initial_metadata_);
|
||||
grpc_metadata_batch_destroy(&self->send_trailing_metadata_);
|
||||
self->call_->Unref(DEBUG_LOCATION, "on_complete");
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::RecvInitialMetadataReady(void* arg,
|
||||
grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "recv_initial_metadata_ready");
|
||||
grpc_metadata_batch_destroy(&self->recv_initial_metadata_);
|
||||
self->call_->Unref(DEBUG_LOCATION, "recv_initial_metadata_ready");
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::DoneReadingRecvMessage(grpc_error* error) {
|
||||
recv_message_.reset();
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
GRPC_ERROR_UNREF(error);
|
||||
Cancel();
|
||||
grpc_slice_buffer_destroy_internal(&recv_message_buffer_);
|
||||
call_->Unref(DEBUG_LOCATION, "recv_message_ready");
|
||||
return;
|
||||
}
|
||||
const bool healthy = DecodeResponse(&recv_message_buffer_, &error);
|
||||
const grpc_connectivity_state state =
|
||||
healthy ? GRPC_CHANNEL_READY : GRPC_CHANNEL_TRANSIENT_FAILURE;
|
||||
if (error == GRPC_ERROR_NONE && !healthy) {
|
||||
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("backend unhealthy");
|
||||
}
|
||||
health_check_client_->SetHealthStatus(state, error);
|
||||
seen_response_.Store(true, MemoryOrder::RELEASE);
|
||||
grpc_slice_buffer_destroy_internal(&recv_message_buffer_);
|
||||
// Start another recv_message batch.
|
||||
// This re-uses the ref we're holding.
|
||||
// Note: Can't just reuse batch_ here, since we don't know that all
|
||||
// callbacks from the original batch have completed yet.
|
||||
recv_message_batch_.payload = &payload_;
|
||||
payload_.recv_message.recv_message = &recv_message_;
|
||||
payload_.recv_message.recv_message_ready = GRPC_CLOSURE_INIT(
|
||||
&recv_message_ready_, RecvMessageReady, this, grpc_schedule_on_exec_ctx);
|
||||
recv_message_batch_.recv_message = true;
|
||||
StartBatch(&recv_message_batch_);
|
||||
}
|
||||
|
||||
grpc_error* HealthCheckClient::CallState::PullSliceFromRecvMessage() {
|
||||
grpc_slice slice;
|
||||
grpc_error* error = recv_message_->Pull(&slice);
|
||||
if (error == GRPC_ERROR_NONE) {
|
||||
grpc_slice_buffer_add(&recv_message_buffer_, slice);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::ContinueReadingRecvMessage() {
|
||||
while (recv_message_->Next(SIZE_MAX, &recv_message_ready_)) {
|
||||
grpc_error* error = PullSliceFromRecvMessage();
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
DoneReadingRecvMessage(error);
|
||||
return;
|
||||
}
|
||||
if (recv_message_buffer_.length == recv_message_->length()) {
|
||||
DoneReadingRecvMessage(GRPC_ERROR_NONE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::OnByteStreamNext(void* arg,
|
||||
grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
self->DoneReadingRecvMessage(GRPC_ERROR_REF(error));
|
||||
return;
|
||||
}
|
||||
error = self->PullSliceFromRecvMessage();
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
self->DoneReadingRecvMessage(error);
|
||||
return;
|
||||
}
|
||||
if (self->recv_message_buffer_.length == self->recv_message_->length()) {
|
||||
self->DoneReadingRecvMessage(GRPC_ERROR_NONE);
|
||||
} else {
|
||||
self->ContinueReadingRecvMessage();
|
||||
}
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::RecvMessageReady(void* arg,
|
||||
grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
GRPC_CALL_COMBINER_STOP(&self->call_combiner_, "recv_message_ready");
|
||||
if (self->recv_message_ == nullptr) {
|
||||
self->call_->Unref(DEBUG_LOCATION, "recv_message_ready");
|
||||
return;
|
||||
}
|
||||
grpc_slice_buffer_init(&self->recv_message_buffer_);
|
||||
GRPC_CLOSURE_INIT(&self->recv_message_ready_, OnByteStreamNext, self,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
self->ContinueReadingRecvMessage();
|
||||
// Ref will continue to be held until we finish draining the byte stream.
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::RecvTrailingMetadataReady(
|
||||
void* arg, grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
GRPC_CALL_COMBINER_STOP(&self->call_combiner_,
|
||||
"recv_trailing_metadata_ready");
|
||||
// Get call status.
|
||||
grpc_status_code status = GRPC_STATUS_UNKNOWN;
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
grpc_error_get_status(error, GRPC_MILLIS_INF_FUTURE, &status,
|
||||
nullptr /* slice */, nullptr /* http_error */,
|
||||
nullptr /* error_string */);
|
||||
} else if (self->recv_trailing_metadata_.idx.named.grpc_status != nullptr) {
|
||||
status = grpc_get_status_code_from_metadata(
|
||||
self->recv_trailing_metadata_.idx.named.grpc_status->md);
|
||||
}
|
||||
if (GRPC_TRACE_FLAG_ENABLED(grpc_health_check_client_trace)) {
|
||||
gpr_log(GPR_INFO,
|
||||
"HealthCheckClient %p CallState %p: health watch failed with "
|
||||
"status %d",
|
||||
self->health_check_client_.get(), self, status);
|
||||
}
|
||||
// Clean up.
|
||||
grpc_metadata_batch_destroy(&self->recv_trailing_metadata_);
|
||||
// For status UNIMPLEMENTED, give up and assume always healthy.
|
||||
bool retry = true;
|
||||
if (status == GRPC_STATUS_UNIMPLEMENTED) {
|
||||
static const char kErrorMessage[] =
|
||||
"health checking Watch method returned UNIMPLEMENTED; "
|
||||
"disabling health checks but assuming server is healthy";
|
||||
gpr_log(GPR_ERROR, kErrorMessage);
|
||||
if (self->health_check_client_->channelz_node_ != nullptr) {
|
||||
self->health_check_client_->channelz_node_->AddTraceEvent(
|
||||
channelz::ChannelTrace::Error,
|
||||
grpc_slice_from_static_string(kErrorMessage));
|
||||
}
|
||||
self->health_check_client_->SetHealthStatus(GRPC_CHANNEL_READY,
|
||||
GRPC_ERROR_NONE);
|
||||
retry = false;
|
||||
}
|
||||
self->CallEnded(retry);
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::CallEndedRetry(void* arg,
|
||||
grpc_error* error) {
|
||||
HealthCheckClient::CallState* self =
|
||||
static_cast<HealthCheckClient::CallState*>(arg);
|
||||
self->CallEnded(true /* retry */);
|
||||
self->call_->Unref(DEBUG_LOCATION, "call_end_closure");
|
||||
}
|
||||
|
||||
void HealthCheckClient::CallState::CallEnded(bool retry) {
|
||||
// If this CallState is still in use, this call ended because of a failure,
|
||||
// so we need to stop using it and optionally create a new one.
|
||||
// Otherwise, we have deliberately ended this call, and no further action
|
||||
// is required.
|
||||
if (this == health_check_client_->call_state_.get()) {
|
||||
health_check_client_->call_state_.reset();
|
||||
if (retry) {
|
||||
GPR_ASSERT(!health_check_client_->shutting_down_);
|
||||
if (seen_response_.Load(MemoryOrder::ACQUIRE)) {
|
||||
// If the call fails after we've gotten a successful response, reset
|
||||
// the backoff and restart the call immediately.
|
||||
health_check_client_->retry_backoff_.Reset();
|
||||
health_check_client_->StartCall();
|
||||
} else {
|
||||
// If the call failed without receiving any messages, retry later.
|
||||
health_check_client_->StartRetryTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
// When the last ref to the call stack goes away, the CallState object
|
||||
// will be automatically destroyed.
|
||||
call_->Unref(DEBUG_LOCATION, "call_ended");
|
||||
}
|
||||
|
||||
} // namespace grpc_core
|
183
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health_check_client.h
generated
vendored
Normal file
183
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/health/health_check_client.h
generated
vendored
Normal file
@ -0,0 +1,183 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_HEALTH_HEALTH_CHECK_CLIENT_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_HEALTH_HEALTH_CHECK_CLIENT_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/grpc.h>
|
||||
#include <grpc/support/sync.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel_channelz.h"
|
||||
#include "src/core/ext/filters/client_channel/subchannel.h"
|
||||
#include "src/core/lib/backoff/backoff.h"
|
||||
#include "src/core/lib/gprpp/arena.h"
|
||||
#include "src/core/lib/gprpp/atomic.h"
|
||||
#include "src/core/lib/gprpp/orphanable.h"
|
||||
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
||||
#include "src/core/lib/gprpp/sync.h"
|
||||
#include "src/core/lib/iomgr/call_combiner.h"
|
||||
#include "src/core/lib/iomgr/closure.h"
|
||||
#include "src/core/lib/iomgr/polling_entity.h"
|
||||
#include "src/core/lib/iomgr/timer.h"
|
||||
#include "src/core/lib/transport/byte_stream.h"
|
||||
#include "src/core/lib/transport/metadata_batch.h"
|
||||
#include "src/core/lib/transport/transport.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
class HealthCheckClient : public InternallyRefCounted<HealthCheckClient> {
|
||||
public:
|
||||
HealthCheckClient(const char* service_name,
|
||||
RefCountedPtr<ConnectedSubchannel> connected_subchannel,
|
||||
grpc_pollset_set* interested_parties,
|
||||
RefCountedPtr<channelz::SubchannelNode> channelz_node);
|
||||
|
||||
~HealthCheckClient();
|
||||
|
||||
// When the health state changes from *state, sets *state to the new
|
||||
// value and schedules closure.
|
||||
// Only one closure can be outstanding at a time.
|
||||
void NotifyOnHealthChange(grpc_connectivity_state* state,
|
||||
grpc_closure* closure);
|
||||
|
||||
void Orphan() override;
|
||||
|
||||
private:
|
||||
// Contains a call to the backend and all the data related to the call.
|
||||
class CallState : public Orphanable {
|
||||
public:
|
||||
CallState(RefCountedPtr<HealthCheckClient> health_check_client,
|
||||
grpc_pollset_set* interested_parties_);
|
||||
~CallState();
|
||||
|
||||
void Orphan() override;
|
||||
|
||||
void StartCall();
|
||||
|
||||
private:
|
||||
void Cancel();
|
||||
|
||||
void StartBatch(grpc_transport_stream_op_batch* batch);
|
||||
static void StartBatchInCallCombiner(void* arg, grpc_error* error);
|
||||
|
||||
static void CallEndedRetry(void* arg, grpc_error* error);
|
||||
void CallEnded(bool retry);
|
||||
|
||||
static void OnComplete(void* arg, grpc_error* error);
|
||||
static void RecvInitialMetadataReady(void* arg, grpc_error* error);
|
||||
static void RecvMessageReady(void* arg, grpc_error* error);
|
||||
static void RecvTrailingMetadataReady(void* arg, grpc_error* error);
|
||||
static void StartCancel(void* arg, grpc_error* error);
|
||||
static void OnCancelComplete(void* arg, grpc_error* error);
|
||||
|
||||
static void OnByteStreamNext(void* arg, grpc_error* error);
|
||||
void ContinueReadingRecvMessage();
|
||||
grpc_error* PullSliceFromRecvMessage();
|
||||
void DoneReadingRecvMessage(grpc_error* error);
|
||||
|
||||
static void AfterCallStackDestruction(void* arg, grpc_error* error);
|
||||
|
||||
RefCountedPtr<HealthCheckClient> health_check_client_;
|
||||
grpc_polling_entity pollent_;
|
||||
|
||||
Arena* arena_;
|
||||
grpc_core::CallCombiner call_combiner_;
|
||||
grpc_call_context_element context_[GRPC_CONTEXT_COUNT] = {};
|
||||
|
||||
// The streaming call to the backend. Always non-null.
|
||||
// Refs are tracked manually; when the last ref is released, the
|
||||
// CallState object will be automatically destroyed.
|
||||
SubchannelCall* call_;
|
||||
|
||||
grpc_transport_stream_op_batch_payload payload_;
|
||||
grpc_transport_stream_op_batch batch_;
|
||||
grpc_transport_stream_op_batch recv_message_batch_;
|
||||
grpc_transport_stream_op_batch recv_trailing_metadata_batch_;
|
||||
|
||||
grpc_closure on_complete_;
|
||||
|
||||
// send_initial_metadata
|
||||
grpc_metadata_batch send_initial_metadata_;
|
||||
grpc_linked_mdelem path_metadata_storage_;
|
||||
|
||||
// send_message
|
||||
ManualConstructor<SliceBufferByteStream> send_message_;
|
||||
|
||||
// send_trailing_metadata
|
||||
grpc_metadata_batch send_trailing_metadata_;
|
||||
|
||||
// recv_initial_metadata
|
||||
grpc_metadata_batch recv_initial_metadata_;
|
||||
grpc_closure recv_initial_metadata_ready_;
|
||||
|
||||
// recv_message
|
||||
OrphanablePtr<ByteStream> recv_message_;
|
||||
grpc_closure recv_message_ready_;
|
||||
grpc_slice_buffer recv_message_buffer_;
|
||||
Atomic<bool> seen_response_{false};
|
||||
|
||||
// recv_trailing_metadata
|
||||
grpc_metadata_batch recv_trailing_metadata_;
|
||||
grpc_transport_stream_stats collect_stats_;
|
||||
grpc_closure recv_trailing_metadata_ready_;
|
||||
|
||||
// True if the cancel_stream batch has been started.
|
||||
Atomic<bool> cancelled_{false};
|
||||
|
||||
// Closure for call stack destruction.
|
||||
grpc_closure after_call_stack_destruction_;
|
||||
};
|
||||
|
||||
void StartCall();
|
||||
void StartCallLocked(); // Requires holding mu_.
|
||||
|
||||
void StartRetryTimer();
|
||||
static void OnRetryTimer(void* arg, grpc_error* error);
|
||||
|
||||
void SetHealthStatus(grpc_connectivity_state state, grpc_error* error);
|
||||
void SetHealthStatusLocked(grpc_connectivity_state state,
|
||||
grpc_error* error); // Requires holding mu_.
|
||||
|
||||
const char* service_name_; // Do not own.
|
||||
RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
|
||||
grpc_pollset_set* interested_parties_; // Do not own.
|
||||
RefCountedPtr<channelz::SubchannelNode> channelz_node_;
|
||||
|
||||
Mutex mu_;
|
||||
grpc_connectivity_state state_ = GRPC_CHANNEL_CONNECTING;
|
||||
grpc_error* error_ = GRPC_ERROR_NONE;
|
||||
grpc_connectivity_state* notify_state_ = nullptr;
|
||||
grpc_closure* on_health_changed_ = nullptr;
|
||||
bool shutting_down_ = false;
|
||||
|
||||
// The data associated with the current health check call. It holds a ref
|
||||
// to this HealthCheckClient object.
|
||||
OrphanablePtr<CallState> call_state_;
|
||||
|
||||
// Call retry state.
|
||||
BackOff retry_backoff_;
|
||||
grpc_timer retry_timer_;
|
||||
grpc_closure retry_timer_callback_;
|
||||
bool retry_timer_callback_pending_ = false;
|
||||
};
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_HEALTH_HEALTH_CHECK_CLIENT_H */
|
360
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_connect_handshaker.cc
generated
vendored
Normal file
360
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_connect_handshaker.cc
generated
vendored
Normal file
@ -0,0 +1,360 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/slice_buffer.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel.h"
|
||||
#include "src/core/ext/filters/client_channel/resolver_registry.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/channel/handshaker_registry.h"
|
||||
#include "src/core/lib/gpr/string.h"
|
||||
#include "src/core/lib/gprpp/sync.h"
|
||||
#include "src/core/lib/http/format_request.h"
|
||||
#include "src/core/lib/http/parser.h"
|
||||
#include "src/core/lib/slice/slice_internal.h"
|
||||
#include "src/core/lib/uri/uri_parser.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
namespace {
|
||||
|
||||
class HttpConnectHandshaker : public Handshaker {
|
||||
public:
|
||||
HttpConnectHandshaker();
|
||||
void Shutdown(grpc_error* why) override;
|
||||
void DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
||||
grpc_closure* on_handshake_done,
|
||||
HandshakerArgs* args) override;
|
||||
const char* name() const override { return "http_connect"; }
|
||||
|
||||
private:
|
||||
virtual ~HttpConnectHandshaker();
|
||||
void CleanupArgsForFailureLocked();
|
||||
void HandshakeFailedLocked(grpc_error* error);
|
||||
static void OnWriteDone(void* arg, grpc_error* error);
|
||||
static void OnReadDone(void* arg, grpc_error* error);
|
||||
|
||||
gpr_mu mu_;
|
||||
|
||||
bool is_shutdown_ = false;
|
||||
// Endpoint and read buffer to destroy after a shutdown.
|
||||
grpc_endpoint* endpoint_to_destroy_ = nullptr;
|
||||
grpc_slice_buffer* read_buffer_to_destroy_ = nullptr;
|
||||
|
||||
// State saved while performing the handshake.
|
||||
HandshakerArgs* args_ = nullptr;
|
||||
grpc_closure* on_handshake_done_ = nullptr;
|
||||
|
||||
// Objects for processing the HTTP CONNECT request and response.
|
||||
grpc_slice_buffer write_buffer_;
|
||||
grpc_closure request_done_closure_;
|
||||
grpc_closure response_read_closure_;
|
||||
grpc_http_parser http_parser_;
|
||||
grpc_http_response http_response_;
|
||||
};
|
||||
|
||||
HttpConnectHandshaker::~HttpConnectHandshaker() {
|
||||
gpr_mu_destroy(&mu_);
|
||||
if (endpoint_to_destroy_ != nullptr) {
|
||||
grpc_endpoint_destroy(endpoint_to_destroy_);
|
||||
}
|
||||
if (read_buffer_to_destroy_ != nullptr) {
|
||||
grpc_slice_buffer_destroy_internal(read_buffer_to_destroy_);
|
||||
gpr_free(read_buffer_to_destroy_);
|
||||
}
|
||||
grpc_slice_buffer_destroy_internal(&write_buffer_);
|
||||
grpc_http_parser_destroy(&http_parser_);
|
||||
grpc_http_response_destroy(&http_response_);
|
||||
}
|
||||
|
||||
// Set args fields to nullptr, saving the endpoint and read buffer for
|
||||
// later destruction.
|
||||
void HttpConnectHandshaker::CleanupArgsForFailureLocked() {
|
||||
endpoint_to_destroy_ = args_->endpoint;
|
||||
args_->endpoint = nullptr;
|
||||
read_buffer_to_destroy_ = args_->read_buffer;
|
||||
args_->read_buffer = nullptr;
|
||||
grpc_channel_args_destroy(args_->args);
|
||||
args_->args = nullptr;
|
||||
}
|
||||
|
||||
// If the handshake failed or we're shutting down, clean up and invoke the
|
||||
// callback with the error.
|
||||
void HttpConnectHandshaker::HandshakeFailedLocked(grpc_error* error) {
|
||||
if (error == GRPC_ERROR_NONE) {
|
||||
// If we were shut down after an endpoint operation succeeded but
|
||||
// before the endpoint callback was invoked, we need to generate our
|
||||
// own error.
|
||||
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshaker shutdown");
|
||||
}
|
||||
if (!is_shutdown_) {
|
||||
// TODO(ctiller): It is currently necessary to shutdown endpoints
|
||||
// before destroying them, even if we know that there are no
|
||||
// pending read/write callbacks. This should be fixed, at which
|
||||
// point this can be removed.
|
||||
grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(error));
|
||||
// Not shutting down, so the handshake failed. Clean up before
|
||||
// invoking the callback.
|
||||
CleanupArgsForFailureLocked();
|
||||
// Set shutdown to true so that subsequent calls to
|
||||
// http_connect_handshaker_shutdown() do nothing.
|
||||
is_shutdown_ = true;
|
||||
}
|
||||
// Invoke callback.
|
||||
GRPC_CLOSURE_SCHED(on_handshake_done_, error);
|
||||
}
|
||||
|
||||
// Callback invoked when finished writing HTTP CONNECT request.
|
||||
void HttpConnectHandshaker::OnWriteDone(void* arg, grpc_error* error) {
|
||||
auto* handshaker = static_cast<HttpConnectHandshaker*>(arg);
|
||||
gpr_mu_lock(&handshaker->mu_);
|
||||
if (error != GRPC_ERROR_NONE || handshaker->is_shutdown_) {
|
||||
// If the write failed or we're shutting down, clean up and invoke the
|
||||
// callback with the error.
|
||||
handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
|
||||
gpr_mu_unlock(&handshaker->mu_);
|
||||
handshaker->Unref();
|
||||
} else {
|
||||
// Otherwise, read the response.
|
||||
// The read callback inherits our ref to the handshaker.
|
||||
grpc_endpoint_read(handshaker->args_->endpoint,
|
||||
handshaker->args_->read_buffer,
|
||||
&handshaker->response_read_closure_, /*urgent=*/true);
|
||||
gpr_mu_unlock(&handshaker->mu_);
|
||||
}
|
||||
}
|
||||
|
||||
// Callback invoked for reading HTTP CONNECT response.
|
||||
void HttpConnectHandshaker::OnReadDone(void* arg, grpc_error* error) {
|
||||
auto* handshaker = static_cast<HttpConnectHandshaker*>(arg);
|
||||
|
||||
gpr_mu_lock(&handshaker->mu_);
|
||||
if (error != GRPC_ERROR_NONE || handshaker->is_shutdown_) {
|
||||
// If the read failed or we're shutting down, clean up and invoke the
|
||||
// callback with the error.
|
||||
handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
|
||||
goto done;
|
||||
}
|
||||
// Add buffer to parser.
|
||||
for (size_t i = 0; i < handshaker->args_->read_buffer->count; ++i) {
|
||||
if (GRPC_SLICE_LENGTH(handshaker->args_->read_buffer->slices[i]) > 0) {
|
||||
size_t body_start_offset = 0;
|
||||
error = grpc_http_parser_parse(&handshaker->http_parser_,
|
||||
handshaker->args_->read_buffer->slices[i],
|
||||
&body_start_offset);
|
||||
if (error != GRPC_ERROR_NONE) {
|
||||
handshaker->HandshakeFailedLocked(error);
|
||||
goto done;
|
||||
}
|
||||
if (handshaker->http_parser_.state == GRPC_HTTP_BODY) {
|
||||
// Remove the data we've already read from the read buffer,
|
||||
// leaving only the leftover bytes (if any).
|
||||
grpc_slice_buffer tmp_buffer;
|
||||
grpc_slice_buffer_init(&tmp_buffer);
|
||||
if (body_start_offset <
|
||||
GRPC_SLICE_LENGTH(handshaker->args_->read_buffer->slices[i])) {
|
||||
grpc_slice_buffer_add(
|
||||
&tmp_buffer,
|
||||
grpc_slice_split_tail(&handshaker->args_->read_buffer->slices[i],
|
||||
body_start_offset));
|
||||
}
|
||||
grpc_slice_buffer_addn(&tmp_buffer,
|
||||
&handshaker->args_->read_buffer->slices[i + 1],
|
||||
handshaker->args_->read_buffer->count - i - 1);
|
||||
grpc_slice_buffer_swap(handshaker->args_->read_buffer, &tmp_buffer);
|
||||
grpc_slice_buffer_destroy_internal(&tmp_buffer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// If we're not done reading the response, read more data.
|
||||
// TODO(roth): In practice, I suspect that the response to a CONNECT
|
||||
// request will never include a body, in which case this check is
|
||||
// sufficient. However, the language of RFC-2817 doesn't explicitly
|
||||
// forbid the response from including a body. If there is a body,
|
||||
// it's possible that we might have parsed part but not all of the
|
||||
// body, in which case this check will cause us to fail to parse the
|
||||
// remainder of the body. If that ever becomes an issue, we may
|
||||
// need to fix the HTTP parser to understand when the body is
|
||||
// complete (e.g., handling chunked transfer encoding or looking
|
||||
// at the Content-Length: header).
|
||||
if (handshaker->http_parser_.state != GRPC_HTTP_BODY) {
|
||||
grpc_slice_buffer_reset_and_unref_internal(handshaker->args_->read_buffer);
|
||||
grpc_endpoint_read(handshaker->args_->endpoint,
|
||||
handshaker->args_->read_buffer,
|
||||
&handshaker->response_read_closure_, /*urgent=*/true);
|
||||
gpr_mu_unlock(&handshaker->mu_);
|
||||
return;
|
||||
}
|
||||
// Make sure we got a 2xx response.
|
||||
if (handshaker->http_response_.status < 200 ||
|
||||
handshaker->http_response_.status >= 300) {
|
||||
char* msg;
|
||||
gpr_asprintf(&msg, "HTTP proxy returned response code %d",
|
||||
handshaker->http_response_.status);
|
||||
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
|
||||
gpr_free(msg);
|
||||
handshaker->HandshakeFailedLocked(error);
|
||||
goto done;
|
||||
}
|
||||
// Success. Invoke handshake-done callback.
|
||||
GRPC_CLOSURE_SCHED(handshaker->on_handshake_done_, error);
|
||||
done:
|
||||
// Set shutdown to true so that subsequent calls to
|
||||
// http_connect_handshaker_shutdown() do nothing.
|
||||
handshaker->is_shutdown_ = true;
|
||||
gpr_mu_unlock(&handshaker->mu_);
|
||||
handshaker->Unref();
|
||||
}
|
||||
|
||||
//
|
||||
// Public handshaker methods
|
||||
//
|
||||
|
||||
void HttpConnectHandshaker::Shutdown(grpc_error* why) {
|
||||
gpr_mu_lock(&mu_);
|
||||
if (!is_shutdown_) {
|
||||
is_shutdown_ = true;
|
||||
grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(why));
|
||||
CleanupArgsForFailureLocked();
|
||||
}
|
||||
gpr_mu_unlock(&mu_);
|
||||
GRPC_ERROR_UNREF(why);
|
||||
}
|
||||
|
||||
void HttpConnectHandshaker::DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
||||
grpc_closure* on_handshake_done,
|
||||
HandshakerArgs* args) {
|
||||
// Check for HTTP CONNECT channel arg.
|
||||
// If not found, invoke on_handshake_done without doing anything.
|
||||
const grpc_arg* arg =
|
||||
grpc_channel_args_find(args->args, GRPC_ARG_HTTP_CONNECT_SERVER);
|
||||
char* server_name = grpc_channel_arg_get_string(arg);
|
||||
if (server_name == nullptr) {
|
||||
// Set shutdown to true so that subsequent calls to
|
||||
// http_connect_handshaker_shutdown() do nothing.
|
||||
gpr_mu_lock(&mu_);
|
||||
is_shutdown_ = true;
|
||||
gpr_mu_unlock(&mu_);
|
||||
GRPC_CLOSURE_SCHED(on_handshake_done, GRPC_ERROR_NONE);
|
||||
return;
|
||||
}
|
||||
// Get headers from channel args.
|
||||
arg = grpc_channel_args_find(args->args, GRPC_ARG_HTTP_CONNECT_HEADERS);
|
||||
char* arg_header_string = grpc_channel_arg_get_string(arg);
|
||||
grpc_http_header* headers = nullptr;
|
||||
size_t num_headers = 0;
|
||||
char** header_strings = nullptr;
|
||||
size_t num_header_strings = 0;
|
||||
if (arg_header_string != nullptr) {
|
||||
gpr_string_split(arg_header_string, "\n", &header_strings,
|
||||
&num_header_strings);
|
||||
headers = static_cast<grpc_http_header*>(
|
||||
gpr_malloc(sizeof(grpc_http_header) * num_header_strings));
|
||||
for (size_t i = 0; i < num_header_strings; ++i) {
|
||||
char* sep = strchr(header_strings[i], ':');
|
||||
|
||||
if (sep == nullptr) {
|
||||
gpr_log(GPR_ERROR, "skipping unparseable HTTP CONNECT header: %s",
|
||||
header_strings[i]);
|
||||
continue;
|
||||
}
|
||||
*sep = '\0';
|
||||
headers[num_headers].key = header_strings[i];
|
||||
headers[num_headers].value = sep + 1;
|
||||
++num_headers;
|
||||
}
|
||||
}
|
||||
// Save state in the handshaker object.
|
||||
MutexLock lock(&mu_);
|
||||
args_ = args;
|
||||
on_handshake_done_ = on_handshake_done;
|
||||
// Log connection via proxy.
|
||||
char* proxy_name = grpc_endpoint_get_peer(args->endpoint);
|
||||
gpr_log(GPR_INFO, "Connecting to server %s via HTTP proxy %s", server_name,
|
||||
proxy_name);
|
||||
gpr_free(proxy_name);
|
||||
// Construct HTTP CONNECT request.
|
||||
grpc_httpcli_request request;
|
||||
request.host = server_name;
|
||||
request.ssl_host_override = nullptr;
|
||||
request.http.method = (char*)"CONNECT";
|
||||
request.http.path = server_name;
|
||||
request.http.version = GRPC_HTTP_HTTP10; // Set by OnReadDone
|
||||
request.http.hdrs = headers;
|
||||
request.http.hdr_count = num_headers;
|
||||
request.http.body_length = 0;
|
||||
request.http.body = nullptr;
|
||||
request.handshaker = &grpc_httpcli_plaintext;
|
||||
grpc_slice request_slice = grpc_httpcli_format_connect_request(&request);
|
||||
grpc_slice_buffer_add(&write_buffer_, request_slice);
|
||||
// Clean up.
|
||||
gpr_free(headers);
|
||||
for (size_t i = 0; i < num_header_strings; ++i) {
|
||||
gpr_free(header_strings[i]);
|
||||
}
|
||||
gpr_free(header_strings);
|
||||
// Take a new ref to be held by the write callback.
|
||||
Ref().release();
|
||||
grpc_endpoint_write(args->endpoint, &write_buffer_, &request_done_closure_,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
HttpConnectHandshaker::HttpConnectHandshaker() {
|
||||
gpr_mu_init(&mu_);
|
||||
grpc_slice_buffer_init(&write_buffer_);
|
||||
GRPC_CLOSURE_INIT(&request_done_closure_, &HttpConnectHandshaker::OnWriteDone,
|
||||
this, grpc_schedule_on_exec_ctx);
|
||||
GRPC_CLOSURE_INIT(&response_read_closure_, &HttpConnectHandshaker::OnReadDone,
|
||||
this, grpc_schedule_on_exec_ctx);
|
||||
grpc_http_parser_init(&http_parser_, GRPC_HTTP_RESPONSE, &http_response_);
|
||||
}
|
||||
|
||||
//
|
||||
// handshaker factory
|
||||
//
|
||||
|
||||
class HttpConnectHandshakerFactory : public HandshakerFactory {
|
||||
public:
|
||||
void AddHandshakers(const grpc_channel_args* args,
|
||||
grpc_pollset_set* interested_parties,
|
||||
HandshakeManager* handshake_mgr) override {
|
||||
handshake_mgr->Add(MakeRefCounted<HttpConnectHandshaker>());
|
||||
}
|
||||
~HttpConnectHandshakerFactory() override = default;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
void grpc_http_connect_register_handshaker_factory() {
|
||||
using namespace grpc_core;
|
||||
HandshakerRegistry::RegisterHandshakerFactory(
|
||||
true /* at_start */, HANDSHAKER_CLIENT,
|
||||
UniquePtr<HandshakerFactory>(New<HttpConnectHandshakerFactory>()));
|
||||
}
|
34
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_connect_handshaker.h
generated
vendored
Normal file
34
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_connect_handshaker.h
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_HTTP_CONNECT_HANDSHAKER_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_HTTP_CONNECT_HANDSHAKER_H
|
||||
|
||||
/// Channel arg indicating the server in HTTP CONNECT request (string).
|
||||
/// The presence of this arg triggers the use of HTTP CONNECT.
|
||||
#define GRPC_ARG_HTTP_CONNECT_SERVER "grpc.http_connect_server"
|
||||
|
||||
/// Channel arg indicating HTTP CONNECT headers (string).
|
||||
/// Multiple headers are separated by newlines. Key/value pairs are
|
||||
/// separated by colons.
|
||||
#define GRPC_ARG_HTTP_CONNECT_HEADERS "grpc.http_connect_headers"
|
||||
|
||||
/// Registers handshaker factory.
|
||||
void grpc_http_connect_register_handshaker_factory();
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_HTTP_CONNECT_HANDSHAKER_H */
|
211
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_proxy.cc
generated
vendored
Normal file
211
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_proxy.cc
generated
vendored
Normal file
@ -0,0 +1,211 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/http_proxy.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/http_connect_handshaker.h"
|
||||
#include "src/core/ext/filters/client_channel/proxy_mapper_registry.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/gpr/env.h"
|
||||
#include "src/core/lib/gpr/string.h"
|
||||
#include "src/core/lib/gprpp/host_port.h"
|
||||
#include "src/core/lib/slice/b64.h"
|
||||
#include "src/core/lib/uri/uri_parser.h"
|
||||
|
||||
/**
|
||||
* Parses the 'https_proxy' env var (fallback on 'http_proxy') and returns the
|
||||
* proxy hostname to resolve or nullptr on error. Also sets 'user_cred' to user
|
||||
* credentials if present in the 'http_proxy' env var, otherwise leaves it
|
||||
* unchanged. It is caller's responsibility to gpr_free user_cred.
|
||||
*/
|
||||
static char* get_http_proxy_server(char** user_cred) {
|
||||
GPR_ASSERT(user_cred != nullptr);
|
||||
char* proxy_name = nullptr;
|
||||
char** authority_strs = nullptr;
|
||||
size_t authority_nstrs;
|
||||
/* Prefer using 'https_proxy'. Fallback on 'http_proxy' if it is not set. The
|
||||
* fallback behavior can be removed if there's a demand for it.
|
||||
*/
|
||||
char* uri_str = gpr_getenv("https_proxy");
|
||||
if (uri_str == nullptr) uri_str = gpr_getenv("http_proxy");
|
||||
if (uri_str == nullptr) return nullptr;
|
||||
grpc_uri* uri = grpc_uri_parse(uri_str, false /* suppress_errors */);
|
||||
if (uri == nullptr || uri->authority == nullptr) {
|
||||
gpr_log(GPR_ERROR, "cannot parse value of 'http_proxy' env var");
|
||||
goto done;
|
||||
}
|
||||
if (strcmp(uri->scheme, "http") != 0) {
|
||||
gpr_log(GPR_ERROR, "'%s' scheme not supported in proxy URI", uri->scheme);
|
||||
goto done;
|
||||
}
|
||||
/* Split on '@' to separate user credentials from host */
|
||||
gpr_string_split(uri->authority, "@", &authority_strs, &authority_nstrs);
|
||||
GPR_ASSERT(authority_nstrs != 0); /* should have at least 1 string */
|
||||
if (authority_nstrs == 1) {
|
||||
/* User cred not present in authority */
|
||||
proxy_name = authority_strs[0];
|
||||
} else if (authority_nstrs == 2) {
|
||||
/* User cred found */
|
||||
*user_cred = authority_strs[0];
|
||||
proxy_name = authority_strs[1];
|
||||
gpr_log(GPR_DEBUG, "userinfo found in proxy URI");
|
||||
} else {
|
||||
/* Bad authority */
|
||||
for (size_t i = 0; i < authority_nstrs; i++) {
|
||||
gpr_free(authority_strs[i]);
|
||||
}
|
||||
proxy_name = nullptr;
|
||||
}
|
||||
gpr_free(authority_strs);
|
||||
done:
|
||||
gpr_free(uri_str);
|
||||
grpc_uri_destroy(uri);
|
||||
return proxy_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the value of GRPC_ARG_ENABLE_HTTP_PROXY to determine if http_proxy
|
||||
* should be used.
|
||||
*/
|
||||
bool http_proxy_enabled(const grpc_channel_args* args) {
|
||||
const grpc_arg* arg =
|
||||
grpc_channel_args_find(args, GRPC_ARG_ENABLE_HTTP_PROXY);
|
||||
return grpc_channel_arg_get_bool(arg, true);
|
||||
}
|
||||
|
||||
static bool proxy_mapper_map_name(grpc_proxy_mapper* mapper,
|
||||
const char* server_uri,
|
||||
const grpc_channel_args* args,
|
||||
char** name_to_resolve,
|
||||
grpc_channel_args** new_args) {
|
||||
if (!http_proxy_enabled(args)) {
|
||||
return false;
|
||||
}
|
||||
char* user_cred = nullptr;
|
||||
*name_to_resolve = get_http_proxy_server(&user_cred);
|
||||
if (*name_to_resolve == nullptr) return false;
|
||||
char* no_proxy_str = nullptr;
|
||||
grpc_uri* uri = grpc_uri_parse(server_uri, false /* suppress_errors */);
|
||||
if (uri == nullptr || uri->path[0] == '\0') {
|
||||
gpr_log(GPR_ERROR,
|
||||
"'http_proxy' environment variable set, but cannot "
|
||||
"parse server URI '%s' -- not using proxy",
|
||||
server_uri);
|
||||
goto no_use_proxy;
|
||||
}
|
||||
if (strcmp(uri->scheme, "unix") == 0) {
|
||||
gpr_log(GPR_INFO, "not using proxy for Unix domain socket '%s'",
|
||||
server_uri);
|
||||
goto no_use_proxy;
|
||||
}
|
||||
no_proxy_str = gpr_getenv("no_proxy");
|
||||
if (no_proxy_str != nullptr) {
|
||||
static const char* NO_PROXY_SEPARATOR = ",";
|
||||
bool use_proxy = true;
|
||||
grpc_core::UniquePtr<char> server_host;
|
||||
grpc_core::UniquePtr<char> server_port;
|
||||
if (!grpc_core::SplitHostPort(
|
||||
uri->path[0] == '/' ? uri->path + 1 : uri->path, &server_host,
|
||||
&server_port)) {
|
||||
gpr_log(GPR_INFO,
|
||||
"unable to split host and port, not checking no_proxy list for "
|
||||
"host '%s'",
|
||||
server_uri);
|
||||
gpr_free(no_proxy_str);
|
||||
} else {
|
||||
size_t uri_len = strlen(server_host.get());
|
||||
char** no_proxy_hosts;
|
||||
size_t num_no_proxy_hosts;
|
||||
gpr_string_split(no_proxy_str, NO_PROXY_SEPARATOR, &no_proxy_hosts,
|
||||
&num_no_proxy_hosts);
|
||||
for (size_t i = 0; i < num_no_proxy_hosts; i++) {
|
||||
char* no_proxy_entry = no_proxy_hosts[i];
|
||||
size_t no_proxy_len = strlen(no_proxy_entry);
|
||||
if (no_proxy_len <= uri_len &&
|
||||
gpr_stricmp(no_proxy_entry,
|
||||
&(server_host.get()[uri_len - no_proxy_len])) == 0) {
|
||||
gpr_log(GPR_INFO, "not using proxy for host in no_proxy list '%s'",
|
||||
server_uri);
|
||||
use_proxy = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (size_t i = 0; i < num_no_proxy_hosts; i++) {
|
||||
gpr_free(no_proxy_hosts[i]);
|
||||
}
|
||||
gpr_free(no_proxy_hosts);
|
||||
gpr_free(no_proxy_str);
|
||||
if (!use_proxy) goto no_use_proxy;
|
||||
}
|
||||
}
|
||||
grpc_arg args_to_add[2];
|
||||
args_to_add[0] = grpc_channel_arg_string_create(
|
||||
(char*)GRPC_ARG_HTTP_CONNECT_SERVER,
|
||||
uri->path[0] == '/' ? uri->path + 1 : uri->path);
|
||||
if (user_cred != nullptr) {
|
||||
/* Use base64 encoding for user credentials as stated in RFC 7617 */
|
||||
char* encoded_user_cred =
|
||||
grpc_base64_encode(user_cred, strlen(user_cred), 0, 0);
|
||||
char* header;
|
||||
gpr_asprintf(&header, "Proxy-Authorization:Basic %s", encoded_user_cred);
|
||||
gpr_free(encoded_user_cred);
|
||||
args_to_add[1] = grpc_channel_arg_string_create(
|
||||
(char*)GRPC_ARG_HTTP_CONNECT_HEADERS, header);
|
||||
*new_args = grpc_channel_args_copy_and_add(args, args_to_add, 2);
|
||||
gpr_free(header);
|
||||
} else {
|
||||
*new_args = grpc_channel_args_copy_and_add(args, args_to_add, 1);
|
||||
}
|
||||
grpc_uri_destroy(uri);
|
||||
gpr_free(user_cred);
|
||||
return true;
|
||||
no_use_proxy:
|
||||
if (uri != nullptr) grpc_uri_destroy(uri);
|
||||
gpr_free(*name_to_resolve);
|
||||
*name_to_resolve = nullptr;
|
||||
gpr_free(user_cred);
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool proxy_mapper_map_address(grpc_proxy_mapper* mapper,
|
||||
const grpc_resolved_address* address,
|
||||
const grpc_channel_args* args,
|
||||
grpc_resolved_address** new_address,
|
||||
grpc_channel_args** new_args) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static void proxy_mapper_destroy(grpc_proxy_mapper* mapper) {}
|
||||
|
||||
static const grpc_proxy_mapper_vtable proxy_mapper_vtable = {
|
||||
proxy_mapper_map_name, proxy_mapper_map_address, proxy_mapper_destroy};
|
||||
|
||||
static grpc_proxy_mapper proxy_mapper = {&proxy_mapper_vtable};
|
||||
|
||||
void grpc_register_http_proxy_mapper() {
|
||||
grpc_proxy_mapper_register(true /* at_start */, &proxy_mapper);
|
||||
}
|
24
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_proxy.h
generated
vendored
Normal file
24
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/http_proxy.h
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_HTTP_PROXY_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_HTTP_PROXY_H
|
||||
|
||||
void grpc_register_http_proxy_mapper();
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_HTTP_PROXY_H */
|
137
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy.cc
generated
vendored
Normal file
137
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy.cc
generated
vendored
Normal file
@ -0,0 +1,137 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy.h"
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
DebugOnlyTraceFlag grpc_trace_lb_policy_refcount(false, "lb_policy_refcount");
|
||||
|
||||
//
|
||||
// LoadBalancingPolicy
|
||||
//
|
||||
|
||||
LoadBalancingPolicy::LoadBalancingPolicy(Args args, intptr_t initial_refcount)
|
||||
: InternallyRefCounted(&grpc_trace_lb_policy_refcount, initial_refcount),
|
||||
combiner_(GRPC_COMBINER_REF(args.combiner, "lb_policy")),
|
||||
interested_parties_(grpc_pollset_set_create()),
|
||||
channel_control_helper_(std::move(args.channel_control_helper)) {}
|
||||
|
||||
LoadBalancingPolicy::~LoadBalancingPolicy() {
|
||||
grpc_pollset_set_destroy(interested_parties_);
|
||||
GRPC_COMBINER_UNREF(combiner_, "lb_policy");
|
||||
}
|
||||
|
||||
void LoadBalancingPolicy::Orphan() {
|
||||
ShutdownLocked();
|
||||
Unref();
|
||||
}
|
||||
|
||||
//
|
||||
// LoadBalancingPolicy::UpdateArgs
|
||||
//
|
||||
|
||||
LoadBalancingPolicy::UpdateArgs::UpdateArgs(const UpdateArgs& other) {
|
||||
addresses = other.addresses;
|
||||
config = other.config;
|
||||
args = grpc_channel_args_copy(other.args);
|
||||
}
|
||||
|
||||
LoadBalancingPolicy::UpdateArgs::UpdateArgs(UpdateArgs&& other) {
|
||||
addresses = std::move(other.addresses);
|
||||
config = std::move(other.config);
|
||||
// TODO(roth): Use std::move() once channel args is converted to C++.
|
||||
args = other.args;
|
||||
other.args = nullptr;
|
||||
}
|
||||
|
||||
LoadBalancingPolicy::UpdateArgs& LoadBalancingPolicy::UpdateArgs::operator=(
|
||||
const UpdateArgs& other) {
|
||||
addresses = other.addresses;
|
||||
config = other.config;
|
||||
grpc_channel_args_destroy(args);
|
||||
args = grpc_channel_args_copy(other.args);
|
||||
return *this;
|
||||
}
|
||||
|
||||
LoadBalancingPolicy::UpdateArgs& LoadBalancingPolicy::UpdateArgs::operator=(
|
||||
UpdateArgs&& other) {
|
||||
addresses = std::move(other.addresses);
|
||||
config = std::move(other.config);
|
||||
// TODO(roth): Use std::move() once channel args is converted to C++.
|
||||
grpc_channel_args_destroy(args);
|
||||
args = other.args;
|
||||
other.args = nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
//
|
||||
// LoadBalancingPolicy::QueuePicker
|
||||
//
|
||||
|
||||
LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick(
|
||||
PickArgs args) {
|
||||
// We invoke the parent's ExitIdleLocked() via a closure instead
|
||||
// of doing it directly here, for two reasons:
|
||||
// 1. ExitIdleLocked() may cause the policy's state to change and
|
||||
// a new picker to be delivered to the channel. If that new
|
||||
// picker is delivered before ExitIdleLocked() returns, then by
|
||||
// the time this function returns, the pick will already have
|
||||
// been processed, and we'll be trying to re-process the same
|
||||
// pick again, leading to a crash.
|
||||
// 2. We are currently running in the data plane combiner, but we
|
||||
// need to bounce into the control plane combiner to call
|
||||
// ExitIdleLocked().
|
||||
if (!exit_idle_called_) {
|
||||
exit_idle_called_ = true;
|
||||
parent_->Ref().release(); // ref held by closure.
|
||||
GRPC_CLOSURE_SCHED(
|
||||
GRPC_CLOSURE_CREATE(&CallExitIdle, parent_.get(),
|
||||
grpc_combiner_scheduler(parent_->combiner())),
|
||||
GRPC_ERROR_NONE);
|
||||
}
|
||||
PickResult result;
|
||||
result.type = PickResult::PICK_QUEUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
void LoadBalancingPolicy::QueuePicker::CallExitIdle(void* arg,
|
||||
grpc_error* error) {
|
||||
LoadBalancingPolicy* parent = static_cast<LoadBalancingPolicy*>(arg);
|
||||
parent->ExitIdleLocked();
|
||||
parent->Unref();
|
||||
}
|
||||
|
||||
//
|
||||
// LoadBalancingPolicy::TransientFailurePicker
|
||||
//
|
||||
|
||||
LoadBalancingPolicy::PickResult
|
||||
LoadBalancingPolicy::TransientFailurePicker::Pick(PickArgs args) {
|
||||
PickResult result;
|
||||
result.type = PickResult::PICK_TRANSIENT_FAILURE;
|
||||
result.error = GRPC_ERROR_REF(error_);
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace grpc_core
|
374
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy.h
generated
vendored
Normal file
374
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy.h
generated
vendored
Normal file
@ -0,0 +1,374 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/server_address.h"
|
||||
#include "src/core/ext/filters/client_channel/service_config.h"
|
||||
#include "src/core/ext/filters/client_channel/subchannel_interface.h"
|
||||
#include "src/core/lib/gprpp/abstract.h"
|
||||
#include "src/core/lib/gprpp/orphanable.h"
|
||||
#include "src/core/lib/gprpp/ref_counted_ptr.h"
|
||||
#include "src/core/lib/gprpp/string_view.h"
|
||||
#include "src/core/lib/iomgr/combiner.h"
|
||||
#include "src/core/lib/iomgr/polling_entity.h"
|
||||
#include "src/core/lib/transport/connectivity_state.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
extern DebugOnlyTraceFlag grpc_trace_lb_policy_refcount;
|
||||
|
||||
/// Interface for load balancing policies.
|
||||
///
|
||||
/// The following concepts are used here:
|
||||
///
|
||||
/// Channel: An abstraction that manages connections to backend servers
|
||||
/// on behalf of a client application. The application creates a channel
|
||||
/// for a given server name and then sends RPCs on it, and the channel
|
||||
/// figures out which backend server to send each RPC to. A channel
|
||||
/// contains a resolver, a load balancing policy (or a tree of LB policies),
|
||||
/// and a set of one or more subchannels.
|
||||
///
|
||||
/// Subchannel: A subchannel represents a connection to one backend server.
|
||||
/// The LB policy decides which subchannels to create, manages the
|
||||
/// connectivity state of those subchannels, and decides which subchannel
|
||||
/// to send any given RPC to.
|
||||
///
|
||||
/// Resolver: A plugin that takes a gRPC server URI and resolves it to a
|
||||
/// list of one or more addresses and a service config, as described
|
||||
/// in https://github.com/grpc/grpc/blob/master/doc/naming.md. See
|
||||
/// resolver.h for the resolver API.
|
||||
///
|
||||
/// Load Balancing (LB) Policy: A plugin that takes a list of addresses
|
||||
/// from the resolver, maintains and manages a subchannel for each
|
||||
/// backend address, and decides which subchannel to send each RPC on.
|
||||
/// An LB policy has two parts:
|
||||
/// - A LoadBalancingPolicy, which deals with the control plane work of
|
||||
/// managing subchannels.
|
||||
/// - A SubchannelPicker, which handles the data plane work of
|
||||
/// determining which subchannel a given RPC should be sent on.
|
||||
|
||||
/// LoadBalacingPolicy API.
|
||||
///
|
||||
/// Note: All methods with a "Locked" suffix must be called from the
|
||||
/// combiner passed to the constructor.
|
||||
///
|
||||
/// Any I/O done by the LB policy should be done under the pollset_set
|
||||
/// returned by \a interested_parties().
|
||||
// TODO(roth): Once we move to EventManager-based polling, remove the
|
||||
// interested_parties() hooks from the API.
|
||||
class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
|
||||
public:
|
||||
/// Interface for accessing per-call state.
|
||||
class CallState {
|
||||
public:
|
||||
CallState() = default;
|
||||
virtual ~CallState() = default;
|
||||
|
||||
/// Allocates memory associated with the call, which will be
|
||||
/// automatically freed when the call is complete.
|
||||
/// It is more efficient to use this than to allocate memory directly
|
||||
/// for allocations that need to be made on a per-call basis.
|
||||
virtual void* Alloc(size_t size) GRPC_ABSTRACT;
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
};
|
||||
|
||||
/// Interface for accessing metadata.
|
||||
class MetadataInterface {
|
||||
public:
|
||||
// Implementations whose iterators fit in intptr_t may internally
|
||||
// cast this directly to their iterator type. Otherwise, they may
|
||||
// dynamically allocate their iterators and store the address here.
|
||||
typedef intptr_t Iterator;
|
||||
|
||||
virtual ~MetadataInterface() = default;
|
||||
|
||||
/// Adds a key/value pair.
|
||||
/// Does NOT take ownership of \a key or \a value.
|
||||
/// Implementations must ensure that the key and value remain alive
|
||||
/// until the call ends. If desired, they may be allocated via
|
||||
/// CallState::Alloc().
|
||||
virtual void Add(StringView key, StringView value) GRPC_ABSTRACT;
|
||||
|
||||
/// Iteration interface.
|
||||
virtual Iterator Begin() const GRPC_ABSTRACT;
|
||||
virtual bool IsEnd(Iterator it) const GRPC_ABSTRACT;
|
||||
virtual void Next(Iterator* it) const GRPC_ABSTRACT;
|
||||
virtual StringView Key(Iterator it) const GRPC_ABSTRACT;
|
||||
virtual StringView Value(Iterator it) const GRPC_ABSTRACT;
|
||||
|
||||
/// Removes the element pointed to by \a it, which is modified to
|
||||
/// point to the next element.
|
||||
virtual void Erase(Iterator* it) GRPC_ABSTRACT;
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
};
|
||||
|
||||
/// Arguments used when picking a subchannel for an RPC.
|
||||
struct PickArgs {
|
||||
/// Initial metadata associated with the picking call.
|
||||
/// The LB policy may use the existing metadata to influence its routing
|
||||
/// decision, and it may add new metadata elements to be sent with the
|
||||
/// call to the chosen backend.
|
||||
MetadataInterface* initial_metadata;
|
||||
/// An interface for accessing call state. Can be used to allocate
|
||||
/// data associated with the call in an efficient way.
|
||||
CallState* call_state;
|
||||
};
|
||||
|
||||
/// The result of picking a subchannel for an RPC.
|
||||
struct PickResult {
|
||||
enum ResultType {
|
||||
/// Pick complete. If connected_subchannel is non-null, client channel
|
||||
/// can immediately proceed with the call on connected_subchannel;
|
||||
/// otherwise, call should be dropped.
|
||||
PICK_COMPLETE,
|
||||
/// Pick cannot be completed until something changes on the control
|
||||
/// plane. Client channel will queue the pick and try again the
|
||||
/// next time the picker is updated.
|
||||
PICK_QUEUE,
|
||||
/// LB policy is in transient failure. If the pick is wait_for_ready,
|
||||
/// client channel will wait for the next picker and try again;
|
||||
/// otherwise, the call will be failed immediately (although it may
|
||||
/// be retried if the client channel is configured to do so).
|
||||
/// The Pick() method will set its error parameter if this value is
|
||||
/// returned.
|
||||
PICK_TRANSIENT_FAILURE,
|
||||
};
|
||||
ResultType type;
|
||||
|
||||
/// Used only if type is PICK_COMPLETE. Will be set to the selected
|
||||
/// subchannel, or nullptr if the LB policy decides to drop the call.
|
||||
RefCountedPtr<SubchannelInterface> subchannel;
|
||||
|
||||
/// Used only if type is PICK_TRANSIENT_FAILURE.
|
||||
/// Error to be set when returning a transient failure.
|
||||
// TODO(roth): Replace this with something similar to grpc::Status,
|
||||
// so that we don't expose grpc_error to this API.
|
||||
grpc_error* error = GRPC_ERROR_NONE;
|
||||
|
||||
/// Used only if type is PICK_COMPLETE.
|
||||
/// Callback set by lb policy to be notified of trailing metadata.
|
||||
/// The user_data argument will be set to the
|
||||
/// recv_trailing_metadata_ready_user_data field.
|
||||
/// recv_trailing_metadata will be set to the metadata, which may be
|
||||
/// modified by the callback. The callback does not take ownership,
|
||||
/// however, so any data that needs to be used after returning must
|
||||
/// be copied.
|
||||
void (*recv_trailing_metadata_ready)(
|
||||
void* user_data, MetadataInterface* recv_trailing_metadata,
|
||||
CallState* call_state) = nullptr;
|
||||
void* recv_trailing_metadata_ready_user_data = nullptr;
|
||||
};
|
||||
|
||||
/// A subchannel picker is the object used to pick the subchannel to
|
||||
/// use for a given RPC.
|
||||
///
|
||||
/// Pickers are intended to encapsulate all of the state and logic
|
||||
/// needed on the data plane (i.e., to actually process picks for
|
||||
/// individual RPCs sent on the channel) while excluding all of the
|
||||
/// state and logic needed on the control plane (i.e., resolver
|
||||
/// updates, connectivity state notifications, etc); the latter should
|
||||
/// live in the LB policy object itself.
|
||||
///
|
||||
/// Currently, pickers are always accessed from within the
|
||||
/// client_channel data plane combiner, so they do not have to be
|
||||
/// thread-safe.
|
||||
class SubchannelPicker {
|
||||
public:
|
||||
SubchannelPicker() = default;
|
||||
virtual ~SubchannelPicker() = default;
|
||||
|
||||
virtual PickResult Pick(PickArgs args) GRPC_ABSTRACT;
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
};
|
||||
|
||||
/// A proxy object used by the LB policy to communicate with the client
|
||||
/// channel.
|
||||
// TODO(juanlishen): Consider adding a mid-layer subclass that helps handle
|
||||
// things like swapping in pending policy when it's ready. Currently, we are
|
||||
// duplicating the logic in many subclasses.
|
||||
class ChannelControlHelper {
|
||||
public:
|
||||
ChannelControlHelper() = default;
|
||||
virtual ~ChannelControlHelper() = default;
|
||||
|
||||
/// Creates a new subchannel with the specified channel args.
|
||||
virtual RefCountedPtr<SubchannelInterface> CreateSubchannel(
|
||||
const grpc_channel_args& args) GRPC_ABSTRACT;
|
||||
|
||||
/// Creates a channel with the specified target and channel args.
|
||||
/// This can be used in cases where the LB policy needs to create a
|
||||
/// channel for its own use (e.g., to talk to an external load balancer).
|
||||
virtual grpc_channel* CreateChannel(
|
||||
const char* target, const grpc_channel_args& args) GRPC_ABSTRACT;
|
||||
|
||||
/// Sets the connectivity state and returns a new picker to be used
|
||||
/// by the client channel.
|
||||
virtual void UpdateState(grpc_connectivity_state state,
|
||||
UniquePtr<SubchannelPicker>) GRPC_ABSTRACT;
|
||||
|
||||
/// Requests that the resolver re-resolve.
|
||||
virtual void RequestReresolution() GRPC_ABSTRACT;
|
||||
|
||||
/// Adds a trace message associated with the channel.
|
||||
/// Does NOT take ownership of \a message.
|
||||
enum TraceSeverity { TRACE_INFO, TRACE_WARNING, TRACE_ERROR };
|
||||
virtual void AddTraceEvent(TraceSeverity severity,
|
||||
const char* message) GRPC_ABSTRACT;
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
};
|
||||
|
||||
/// Interface for configuration data used by an LB policy implementation.
|
||||
/// Individual implementations will create a subclass that adds methods to
|
||||
/// return the parameters they need.
|
||||
class Config : public RefCounted<Config> {
|
||||
public:
|
||||
virtual ~Config() = default;
|
||||
|
||||
// Returns the load balancing policy name
|
||||
virtual const char* name() const GRPC_ABSTRACT;
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
};
|
||||
|
||||
/// Data passed to the UpdateLocked() method when new addresses and
|
||||
/// config are available.
|
||||
struct UpdateArgs {
|
||||
ServerAddressList addresses;
|
||||
RefCountedPtr<Config> config;
|
||||
const grpc_channel_args* args = nullptr;
|
||||
|
||||
// TODO(roth): Remove everything below once channel args is
|
||||
// converted to a copyable and movable C++ object.
|
||||
UpdateArgs() = default;
|
||||
~UpdateArgs() { grpc_channel_args_destroy(args); }
|
||||
UpdateArgs(const UpdateArgs& other);
|
||||
UpdateArgs(UpdateArgs&& other);
|
||||
UpdateArgs& operator=(const UpdateArgs& other);
|
||||
UpdateArgs& operator=(UpdateArgs&& other);
|
||||
};
|
||||
|
||||
/// Args used to instantiate an LB policy.
|
||||
struct Args {
|
||||
/// The combiner under which all LB policy calls will be run.
|
||||
/// Policy does NOT take ownership of the reference to the combiner.
|
||||
// TODO(roth): Once we have a C++-like interface for combiners, this
|
||||
// API should change to take a smart pointer that does pass ownership
|
||||
// of a reference.
|
||||
grpc_combiner* combiner = nullptr;
|
||||
/// Channel control helper.
|
||||
/// Note: LB policies MUST NOT call any method on the helper from
|
||||
/// their constructor.
|
||||
UniquePtr<ChannelControlHelper> channel_control_helper;
|
||||
/// Channel args.
|
||||
// TODO(roth): Find a better channel args representation for this API.
|
||||
const grpc_channel_args* args = nullptr;
|
||||
};
|
||||
|
||||
explicit LoadBalancingPolicy(Args args, intptr_t initial_refcount = 1);
|
||||
virtual ~LoadBalancingPolicy();
|
||||
|
||||
// Not copyable nor movable.
|
||||
LoadBalancingPolicy(const LoadBalancingPolicy&) = delete;
|
||||
LoadBalancingPolicy& operator=(const LoadBalancingPolicy&) = delete;
|
||||
|
||||
/// Returns the name of the LB policy.
|
||||
virtual const char* name() const GRPC_ABSTRACT;
|
||||
|
||||
/// Updates the policy with new data from the resolver. Will be invoked
|
||||
/// immediately after LB policy is constructed, and then again whenever
|
||||
/// the resolver returns a new result.
|
||||
virtual void UpdateLocked(UpdateArgs) GRPC_ABSTRACT; // NOLINT
|
||||
|
||||
/// Tries to enter a READY connectivity state.
|
||||
/// This is a no-op by default, since most LB policies never go into
|
||||
/// IDLE state.
|
||||
virtual void ExitIdleLocked() {}
|
||||
|
||||
/// Resets connection backoff.
|
||||
virtual void ResetBackoffLocked() GRPC_ABSTRACT;
|
||||
|
||||
grpc_pollset_set* interested_parties() const { return interested_parties_; }
|
||||
|
||||
// Note: This must be invoked while holding the combiner.
|
||||
void Orphan() override;
|
||||
|
||||
// A picker that returns PICK_QUEUE for all picks.
|
||||
// Also calls the parent LB policy's ExitIdleLocked() method when the
|
||||
// first pick is seen.
|
||||
class QueuePicker : public SubchannelPicker {
|
||||
public:
|
||||
explicit QueuePicker(RefCountedPtr<LoadBalancingPolicy> parent)
|
||||
: parent_(std::move(parent)) {}
|
||||
|
||||
~QueuePicker() { parent_.reset(DEBUG_LOCATION, "QueuePicker"); }
|
||||
|
||||
PickResult Pick(PickArgs args) override;
|
||||
|
||||
private:
|
||||
static void CallExitIdle(void* arg, grpc_error* error);
|
||||
|
||||
RefCountedPtr<LoadBalancingPolicy> parent_;
|
||||
bool exit_idle_called_ = false;
|
||||
};
|
||||
|
||||
// A picker that returns PICK_TRANSIENT_FAILURE for all picks.
|
||||
class TransientFailurePicker : public SubchannelPicker {
|
||||
public:
|
||||
explicit TransientFailurePicker(grpc_error* error) : error_(error) {}
|
||||
~TransientFailurePicker() override { GRPC_ERROR_UNREF(error_); }
|
||||
|
||||
PickResult Pick(PickArgs args) override;
|
||||
|
||||
private:
|
||||
grpc_error* error_;
|
||||
};
|
||||
|
||||
GRPC_ABSTRACT_BASE_CLASS
|
||||
|
||||
protected:
|
||||
grpc_combiner* combiner() const { return combiner_; }
|
||||
|
||||
// Note: LB policies MUST NOT call any method on the helper from their
|
||||
// constructor.
|
||||
ChannelControlHelper* channel_control_helper() const {
|
||||
return channel_control_helper_.get();
|
||||
}
|
||||
|
||||
/// Shuts down the policy.
|
||||
virtual void ShutdownLocked() GRPC_ABSTRACT;
|
||||
|
||||
private:
|
||||
/// Combiner under which LB policy actions take place.
|
||||
grpc_combiner* combiner_;
|
||||
/// Owned pointer to interested parties in load balancing decisions.
|
||||
grpc_pollset_set* interested_parties_;
|
||||
/// Channel control helper.
|
||||
UniquePtr<ChannelControlHelper> channel_control_helper_;
|
||||
};
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_H */
|
155
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc
generated
vendored
Normal file
155
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc
generated
vendored
Normal file
@ -0,0 +1,155 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/atm.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h"
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
|
||||
#include "src/core/lib/iomgr/error.h"
|
||||
#include "src/core/lib/profiling/timers.h"
|
||||
|
||||
static grpc_error* init_channel_elem(grpc_channel_element* elem,
|
||||
grpc_channel_element_args* args) {
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
static void destroy_channel_elem(grpc_channel_element* elem) {}
|
||||
|
||||
namespace {
|
||||
|
||||
struct call_data {
|
||||
// Stats object to update.
|
||||
grpc_core::RefCountedPtr<grpc_core::GrpcLbClientStats> client_stats;
|
||||
// State for intercepting send_initial_metadata.
|
||||
grpc_closure on_complete_for_send;
|
||||
grpc_closure* original_on_complete_for_send;
|
||||
bool send_initial_metadata_succeeded = false;
|
||||
// State for intercepting recv_initial_metadata.
|
||||
grpc_closure recv_initial_metadata_ready;
|
||||
grpc_closure* original_recv_initial_metadata_ready;
|
||||
bool recv_initial_metadata_succeeded = false;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
static void on_complete_for_send(void* arg, grpc_error* error) {
|
||||
call_data* calld = static_cast<call_data*>(arg);
|
||||
if (error == GRPC_ERROR_NONE) {
|
||||
calld->send_initial_metadata_succeeded = true;
|
||||
}
|
||||
GRPC_CLOSURE_RUN(calld->original_on_complete_for_send, GRPC_ERROR_REF(error));
|
||||
}
|
||||
|
||||
static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
|
||||
call_data* calld = static_cast<call_data*>(arg);
|
||||
if (error == GRPC_ERROR_NONE) {
|
||||
calld->recv_initial_metadata_succeeded = true;
|
||||
}
|
||||
GRPC_CLOSURE_RUN(calld->original_recv_initial_metadata_ready,
|
||||
GRPC_ERROR_REF(error));
|
||||
}
|
||||
|
||||
static grpc_error* init_call_elem(grpc_call_element* elem,
|
||||
const grpc_call_element_args* args) {
|
||||
GPR_ASSERT(args->context != nullptr);
|
||||
new (elem->call_data) call_data();
|
||||
return GRPC_ERROR_NONE;
|
||||
}
|
||||
|
||||
static void destroy_call_elem(grpc_call_element* elem,
|
||||
const grpc_call_final_info* final_info,
|
||||
grpc_closure* ignored) {
|
||||
call_data* calld = static_cast<call_data*>(elem->call_data);
|
||||
if (calld->client_stats != nullptr) {
|
||||
// Record call finished, optionally setting client_failed_to_send and
|
||||
// received.
|
||||
calld->client_stats->AddCallFinished(
|
||||
!calld->send_initial_metadata_succeeded /* client_failed_to_send */,
|
||||
calld->recv_initial_metadata_succeeded /* known_received */);
|
||||
}
|
||||
calld->~call_data();
|
||||
}
|
||||
|
||||
static void start_transport_stream_op_batch(
|
||||
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
||||
call_data* calld = static_cast<call_data*>(elem->call_data);
|
||||
GPR_TIMER_SCOPE("clr_start_transport_stream_op_batch", 0);
|
||||
// Handle send_initial_metadata.
|
||||
if (batch->send_initial_metadata) {
|
||||
// Grab client stats object from metadata.
|
||||
grpc_linked_mdelem* client_stats_md =
|
||||
batch->payload->send_initial_metadata.send_initial_metadata->list.head;
|
||||
for (; client_stats_md != nullptr;
|
||||
client_stats_md = client_stats_md->next) {
|
||||
if (GRPC_SLICE_START_PTR(GRPC_MDKEY(client_stats_md->md)) ==
|
||||
static_cast<const void*>(grpc_core::kGrpcLbClientStatsMetadataKey)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (client_stats_md != nullptr) {
|
||||
grpc_core::GrpcLbClientStats* client_stats =
|
||||
const_cast<grpc_core::GrpcLbClientStats*>(
|
||||
reinterpret_cast<const grpc_core::GrpcLbClientStats*>(
|
||||
GRPC_SLICE_START_PTR(GRPC_MDVALUE(client_stats_md->md))));
|
||||
if (client_stats != nullptr) {
|
||||
calld->client_stats.reset(client_stats);
|
||||
// Intercept completion.
|
||||
calld->original_on_complete_for_send = batch->on_complete;
|
||||
GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send,
|
||||
calld, grpc_schedule_on_exec_ctx);
|
||||
batch->on_complete = &calld->on_complete_for_send;
|
||||
}
|
||||
// Remove metadata so it doesn't go out on the wire.
|
||||
grpc_metadata_batch_remove(
|
||||
batch->payload->send_initial_metadata.send_initial_metadata,
|
||||
client_stats_md);
|
||||
}
|
||||
}
|
||||
// Intercept completion of recv_initial_metadata.
|
||||
if (batch->recv_initial_metadata) {
|
||||
calld->original_recv_initial_metadata_ready =
|
||||
batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
|
||||
GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
|
||||
recv_initial_metadata_ready, calld,
|
||||
grpc_schedule_on_exec_ctx);
|
||||
batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
|
||||
&calld->recv_initial_metadata_ready;
|
||||
}
|
||||
// Chain to next filter.
|
||||
grpc_call_next_op(elem, batch);
|
||||
}
|
||||
|
||||
const grpc_channel_filter grpc_client_load_reporting_filter = {
|
||||
start_transport_stream_op_batch,
|
||||
grpc_channel_next_op,
|
||||
sizeof(call_data),
|
||||
init_call_elem,
|
||||
grpc_call_stack_ignore_set_pollset_or_pollset_set,
|
||||
destroy_call_elem,
|
||||
0, // sizeof(channel_data)
|
||||
init_channel_elem,
|
||||
destroy_channel_elem,
|
||||
grpc_channel_next_get_info,
|
||||
"client_load_reporting"};
|
29
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h
generated
vendored
Normal file
29
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
|
||||
extern const grpc_channel_filter grpc_client_load_reporting_filter;
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_CLIENT_LOAD_REPORTING_FILTER_H \
|
||||
*/
|
1886
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
generated
vendored
Normal file
1886
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
43
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h
generated
vendored
Normal file
43
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h
generated
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2018 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
/** Channel arg indicating if a target corresponding to the address is grpclb
|
||||
* loadbalancer. The type of this arg is an integer and the value is treated as
|
||||
* a bool. */
|
||||
#define GRPC_ARG_ADDRESS_IS_GRPCLB_LOAD_BALANCER \
|
||||
"grpc.address_is_grpclb_load_balancer"
|
||||
/** Channel arg indicating if a target corresponding to the address is a backend
|
||||
* received from a balancer. The type of this arg is an integer and the value is
|
||||
* treated as a bool. */
|
||||
#define GRPC_ARG_ADDRESS_IS_BACKEND_FROM_GRPCLB_LOAD_BALANCER \
|
||||
"grpc.address_is_backend_from_grpclb_load_balancer"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
extern const char kGrpcLbClientStatsMetadataKey[];
|
||||
extern const char kGrpcLbLbTokenMetadataKey[];
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_H \
|
||||
*/
|
26
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc
generated
vendored
Normal file
26
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h"
|
||||
|
||||
grpc_channel_args* grpc_lb_policy_grpclb_modify_lb_channel_args(
|
||||
const grpc_core::ServerAddressList& addresses, grpc_channel_args* args) {
|
||||
return args;
|
||||
}
|
38
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h
generated
vendored
Normal file
38
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CHANNEL_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CHANNEL_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/impl/codegen/grpc_types.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/server_address.h"
|
||||
|
||||
/// Makes any necessary modifications to \a args for use in the grpclb
|
||||
/// balancer channel.
|
||||
///
|
||||
/// Takes ownership of \a args.
|
||||
///
|
||||
/// Caller takes ownership of the returned args.
|
||||
grpc_channel_args* grpc_lb_policy_grpclb_modify_lb_channel_args(
|
||||
const grpc_core::ServerAddressList& addresses, grpc_channel_args* args);
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CHANNEL_H \
|
||||
*/
|
101
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc
generated
vendored
Normal file
101
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc
generated
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/client_channel.h"
|
||||
#include "src/core/ext/filters/client_channel/server_address.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/lib/gpr/string.h"
|
||||
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
||||
#include "src/core/lib/security/credentials/credentials.h"
|
||||
#include "src/core/lib/security/transport/target_authority_table.h"
|
||||
#include "src/core/lib/slice/slice_internal.h"
|
||||
|
||||
namespace grpc_core {
|
||||
namespace {
|
||||
|
||||
int BalancerNameCmp(const grpc_core::UniquePtr<char>& a,
|
||||
const grpc_core::UniquePtr<char>& b) {
|
||||
return strcmp(a.get(), b.get());
|
||||
}
|
||||
|
||||
RefCountedPtr<TargetAuthorityTable> CreateTargetAuthorityTable(
|
||||
const ServerAddressList& addresses) {
|
||||
TargetAuthorityTable::Entry* target_authority_entries =
|
||||
static_cast<TargetAuthorityTable::Entry*>(
|
||||
gpr_zalloc(sizeof(*target_authority_entries) * addresses.size()));
|
||||
for (size_t i = 0; i < addresses.size(); ++i) {
|
||||
char* addr_str;
|
||||
GPR_ASSERT(
|
||||
grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true) > 0);
|
||||
target_authority_entries[i].key = grpc_slice_from_copied_string(addr_str);
|
||||
gpr_free(addr_str);
|
||||
char* balancer_name = grpc_channel_arg_get_string(grpc_channel_args_find(
|
||||
addresses[i].args(), GRPC_ARG_ADDRESS_BALANCER_NAME));
|
||||
target_authority_entries[i].value.reset(gpr_strdup(balancer_name));
|
||||
}
|
||||
RefCountedPtr<TargetAuthorityTable> target_authority_table =
|
||||
TargetAuthorityTable::Create(addresses.size(), target_authority_entries,
|
||||
BalancerNameCmp);
|
||||
gpr_free(target_authority_entries);
|
||||
return target_authority_table;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace grpc_core
|
||||
|
||||
grpc_channel_args* grpc_lb_policy_grpclb_modify_lb_channel_args(
|
||||
const grpc_core::ServerAddressList& addresses, grpc_channel_args* args) {
|
||||
const char* args_to_remove[1];
|
||||
size_t num_args_to_remove = 0;
|
||||
grpc_arg args_to_add[2];
|
||||
size_t num_args_to_add = 0;
|
||||
// Add arg for targets info table.
|
||||
grpc_core::RefCountedPtr<grpc_core::TargetAuthorityTable>
|
||||
target_authority_table = grpc_core::CreateTargetAuthorityTable(addresses);
|
||||
args_to_add[num_args_to_add++] =
|
||||
grpc_core::CreateTargetAuthorityTableChannelArg(
|
||||
target_authority_table.get());
|
||||
// Substitute the channel credentials with a version without call
|
||||
// credentials: the load balancer is not necessarily trusted to handle
|
||||
// bearer token credentials.
|
||||
grpc_channel_credentials* channel_credentials =
|
||||
grpc_channel_credentials_find_in_args(args);
|
||||
grpc_core::RefCountedPtr<grpc_channel_credentials> creds_sans_call_creds;
|
||||
if (channel_credentials != nullptr) {
|
||||
creds_sans_call_creds =
|
||||
channel_credentials->duplicate_without_call_credentials();
|
||||
GPR_ASSERT(creds_sans_call_creds != nullptr);
|
||||
args_to_remove[num_args_to_remove++] = GRPC_ARG_CHANNEL_CREDENTIALS;
|
||||
args_to_add[num_args_to_add++] =
|
||||
grpc_channel_credentials_to_arg(creds_sans_call_creds.get());
|
||||
}
|
||||
grpc_channel_args* result = grpc_channel_args_copy_and_add_and_remove(
|
||||
args, args_to_remove, num_args_to_remove, args_to_add, num_args_to_add);
|
||||
// Clean up.
|
||||
grpc_channel_args_destroy(args);
|
||||
return result;
|
||||
}
|
90
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
generated
vendored
Normal file
90
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/atm.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
#include "src/core/lib/gprpp/sync.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
void GrpcLbClientStats::AddCallStarted() {
|
||||
gpr_atm_full_fetch_add(&num_calls_started_, (gpr_atm)1);
|
||||
}
|
||||
|
||||
void GrpcLbClientStats::AddCallFinished(
|
||||
bool finished_with_client_failed_to_send, bool finished_known_received) {
|
||||
gpr_atm_full_fetch_add(&num_calls_finished_, (gpr_atm)1);
|
||||
if (finished_with_client_failed_to_send) {
|
||||
gpr_atm_full_fetch_add(&num_calls_finished_with_client_failed_to_send_,
|
||||
(gpr_atm)1);
|
||||
}
|
||||
if (finished_known_received) {
|
||||
gpr_atm_full_fetch_add(&num_calls_finished_known_received_, (gpr_atm)1);
|
||||
}
|
||||
}
|
||||
|
||||
void GrpcLbClientStats::AddCallDropped(const char* token) {
|
||||
// Increment num_calls_started and num_calls_finished.
|
||||
gpr_atm_full_fetch_add(&num_calls_started_, (gpr_atm)1);
|
||||
gpr_atm_full_fetch_add(&num_calls_finished_, (gpr_atm)1);
|
||||
// Record the drop.
|
||||
MutexLock lock(&drop_count_mu_);
|
||||
if (drop_token_counts_ == nullptr) {
|
||||
drop_token_counts_.reset(New<DroppedCallCounts>());
|
||||
}
|
||||
for (size_t i = 0; i < drop_token_counts_->size(); ++i) {
|
||||
if (strcmp((*drop_token_counts_)[i].token.get(), token) == 0) {
|
||||
++(*drop_token_counts_)[i].count;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Not found, so add a new entry.
|
||||
drop_token_counts_->emplace_back(UniquePtr<char>(gpr_strdup(token)), 1);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
void AtomicGetAndResetCounter(int64_t* value, gpr_atm* counter) {
|
||||
*value = static_cast<int64_t>(gpr_atm_full_xchg(counter, (gpr_atm)0));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void GrpcLbClientStats::Get(
|
||||
int64_t* num_calls_started, int64_t* num_calls_finished,
|
||||
int64_t* num_calls_finished_with_client_failed_to_send,
|
||||
int64_t* num_calls_finished_known_received,
|
||||
UniquePtr<DroppedCallCounts>* drop_token_counts) {
|
||||
AtomicGetAndResetCounter(num_calls_started, &num_calls_started_);
|
||||
AtomicGetAndResetCounter(num_calls_finished, &num_calls_finished_);
|
||||
AtomicGetAndResetCounter(num_calls_finished_with_client_failed_to_send,
|
||||
&num_calls_finished_with_client_failed_to_send_);
|
||||
AtomicGetAndResetCounter(num_calls_finished_known_received,
|
||||
&num_calls_finished_known_received_);
|
||||
MutexLock lock(&drop_count_mu_);
|
||||
*drop_token_counts = std::move(drop_token_counts_);
|
||||
}
|
||||
|
||||
} // namespace grpc_core
|
74
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h
generated
vendored
Normal file
74
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
*
|
||||
* 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 GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/support/atm.h>
|
||||
|
||||
#include "src/core/lib/gprpp/inlined_vector.h"
|
||||
#include "src/core/lib/gprpp/memory.h"
|
||||
#include "src/core/lib/gprpp/ref_counted.h"
|
||||
#include "src/core/lib/gprpp/sync.h"
|
||||
|
||||
namespace grpc_core {
|
||||
|
||||
class GrpcLbClientStats : public RefCounted<GrpcLbClientStats> {
|
||||
public:
|
||||
struct DropTokenCount {
|
||||
UniquePtr<char> token;
|
||||
int64_t count;
|
||||
|
||||
DropTokenCount(UniquePtr<char> token, int64_t count)
|
||||
: token(std::move(token)), count(count) {}
|
||||
};
|
||||
|
||||
typedef InlinedVector<DropTokenCount, 10> DroppedCallCounts;
|
||||
|
||||
void AddCallStarted();
|
||||
void AddCallFinished(bool finished_with_client_failed_to_send,
|
||||
bool finished_known_received);
|
||||
|
||||
void AddCallDropped(const char* token);
|
||||
|
||||
void Get(int64_t* num_calls_started, int64_t* num_calls_finished,
|
||||
int64_t* num_calls_finished_with_client_failed_to_send,
|
||||
int64_t* num_calls_finished_known_received,
|
||||
UniquePtr<DroppedCallCounts>* drop_token_counts);
|
||||
|
||||
// A destruction function to use as the user_data key when attaching
|
||||
// client stats to a grpc_mdelem.
|
||||
static void Destroy(void* arg) {
|
||||
static_cast<GrpcLbClientStats*>(arg)->Unref();
|
||||
}
|
||||
|
||||
private:
|
||||
gpr_atm num_calls_started_ = 0;
|
||||
gpr_atm num_calls_finished_ = 0;
|
||||
gpr_atm num_calls_finished_with_client_failed_to_send_ = 0;
|
||||
gpr_atm num_calls_finished_known_received_ = 0;
|
||||
Mutex drop_count_mu_; // Guards drop_token_counts_.
|
||||
UniquePtr<DroppedCallCounts> drop_token_counts_;
|
||||
};
|
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H \
|
||||
*/
|
311
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc
generated
vendored
Normal file
311
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc
generated
vendored
Normal file
@ -0,0 +1,311 @@
|
||||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include "pb_decode.h"
|
||||
#include "pb_encode.h"
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h"
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
|
||||
/* invoked once for every Server in ServerList */
|
||||
static bool count_serverlist(pb_istream_t* stream, const pb_field_t* field,
|
||||
void** arg) {
|
||||
grpc_grpclb_serverlist* sl = static_cast<grpc_grpclb_serverlist*>(*arg);
|
||||
grpc_grpclb_server server;
|
||||
if (GPR_UNLIKELY(!pb_decode(stream, grpc_lb_v1_Server_fields, &server))) {
|
||||
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
|
||||
return false;
|
||||
}
|
||||
++sl->num_servers;
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef struct decode_serverlist_arg {
|
||||
/* The decoding callback is invoked once per server in serverlist. Remember
|
||||
* which index of the serverlist are we currently decoding */
|
||||
size_t decoding_idx;
|
||||
/* The decoded serverlist */
|
||||
grpc_grpclb_serverlist* serverlist;
|
||||
} decode_serverlist_arg;
|
||||
|
||||
/* invoked once for every Server in ServerList */
|
||||
static bool decode_serverlist(pb_istream_t* stream, const pb_field_t* field,
|
||||
void** arg) {
|
||||
decode_serverlist_arg* dec_arg = static_cast<decode_serverlist_arg*>(*arg);
|
||||
GPR_ASSERT(dec_arg->serverlist->num_servers >= dec_arg->decoding_idx);
|
||||
grpc_grpclb_server* server =
|
||||
static_cast<grpc_grpclb_server*>(gpr_zalloc(sizeof(grpc_grpclb_server)));
|
||||
if (GPR_UNLIKELY(!pb_decode(stream, grpc_lb_v1_Server_fields, server))) {
|
||||
gpr_free(server);
|
||||
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
|
||||
return false;
|
||||
}
|
||||
dec_arg->serverlist->servers[dec_arg->decoding_idx++] = server;
|
||||
return true;
|
||||
}
|
||||
|
||||
grpc_grpclb_request* grpc_grpclb_request_create(const char* lb_service_name) {
|
||||
grpc_grpclb_request* req = static_cast<grpc_grpclb_request*>(
|
||||
gpr_malloc(sizeof(grpc_grpclb_request)));
|
||||
req->has_client_stats = false;
|
||||
req->has_initial_request = true;
|
||||
req->initial_request.has_name = true;
|
||||
// GCC warns (-Wstringop-truncation) because the destination
|
||||
// buffer size is identical to max-size, leading to a potential
|
||||
// char[] with no null terminator. nanopb can handle it fine,
|
||||
// and parantheses around strncpy silence that compiler warning.
|
||||
(strncpy(req->initial_request.name, lb_service_name,
|
||||
GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH));
|
||||
return req;
|
||||
}
|
||||
|
||||
static void populate_timestamp(gpr_timespec timestamp,
|
||||
grpc_grpclb_timestamp* timestamp_pb) {
|
||||
timestamp_pb->has_seconds = true;
|
||||
timestamp_pb->seconds = timestamp.tv_sec;
|
||||
timestamp_pb->has_nanos = true;
|
||||
timestamp_pb->nanos = timestamp.tv_nsec;
|
||||
}
|
||||
|
||||
static bool encode_string(pb_ostream_t* stream, const pb_field_t* field,
|
||||
void* const* arg) {
|
||||
char* str = static_cast<char*>(*arg);
|
||||
if (!pb_encode_tag_for_field(stream, field)) return false;
|
||||
return pb_encode_string(stream, reinterpret_cast<uint8_t*>(str), strlen(str));
|
||||
}
|
||||
|
||||
static bool encode_drops(pb_ostream_t* stream, const pb_field_t* field,
|
||||
void* const* arg) {
|
||||
grpc_core::GrpcLbClientStats::DroppedCallCounts* drop_entries =
|
||||
static_cast<grpc_core::GrpcLbClientStats::DroppedCallCounts*>(*arg);
|
||||
if (drop_entries == nullptr) return true;
|
||||
for (size_t i = 0; i < drop_entries->size(); ++i) {
|
||||
if (!pb_encode_tag_for_field(stream, field)) return false;
|
||||
grpc_lb_v1_ClientStatsPerToken drop_message;
|
||||
drop_message.load_balance_token.funcs.encode = encode_string;
|
||||
drop_message.load_balance_token.arg = (*drop_entries)[i].token.get();
|
||||
drop_message.has_num_calls = true;
|
||||
drop_message.num_calls = (*drop_entries)[i].count;
|
||||
if (!pb_encode_submessage(stream, grpc_lb_v1_ClientStatsPerToken_fields,
|
||||
&drop_message)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
grpc_grpclb_request* grpc_grpclb_load_report_request_create(
|
||||
grpc_core::GrpcLbClientStats* client_stats) {
|
||||
grpc_grpclb_request* req = static_cast<grpc_grpclb_request*>(
|
||||
gpr_zalloc(sizeof(grpc_grpclb_request)));
|
||||
req->has_client_stats = true;
|
||||
req->client_stats.has_timestamp = true;
|
||||
populate_timestamp(gpr_now(GPR_CLOCK_REALTIME), &req->client_stats.timestamp);
|
||||
req->client_stats.has_num_calls_started = true;
|
||||
req->client_stats.has_num_calls_finished = true;
|
||||
req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
|
||||
req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
|
||||
req->client_stats.has_num_calls_finished_known_received = true;
|
||||
req->client_stats.calls_finished_with_drop.funcs.encode = encode_drops;
|
||||
grpc_core::UniquePtr<grpc_core::GrpcLbClientStats::DroppedCallCounts>
|
||||
drop_counts;
|
||||
client_stats->Get(
|
||||
&req->client_stats.num_calls_started,
|
||||
&req->client_stats.num_calls_finished,
|
||||
&req->client_stats.num_calls_finished_with_client_failed_to_send,
|
||||
&req->client_stats.num_calls_finished_known_received, &drop_counts);
|
||||
// Will be deleted in grpc_grpclb_request_destroy().
|
||||
req->client_stats.calls_finished_with_drop.arg = drop_counts.release();
|
||||
return req;
|
||||
}
|
||||
|
||||
grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request) {
|
||||
size_t encoded_length;
|
||||
pb_ostream_t sizestream;
|
||||
pb_ostream_t outputstream;
|
||||
grpc_slice slice;
|
||||
memset(&sizestream, 0, sizeof(pb_ostream_t));
|
||||
pb_encode(&sizestream, grpc_lb_v1_LoadBalanceRequest_fields, request);
|
||||
encoded_length = sizestream.bytes_written;
|
||||
|
||||
slice = GRPC_SLICE_MALLOC(encoded_length);
|
||||
outputstream =
|
||||
pb_ostream_from_buffer(GRPC_SLICE_START_PTR(slice), encoded_length);
|
||||
GPR_ASSERT(pb_encode(&outputstream, grpc_lb_v1_LoadBalanceRequest_fields,
|
||||
request) != 0);
|
||||
return slice;
|
||||
}
|
||||
|
||||
void grpc_grpclb_request_destroy(grpc_grpclb_request* request) {
|
||||
if (request->has_client_stats) {
|
||||
grpc_core::GrpcLbClientStats::DroppedCallCounts* drop_entries =
|
||||
static_cast<grpc_core::GrpcLbClientStats::DroppedCallCounts*>(
|
||||
request->client_stats.calls_finished_with_drop.arg);
|
||||
grpc_core::Delete(drop_entries);
|
||||
}
|
||||
gpr_free(request);
|
||||
}
|
||||
|
||||
typedef grpc_lb_v1_LoadBalanceResponse grpc_grpclb_response;
|
||||
grpc_grpclb_initial_response* grpc_grpclb_initial_response_parse(
|
||||
const grpc_slice& encoded_grpc_grpclb_response) {
|
||||
pb_istream_t stream = pb_istream_from_buffer(
|
||||
const_cast<uint8_t*>(GRPC_SLICE_START_PTR(encoded_grpc_grpclb_response)),
|
||||
GRPC_SLICE_LENGTH(encoded_grpc_grpclb_response));
|
||||
grpc_grpclb_response res;
|
||||
memset(&res, 0, sizeof(grpc_grpclb_response));
|
||||
if (GPR_UNLIKELY(
|
||||
!pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res))) {
|
||||
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (!res.has_initial_response) return nullptr;
|
||||
|
||||
grpc_grpclb_initial_response* initial_res =
|
||||
static_cast<grpc_grpclb_initial_response*>(
|
||||
gpr_malloc(sizeof(grpc_grpclb_initial_response)));
|
||||
memcpy(initial_res, &res.initial_response,
|
||||
sizeof(grpc_grpclb_initial_response));
|
||||
|
||||
return initial_res;
|
||||
}
|
||||
|
||||
grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
|
||||
const grpc_slice& encoded_grpc_grpclb_response) {
|
||||
pb_istream_t stream = pb_istream_from_buffer(
|
||||
const_cast<uint8_t*>(GRPC_SLICE_START_PTR(encoded_grpc_grpclb_response)),
|
||||
GRPC_SLICE_LENGTH(encoded_grpc_grpclb_response));
|
||||
pb_istream_t stream_at_start = stream;
|
||||
grpc_grpclb_serverlist* sl = static_cast<grpc_grpclb_serverlist*>(
|
||||
gpr_zalloc(sizeof(grpc_grpclb_serverlist)));
|
||||
grpc_grpclb_response res;
|
||||
memset(&res, 0, sizeof(grpc_grpclb_response));
|
||||
// First pass: count number of servers.
|
||||
res.server_list.servers.funcs.decode = count_serverlist;
|
||||
res.server_list.servers.arg = sl;
|
||||
bool status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res);
|
||||
if (GPR_UNLIKELY(!status)) {
|
||||
gpr_free(sl);
|
||||
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
|
||||
return nullptr;
|
||||
}
|
||||
// Second pass: populate servers.
|
||||
if (sl->num_servers > 0) {
|
||||
sl->servers = static_cast<grpc_grpclb_server**>(
|
||||
gpr_zalloc(sizeof(grpc_grpclb_server*) * sl->num_servers));
|
||||
decode_serverlist_arg decode_arg;
|
||||
memset(&decode_arg, 0, sizeof(decode_arg));
|
||||
decode_arg.serverlist = sl;
|
||||
res.server_list.servers.funcs.decode = decode_serverlist;
|
||||
res.server_list.servers.arg = &decode_arg;
|
||||
status = pb_decode(&stream_at_start, grpc_lb_v1_LoadBalanceResponse_fields,
|
||||
&res);
|
||||
if (GPR_UNLIKELY(!status)) {
|
||||
grpc_grpclb_destroy_serverlist(sl);
|
||||
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
return sl;
|
||||
}
|
||||
|
||||
void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist* serverlist) {
|
||||
if (serverlist == nullptr) {
|
||||
return;
|
||||
}
|
||||
for (size_t i = 0; i < serverlist->num_servers; i++) {
|
||||
gpr_free(serverlist->servers[i]);
|
||||
}
|
||||
gpr_free(serverlist->servers);
|
||||
gpr_free(serverlist);
|
||||
}
|
||||
|
||||
grpc_grpclb_serverlist* grpc_grpclb_serverlist_copy(
|
||||
const grpc_grpclb_serverlist* sl) {
|
||||
grpc_grpclb_serverlist* copy = static_cast<grpc_grpclb_serverlist*>(
|
||||
gpr_zalloc(sizeof(grpc_grpclb_serverlist)));
|
||||
copy->num_servers = sl->num_servers;
|
||||
copy->servers = static_cast<grpc_grpclb_server**>(
|
||||
gpr_malloc(sizeof(grpc_grpclb_server*) * sl->num_servers));
|
||||
for (size_t i = 0; i < sl->num_servers; i++) {
|
||||
copy->servers[i] = static_cast<grpc_grpclb_server*>(
|
||||
gpr_malloc(sizeof(grpc_grpclb_server)));
|
||||
memcpy(copy->servers[i], sl->servers[i], sizeof(grpc_grpclb_server));
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
bool grpc_grpclb_serverlist_equals(const grpc_grpclb_serverlist* lhs,
|
||||
const grpc_grpclb_serverlist* rhs) {
|
||||
if (lhs == nullptr || rhs == nullptr) {
|
||||
return false;
|
||||
}
|
||||
if (lhs->num_servers != rhs->num_servers) {
|
||||
return false;
|
||||
}
|
||||
for (size_t i = 0; i < lhs->num_servers; i++) {
|
||||
if (!grpc_grpclb_server_equals(lhs->servers[i], rhs->servers[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool grpc_grpclb_server_equals(const grpc_grpclb_server* lhs,
|
||||
const grpc_grpclb_server* rhs) {
|
||||
return memcmp(lhs, rhs, sizeof(grpc_grpclb_server)) == 0;
|
||||
}
|
||||
|
||||
int grpc_grpclb_duration_compare(const grpc_grpclb_duration* lhs,
|
||||
const grpc_grpclb_duration* rhs) {
|
||||
GPR_ASSERT(lhs && rhs);
|
||||
if (lhs->has_seconds && rhs->has_seconds) {
|
||||
if (lhs->seconds < rhs->seconds) return -1;
|
||||
if (lhs->seconds > rhs->seconds) return 1;
|
||||
} else if (lhs->has_seconds) {
|
||||
return 1;
|
||||
} else if (rhs->has_seconds) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
GPR_ASSERT(lhs->seconds == rhs->seconds);
|
||||
if (lhs->has_nanos && rhs->has_nanos) {
|
||||
if (lhs->nanos < rhs->nanos) return -1;
|
||||
if (lhs->nanos > rhs->nanos) return 1;
|
||||
} else if (lhs->has_nanos) {
|
||||
return 1;
|
||||
} else if (rhs->has_nanos) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
grpc_millis grpc_grpclb_duration_to_millis(grpc_grpclb_duration* duration_pb) {
|
||||
return static_cast<grpc_millis>(
|
||||
(duration_pb->has_seconds ? duration_pb->seconds : 0) * GPR_MS_PER_SEC +
|
||||
(duration_pb->has_nanos ? duration_pb->nanos : 0) / GPR_NS_PER_MS);
|
||||
}
|
||||
|
||||
void grpc_grpclb_initial_response_destroy(
|
||||
grpc_grpclb_initial_response* response) {
|
||||
gpr_free(response);
|
||||
}
|
90
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h
generated
vendored
Normal file
90
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h
generated
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
/*
|
||||
*
|
||||
* 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_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_LOAD_BALANCER_API_H
|
||||
#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_LOAD_BALANCER_API_H
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#include <grpc/slice_buffer.h>
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
|
||||
#include "src/core/lib/iomgr/exec_ctx.h"
|
||||
|
||||
#define GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH 128
|
||||
|
||||
typedef grpc_lb_v1_Server_ip_address_t grpc_grpclb_ip_address;
|
||||
typedef grpc_lb_v1_LoadBalanceRequest grpc_grpclb_request;
|
||||
typedef grpc_lb_v1_InitialLoadBalanceResponse grpc_grpclb_initial_response;
|
||||
typedef grpc_lb_v1_Server grpc_grpclb_server;
|
||||
typedef google_protobuf_Duration grpc_grpclb_duration;
|
||||
typedef google_protobuf_Timestamp grpc_grpclb_timestamp;
|
||||
|
||||
typedef struct {
|
||||
grpc_grpclb_server** servers;
|
||||
size_t num_servers;
|
||||
} grpc_grpclb_serverlist;
|
||||
|
||||
/** Create a request for a gRPC LB service under \a lb_service_name */
|
||||
grpc_grpclb_request* grpc_grpclb_request_create(const char* lb_service_name);
|
||||
grpc_grpclb_request* grpc_grpclb_load_report_request_create(
|
||||
grpc_core::GrpcLbClientStats* client_stats);
|
||||
|
||||
/** Protocol Buffers v3-encode \a request */
|
||||
grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request);
|
||||
|
||||
/** Destroy \a request */
|
||||
void grpc_grpclb_request_destroy(grpc_grpclb_request* request);
|
||||
|
||||
/** Parse (ie, decode) the bytes in \a encoded_grpc_grpclb_response as a \a
|
||||
* grpc_grpclb_initial_response */
|
||||
grpc_grpclb_initial_response* grpc_grpclb_initial_response_parse(
|
||||
const grpc_slice& encoded_grpc_grpclb_response);
|
||||
|
||||
/** Parse the list of servers from an encoded \a grpc_grpclb_response */
|
||||
grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
|
||||
const grpc_slice& encoded_grpc_grpclb_response);
|
||||
|
||||
/** Return a copy of \a sl. The caller is responsible for calling \a
|
||||
* grpc_grpclb_destroy_serverlist on the returned copy. */
|
||||
grpc_grpclb_serverlist* grpc_grpclb_serverlist_copy(
|
||||
const grpc_grpclb_serverlist* sl);
|
||||
|
||||
bool grpc_grpclb_serverlist_equals(const grpc_grpclb_serverlist* lhs,
|
||||
const grpc_grpclb_serverlist* rhs);
|
||||
|
||||
bool grpc_grpclb_server_equals(const grpc_grpclb_server* lhs,
|
||||
const grpc_grpclb_server* rhs);
|
||||
|
||||
/** Destroy \a serverlist */
|
||||
void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist* serverlist);
|
||||
|
||||
/** Compare \a lhs against \a rhs and return 0 if \a lhs and \a rhs are equal,
|
||||
* < 0 if \a lhs represents a duration shorter than \a rhs and > 0 otherwise */
|
||||
int grpc_grpclb_duration_compare(const grpc_grpclb_duration* lhs,
|
||||
const grpc_grpclb_duration* rhs);
|
||||
|
||||
grpc_millis grpc_grpclb_duration_to_millis(grpc_grpclb_duration* duration_pb);
|
||||
|
||||
/** Destroy \a initial_response */
|
||||
void grpc_grpclb_initial_response_destroy(
|
||||
grpc_grpclb_initial_response* response);
|
||||
|
||||
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_LOAD_BALANCER_API_H \
|
||||
*/
|
19
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c
generated
vendored
Normal file
19
node_modules/grpc/deps/grpc/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
/* Automatically generated nanopb constant definitions */
|
||||
/* Generated by nanopb-0.3.7-dev */
|
||||
|
||||
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h"
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
const pb_field_t google_protobuf_Duration_fields[3] = {
|
||||
PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, google_protobuf_Duration, seconds, seconds, 0),
|
||||
PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, google_protobuf_Duration, nanos, seconds, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
|
||||
/* @@protoc_insertion_point(eof) */
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user