#include <grpc/support/port_platform.h>
#include "src/core/lib/iomgr/iomgr.h"
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
#include <grpc/support/sync.h>
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/gprpp/global_config.h"
#include "src/core/lib/gprpp/thd.h"
#include "src/core/lib/iomgr/buffer_list.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/internal_errqueue.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/iomgr/timer_manager.h"
GPR_GLOBAL_CONFIG_DEFINE_BOOL(grpc_abort_on_leaks, false,
"A debugging aid to cause a call to abort() when "
"gRPC objects are leaked past grpc_shutdown()");
static gpr_mu g_mu;
static gpr_cv g_rcv;
static int g_shutdown;
static grpc_iomgr_object g_root_object;
static bool g_grpc_abort_on_leaks;
void grpc_iomgr_init() { … }
void grpc_iomgr_start() { … }
static size_t count_objects(void) { … }
size_t grpc_iomgr_count_objects_for_testing(void) { … }
static void dump_objects(const char* kind) { … }
void grpc_iomgr_shutdown() { … }
void grpc_iomgr_shutdown_background_closure() { … }
bool grpc_iomgr_is_any_background_poller_thread() { … }
bool grpc_iomgr_add_closure_to_background_poller(grpc_closure* closure,
grpc_error_handle error) { … }
void grpc_iomgr_register_object(grpc_iomgr_object* obj, const char* name) { … }
void grpc_iomgr_unregister_object(grpc_iomgr_object* obj) { … }
bool grpc_iomgr_abort_on_leaks(void) { … }