/* * * 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 #include "src/core/tsi/alts/handshaker/alts_shared_resource.h" #include #include "src/core/tsi/alts/handshaker/alts_handshaker_client.h" static alts_shared_resource_dedicated g_alts_resource_dedicated; alts_shared_resource_dedicated* grpc_alts_get_shared_resource_dedicated(void) { return &g_alts_resource_dedicated; } static void thread_worker(void* arg) { while (true) { grpc_event event = grpc_completion_queue_next(g_alts_resource_dedicated.cq, gpr_inf_future(GPR_CLOCK_REALTIME), nullptr); GPR_ASSERT(event.type != GRPC_QUEUE_TIMEOUT); if (event.type == GRPC_QUEUE_SHUTDOWN) { break; } GPR_ASSERT(event.type == GRPC_OP_COMPLETE); alts_handshaker_client* client = static_cast(event.tag); alts_handshaker_client_handle_response(client, event.success); } } void grpc_alts_shared_resource_dedicated_init() { g_alts_resource_dedicated.cq = nullptr; gpr_mu_init(&g_alts_resource_dedicated.mu); } void grpc_alts_shared_resource_dedicated_start( const char* handshaker_service_url) { gpr_mu_lock(&g_alts_resource_dedicated.mu); if (g_alts_resource_dedicated.cq == nullptr) { g_alts_resource_dedicated.channel = grpc_insecure_channel_create(handshaker_service_url, nullptr, nullptr); g_alts_resource_dedicated.cq = grpc_completion_queue_create_for_next(nullptr); g_alts_resource_dedicated.thread = grpc_core::Thread("alts_tsi_handshaker", &thread_worker, nullptr); g_alts_resource_dedicated.interested_parties = grpc_pollset_set_create(); grpc_pollset_set_add_pollset(g_alts_resource_dedicated.interested_parties, grpc_cq_pollset(g_alts_resource_dedicated.cq)); g_alts_resource_dedicated.thread.Start(); } gpr_mu_unlock(&g_alts_resource_dedicated.mu); } void grpc_alts_shared_resource_dedicated_shutdown() { if (g_alts_resource_dedicated.cq != nullptr) { grpc_pollset_set_del_pollset(g_alts_resource_dedicated.interested_parties, grpc_cq_pollset(g_alts_resource_dedicated.cq)); grpc_completion_queue_shutdown(g_alts_resource_dedicated.cq); g_alts_resource_dedicated.thread.Join(); grpc_pollset_set_destroy(g_alts_resource_dedicated.interested_parties); grpc_completion_queue_destroy(g_alts_resource_dedicated.cq); grpc_channel_destroy(g_alts_resource_dedicated.channel); } gpr_mu_destroy(&g_alts_resource_dedicated.mu); }