| 
					
				 | 
			
			
				@@ -18,63 +18,76 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <grpc/impl/codegen/port_platform.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include "src/core/lib/avl/avl.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/channel/channel_trace.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/channel/channelz_registry.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/gpr/useful.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/core/lib/gprpp/memory.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <grpc/support/alloc.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <grpc/support/log.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// file global lock and avl. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static gpr_mu g_mu; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static grpc_avl g_avl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static gpr_atm g_uuid = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace grpc_core { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// avl vtable for uuid (intptr_t) -> ChannelTrace 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// singleton instance of the registry. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ChannelzRegistry* g_channelz_registry = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// avl vtable for uuid (intptr_t) -> channelz_obj (void*) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // this table is only looking, it does not own anything. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void destroy_intptr(void* not_used, void* user_data) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void* copy_intptr(void* key, void* user_data) { return key; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static long compare_intptr(void* key1, void* key2, void* user_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void destroy_intptr(void* not_used, void* user_data) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void* copy_intptr(void* key, void* user_data) { return key; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+long compare_intptr(void* key1, void* key2, void* user_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return GPR_ICMP(key1, key2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void destroy_channel_trace(void* trace, void* user_data) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void* copy_channel_trace(void* trace, void* user_data) { return trace; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static const grpc_avl_vtable avl_vtable = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    destroy_intptr, copy_intptr, compare_intptr, destroy_channel_trace, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    copy_channel_trace}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void destroy_channelz_obj(void* channelz_obj, void* user_data) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void* copy_channelz_obj(void* channelz_obj, void* user_data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return channelz_obj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const grpc_avl_vtable avl_vtable = {destroy_intptr, copy_intptr, compare_intptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    destroy_channelz_obj, copy_channelz_obj}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}  // anonymous namespace 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ChannelzRegistry::Init() { g_channelz_registry = New<ChannelzRegistry>(); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_channelz_registry_init() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_init(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_avl = grpc_avl_create(&avl_vtable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ChannelzRegistry::Shutdown() { Delete(g_channelz_registry); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ChannelzRegistry* ChannelzRegistry::Default() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_DEBUG_ASSERT(g_channelz_registry != nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return g_channelz_registry; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ChannelzRegistry::ChannelzRegistry() : uuid_(1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_init(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  avl_ = grpc_avl_create(&avl_vtable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_channelz_registry_shutdown() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_avl_unref(g_avl, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_destroy(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ChannelzRegistry::~ChannelzRegistry() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_avl_unref(avl_, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_destroy(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-intptr_t grpc_channelz_registry_register_channel_trace( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_core::ChannelTrace* channel_trace) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  intptr_t prior = gpr_atm_no_barrier_fetch_add(&g_uuid, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_lock(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_avl = grpc_avl_add(g_avl, (void*)prior, channel_trace, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_unlock(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+intptr_t ChannelzRegistry::Register(grpc_core::ChannelTrace* channel_trace) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  intptr_t prior = gpr_atm_no_barrier_fetch_add(&uuid_, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_lock(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  avl_ = grpc_avl_add(avl_, (void*)prior, channel_trace, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_unlock(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return prior; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_channelz_registry_unregister_channel_trace(intptr_t uuid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_lock(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  g_avl = grpc_avl_remove(g_avl, (void*)uuid, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_unlock(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void ChannelzRegistry::Unregister(intptr_t uuid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_lock(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  avl_ = grpc_avl_remove(avl_, (void*)uuid, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_unlock(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-grpc_core::ChannelTrace* grpc_channelz_registry_get_channel_trace( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    intptr_t uuid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_lock(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+grpc_core::ChannelTrace* ChannelzRegistry::Get(intptr_t uuid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_lock(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_core::ChannelTrace* ret = static_cast<grpc_core::ChannelTrace*>( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_avl_get(g_avl, (void*)uuid, nullptr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_unlock(&g_mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_avl_get(avl_, (void*)uuid, nullptr)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_mu_unlock(&mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}  // namespace grpc_core 
			 |