|  | @@ -30,7 +30,7 @@
 | 
	
		
			
				|  |  |  #include <grpc/support/log.h>
 | 
	
		
			
				|  |  |  #include <grpc/support/string_util.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#include "src/core/lib/gpr/thd.h"
 | 
	
		
			
				|  |  | +#include "src/core/lib/gprpp/thd.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/iomgr/exec_ctx.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/iomgr/iomgr.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/iomgr/resolve_address.h"
 | 
	
	
		
			
				|  | @@ -172,73 +172,77 @@ int run_concurrent_connectivity_test() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpc_init();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  gpr_thd_id threads[NUM_THREADS];
 | 
	
		
			
				|  |  | -  gpr_thd_id server;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  char* localhost = gpr_strdup("localhost:54321");
 | 
	
		
			
				|  |  | -  gpr_thd_options options = gpr_thd_options_default();
 | 
	
		
			
				|  |  | -  gpr_thd_options_set_joinable(&options);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    /* First round, no server */
 | 
	
		
			
				|  |  | -  gpr_log(GPR_DEBUG, "Wave 1");
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_new(&threads[i], "grpc_wave_1", create_loop_destroy, localhost,
 | 
	
		
			
				|  |  | -                &options);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_join(threads[i]);
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    gpr_log(GPR_DEBUG, "Wave 1");
 | 
	
		
			
				|  |  | +    char* localhost = gpr_strdup("localhost:54321");
 | 
	
		
			
				|  |  | +    grpc_core::Thread threads[NUM_THREADS];
 | 
	
		
			
				|  |  | +    for (auto& th : threads) {
 | 
	
		
			
				|  |  | +      th = grpc_core::Thread("grpc_wave_1", create_loop_destroy, localhost);
 | 
	
		
			
				|  |  | +      th.Start();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    for (auto& th : threads) {
 | 
	
		
			
				|  |  | +      th.Join();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    gpr_free(localhost);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  gpr_free(localhost);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Second round, actual grpc server */
 | 
	
		
			
				|  |  | -  gpr_log(GPR_DEBUG, "Wave 2");
 | 
	
		
			
				|  |  | -  int port = grpc_pick_unused_port_or_die();
 | 
	
		
			
				|  |  | -  gpr_asprintf(&args.addr, "localhost:%d", port);
 | 
	
		
			
				|  |  | -  args.server = grpc_server_create(nullptr, nullptr);
 | 
	
		
			
				|  |  | -  grpc_server_add_insecure_http2_port(args.server, args.addr);
 | 
	
		
			
				|  |  | -  args.cq = grpc_completion_queue_create_for_next(nullptr);
 | 
	
		
			
				|  |  | -  grpc_server_register_completion_queue(args.server, args.cq, nullptr);
 | 
	
		
			
				|  |  | -  grpc_server_start(args.server);
 | 
	
		
			
				|  |  | -  gpr_thd_new(&server, "grpc_wave_2_server", server_thread, &args, &options);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_new(&threads[i], "grpc_wave_2", create_loop_destroy, args.addr,
 | 
	
		
			
				|  |  | -                &options);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_join(threads[i]);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  grpc_server_shutdown_and_notify(args.server, args.cq, tag(0xd1e));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  gpr_thd_join(server);
 | 
	
		
			
				|  |  | -  grpc_server_destroy(args.server);
 | 
	
		
			
				|  |  | -  grpc_completion_queue_destroy(args.cq);
 | 
	
		
			
				|  |  | -  gpr_free(args.addr);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /* Third round, bogus tcp server */
 | 
	
		
			
				|  |  | -  gpr_log(GPR_DEBUG, "Wave 3");
 | 
	
		
			
				|  |  | -  args.pollset = static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
 | 
	
		
			
				|  |  | -  grpc_pollset_init(args.pollset, &args.mu);
 | 
	
		
			
				|  |  | -  gpr_event_init(&args.ready);
 | 
	
		
			
				|  |  | -  gpr_thd_new(&server, "grpc_wave_3_server", bad_server_thread, &args,
 | 
	
		
			
				|  |  | -              &options);
 | 
	
		
			
				|  |  | -  gpr_event_wait(&args.ready, gpr_inf_future(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_new(&threads[i], "grpc_wave_3", create_loop_destroy, args.addr,
 | 
	
		
			
				|  |  | -                &options);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_join(threads[i]);
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    /* Second round, actual grpc server */
 | 
	
		
			
				|  |  | +    gpr_log(GPR_DEBUG, "Wave 2");
 | 
	
		
			
				|  |  | +    int port = grpc_pick_unused_port_or_die();
 | 
	
		
			
				|  |  | +    gpr_asprintf(&args.addr, "localhost:%d", port);
 | 
	
		
			
				|  |  | +    args.server = grpc_server_create(nullptr, nullptr);
 | 
	
		
			
				|  |  | +    grpc_server_add_insecure_http2_port(args.server, args.addr);
 | 
	
		
			
				|  |  | +    args.cq = grpc_completion_queue_create_for_next(nullptr);
 | 
	
		
			
				|  |  | +    grpc_server_register_completion_queue(args.server, args.cq, nullptr);
 | 
	
		
			
				|  |  | +    grpc_server_start(args.server);
 | 
	
		
			
				|  |  | +    grpc_core::Thread server2("grpc_wave_2_server", server_thread, &args);
 | 
	
		
			
				|  |  | +    server2.Start();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    grpc_core::Thread threads[NUM_THREADS];
 | 
	
		
			
				|  |  | +    for (auto& th : threads) {
 | 
	
		
			
				|  |  | +      th = grpc_core::Thread("grpc_wave_2", create_loop_destroy, args.addr);
 | 
	
		
			
				|  |  | +      th.Start();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    for (auto& th : threads) {
 | 
	
		
			
				|  |  | +      th.Join();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    grpc_server_shutdown_and_notify(args.server, args.cq, tag(0xd1e));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server2.Join();
 | 
	
		
			
				|  |  | +    grpc_server_destroy(args.server);
 | 
	
		
			
				|  |  | +    grpc_completion_queue_destroy(args.cq);
 | 
	
		
			
				|  |  | +    gpr_free(args.addr);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  gpr_atm_rel_store(&args.stop, 1);
 | 
	
		
			
				|  |  | -  gpr_thd_join(server);
 | 
	
		
			
				|  |  |    {
 | 
	
		
			
				|  |  | -    grpc_core::ExecCtx exec_ctx;
 | 
	
		
			
				|  |  | -    grpc_pollset_shutdown(
 | 
	
		
			
				|  |  | -        args.pollset, GRPC_CLOSURE_CREATE(done_pollset_shutdown, args.pollset,
 | 
	
		
			
				|  |  | -                                          grpc_schedule_on_exec_ctx));
 | 
	
		
			
				|  |  | +    /* Third round, bogus tcp server */
 | 
	
		
			
				|  |  | +    gpr_log(GPR_DEBUG, "Wave 3");
 | 
	
		
			
				|  |  | +    args.pollset = static_cast<grpc_pollset*>(gpr_zalloc(grpc_pollset_size()));
 | 
	
		
			
				|  |  | +    grpc_pollset_init(args.pollset, &args.mu);
 | 
	
		
			
				|  |  | +    gpr_event_init(&args.ready);
 | 
	
		
			
				|  |  | +    grpc_core::Thread server3("grpc_wave_3_server", bad_server_thread, &args);
 | 
	
		
			
				|  |  | +    server3.Start();
 | 
	
		
			
				|  |  | +    gpr_event_wait(&args.ready, gpr_inf_future(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    grpc_core::Thread threads[NUM_THREADS];
 | 
	
		
			
				|  |  | +    for (auto& th : threads) {
 | 
	
		
			
				|  |  | +      th = grpc_core::Thread("grpc_wave_3", create_loop_destroy, args.addr);
 | 
	
		
			
				|  |  | +      th.Start();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    for (auto& th : threads) {
 | 
	
		
			
				|  |  | +      th.Join();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    gpr_atm_rel_store(&args.stop, 1);
 | 
	
		
			
				|  |  | +    server3.Join();
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +      grpc_core::ExecCtx exec_ctx;
 | 
	
		
			
				|  |  | +      grpc_pollset_shutdown(
 | 
	
		
			
				|  |  | +          args.pollset, GRPC_CLOSURE_CREATE(done_pollset_shutdown, args.pollset,
 | 
	
		
			
				|  |  | +                                            grpc_schedule_on_exec_ctx));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpc_shutdown();
 | 
	
	
		
			
				|  | @@ -278,18 +282,17 @@ void watches_with_short_timeouts(void* addr) {
 | 
	
		
			
				|  |  |  int run_concurrent_watches_with_short_timeouts_test() {
 | 
	
		
			
				|  |  |    grpc_init();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  gpr_thd_id threads[NUM_THREADS];
 | 
	
		
			
				|  |  | +  grpc_core::Thread threads[NUM_THREADS];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    char* localhost = gpr_strdup("localhost:54321");
 | 
	
		
			
				|  |  | -  gpr_thd_options options = gpr_thd_options_default();
 | 
	
		
			
				|  |  | -  gpr_thd_options_set_joinable(&options);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_new(&threads[i], "grpc_short_watches", watches_with_short_timeouts,
 | 
	
		
			
				|  |  | -                localhost, &options);
 | 
	
		
			
				|  |  | +  for (auto& th : threads) {
 | 
	
		
			
				|  |  | +    th = grpc_core::Thread("grpc_short_watches", watches_with_short_timeouts,
 | 
	
		
			
				|  |  | +                           localhost);
 | 
	
		
			
				|  |  | +    th.Start();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < NUM_THREADS; ++i) {
 | 
	
		
			
				|  |  | -    gpr_thd_join(threads[i]);
 | 
	
		
			
				|  |  | +  for (auto& th : threads) {
 | 
	
		
			
				|  |  | +    th.Join();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    gpr_free(localhost);
 | 
	
		
			
				|  |  |  
 |