aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/core/util
diff options
context:
space:
mode:
authorGravatar Jan Tattermusch <jtattermusch@google.com>2018-08-31 15:28:04 +0200
committerGravatar Jan Tattermusch <jtattermusch@google.com>2018-08-31 15:28:04 +0200
commit577c2e4090386c75c30bbf9110aa596b766f6037 (patch)
tree6ea2219921515df5a94113ab905400a1acc7f81b /test/core/util
parent9e735f40e5299d0bd0e6b09d1fa0f9fb38bfb7b6 (diff)
threadsafe port picker for remote bazel
Diffstat (limited to 'test/core/util')
-rw-r--r--test/core/util/port_isolated_runtime_environment.cc21
1 files changed, 11 insertions, 10 deletions
diff --git a/test/core/util/port_isolated_runtime_environment.cc b/test/core/util/port_isolated_runtime_environment.cc
index 773290b795..c1ca185a67 100644
--- a/test/core/util/port_isolated_runtime_environment.cc
+++ b/test/core/util/port_isolated_runtime_environment.cc
@@ -20,6 +20,8 @@
* runs in a separate container) the framework takes a round-robin pick of a
* port within certain range. There is no need to recycle ports.
*/
+#include <grpc/support/atm.h>
+#include <grpc/support/log.h>
#include <grpc/support/time.h>
#include <stdlib.h>
#include "src/core/lib/iomgr/port.h"
@@ -31,23 +33,22 @@
#define MIN_PORT 49152
#define MAX_PORT 65535
-int get_random_starting_port() {
+static int get_random_port_offset() {
srand(gpr_now(GPR_CLOCK_REALTIME).tv_nsec);
double rnd = static_cast<double>(rand()) /
(static_cast<double>(RAND_MAX) + 1.0); // values from [0,1)
- return static_cast<int>(rnd * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;
+ return static_cast<int>(rnd * (MAX_PORT - MIN_PORT + 1));
}
-static int s_allocated_port = get_random_starting_port();
+static int s_initial_offset = get_random_port_offset();
+static gpr_atm s_pick_counter = 0;
int grpc_pick_unused_port_or_die(void) {
- // TODO(jtattermusch): protect by mutex
- int allocated_port = s_allocated_port++;
- if (s_allocated_port == MAX_PORT + 1) {
- s_allocated_port = MIN_PORT;
- }
-
- return allocated_port;
+ int orig_counter_val =
+ static_cast<int>(gpr_atm_full_fetch_add(&s_pick_counter, 1));
+ GPR_ASSERT(orig_counter_val < (MAX_PORT - MIN_PORT + 1));
+ return MIN_PORT +
+ (s_initial_offset + orig_counter_val) % (MAX_PORT - MIN_PORT + 1);
}
void grpc_recycle_unused_port(int port) { (void)port; }