|
|
|
@ -139,23 +139,25 @@ static void increment(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { |
|
|
|
|
* polling_island_merge()[ev_epoll_linux.c], where the parent relationship was |
|
|
|
|
* inverted. |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#define NUM_FDS 2 |
|
|
|
|
#define NUM_POLLSETS 2 |
|
|
|
|
#define NUM_CLOSURES 4 |
|
|
|
|
|
|
|
|
|
static void test_pollset_queue_merge_items() { |
|
|
|
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; |
|
|
|
|
const int num_fds = 2; |
|
|
|
|
const int num_pollsets = 2; |
|
|
|
|
const int num_closures = 4; |
|
|
|
|
test_fd tfds[2 /* num_fds */]; |
|
|
|
|
int fds[2 /* num_fds */]; |
|
|
|
|
test_pollset pollsets[2 /* num_pollsets */]; |
|
|
|
|
grpc_closure closures[4 /* num_closures */]; |
|
|
|
|
test_fd tfds[NUM_FDS]; |
|
|
|
|
int fds[NUM_FDS]; |
|
|
|
|
test_pollset pollsets[NUM_POLLSETS]; |
|
|
|
|
grpc_closure closures[NUM_CLOSURES]; |
|
|
|
|
int i; |
|
|
|
|
int result = 0; |
|
|
|
|
|
|
|
|
|
test_fd_init(tfds, fds, num_fds); |
|
|
|
|
test_pollset_init(pollsets, num_pollsets); |
|
|
|
|
test_fd_init(tfds, fds, NUM_FDS); |
|
|
|
|
test_pollset_init(pollsets, NUM_POLLSETS); |
|
|
|
|
|
|
|
|
|
/* Two distinct polling islands, each with their own FD and pollset. */ |
|
|
|
|
for (i = 0; i < num_fds; i++) { |
|
|
|
|
for (i = 0; i < NUM_FDS; i++) { |
|
|
|
|
grpc_pollset_add_fd(&exec_ctx, pollsets[i].pollset, tfds[i].fd); |
|
|
|
|
grpc_exec_ctx_flush(&exec_ctx); |
|
|
|
|
} |
|
|
|
@ -173,7 +175,7 @@ static void test_pollset_queue_merge_items() { |
|
|
|
|
grpc_closure_init( |
|
|
|
|
closures + 3, increment, &result, |
|
|
|
|
grpc_workqueue_scheduler(grpc_fd_get_polling_island(tfds[1].fd))); |
|
|
|
|
for (i = 0; i < num_closures; ++i) { |
|
|
|
|
for (i = 0; i < NUM_CLOSURES; ++i) { |
|
|
|
|
grpc_closure_sched(&exec_ctx, closures + i, GRPC_ERROR_NONE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -186,7 +188,7 @@ static void test_pollset_queue_merge_items() { |
|
|
|
|
* the merged polling island. |
|
|
|
|
*/ |
|
|
|
|
grpc_pollset_worker *worker = NULL; |
|
|
|
|
for (i = 0; i < num_closures; ++i) { |
|
|
|
|
for (i = 0; i < NUM_CLOSURES; ++i) { |
|
|
|
|
const gpr_timespec deadline = gpr_time_add( |
|
|
|
|
gpr_now(GPR_CLOCK_MONOTONIC), gpr_time_from_seconds(2, GPR_TIMESPAN)); |
|
|
|
|
gpr_mu_lock(pollsets[1].mu); |
|
|
|
@ -196,13 +198,17 @@ static void test_pollset_queue_merge_items() { |
|
|
|
|
gpr_now(GPR_CLOCK_MONOTONIC), deadline)); |
|
|
|
|
gpr_mu_unlock(pollsets[1].mu); |
|
|
|
|
} |
|
|
|
|
GPR_ASSERT(result == num_closures); |
|
|
|
|
GPR_ASSERT(result == NUM_CLOSURES); |
|
|
|
|
|
|
|
|
|
test_fd_cleanup(&exec_ctx, tfds, num_fds); |
|
|
|
|
test_pollset_cleanup(&exec_ctx, pollsets, num_pollsets); |
|
|
|
|
test_fd_cleanup(&exec_ctx, tfds, NUM_FDS); |
|
|
|
|
test_pollset_cleanup(&exec_ctx, pollsets, NUM_POLLSETS); |
|
|
|
|
grpc_exec_ctx_finish(&exec_ctx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#undef NUM_FDS |
|
|
|
|
#undef NUM_POLLSETS |
|
|
|
|
#undef NUM_CLOSURES |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Cases to test: |
|
|
|
|
* case 1) Polling islands of both fd and pollset are NULL |
|
|
|
@ -213,18 +219,20 @@ static void test_pollset_queue_merge_items() { |
|
|
|
|
* case 4.2) Polling islands of fd and pollset are NOT-equal (This results |
|
|
|
|
* in a merge) |
|
|
|
|
* */ |
|
|
|
|
|
|
|
|
|
#define NUM_FDS 8 |
|
|
|
|
#define NUM_POLLSETS 4 |
|
|
|
|
|
|
|
|
|
static void test_add_fd_to_pollset() { |
|
|
|
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; |
|
|
|
|
const int num_fds = 8; |
|
|
|
|
const int num_pollsets = 4; |
|
|
|
|
test_fd tfds[8 /* num_fds */]; |
|
|
|
|
int fds[8 /* num_fds */]; |
|
|
|
|
test_pollset pollsets[4 /* num_pollsets */]; |
|
|
|
|
test_fd tfds[NUM_FDS]; |
|
|
|
|
int fds[NUM_FDS]; |
|
|
|
|
test_pollset pollsets[NUM_POLLSETS]; |
|
|
|
|
void *expected_pi = NULL; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
test_fd_init(tfds, fds, num_fds); |
|
|
|
|
test_pollset_init(pollsets, num_pollsets); |
|
|
|
|
test_fd_init(tfds, fds, NUM_FDS); |
|
|
|
|
test_pollset_init(pollsets, NUM_POLLSETS); |
|
|
|
|
|
|
|
|
|
/*Step 1.
|
|
|
|
|
* Create three polling islands (This will exercise test case 1 and 2) with |
|
|
|
@ -285,22 +293,25 @@ static void test_add_fd_to_pollset() { |
|
|
|
|
|
|
|
|
|
/* Compare Fd:0's polling island with that of all other Fds */ |
|
|
|
|
expected_pi = grpc_fd_get_polling_island(tfds[0].fd); |
|
|
|
|
for (i = 1; i < num_fds; i++) { |
|
|
|
|
for (i = 1; i < NUM_FDS; i++) { |
|
|
|
|
GPR_ASSERT(grpc_are_polling_islands_equal( |
|
|
|
|
expected_pi, grpc_fd_get_polling_island(tfds[i].fd))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Compare Fd:0's polling island with that of all other pollsets */ |
|
|
|
|
for (i = 0; i < num_pollsets; i++) { |
|
|
|
|
for (i = 0; i < NUM_POLLSETS; i++) { |
|
|
|
|
GPR_ASSERT(grpc_are_polling_islands_equal( |
|
|
|
|
expected_pi, grpc_pollset_get_polling_island(pollsets[i].pollset))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
test_fd_cleanup(&exec_ctx, tfds, num_fds); |
|
|
|
|
test_pollset_cleanup(&exec_ctx, pollsets, num_pollsets); |
|
|
|
|
test_fd_cleanup(&exec_ctx, tfds, NUM_FDS); |
|
|
|
|
test_pollset_cleanup(&exec_ctx, pollsets, NUM_POLLSETS); |
|
|
|
|
grpc_exec_ctx_finish(&exec_ctx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#undef NUM_FDS |
|
|
|
|
#undef NUM_POLLSETS |
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) { |
|
|
|
|
const char *poll_strategy = NULL; |
|
|
|
|
grpc_test_init(argc, argv); |
|
|
|
|