#define UNIT_TESTING
#include <cmocka.h>
+#include <isc/atomic.h>
#include <isc/platform.h>
#include <isc/socket.h>
#include <isc/task.h>
}
typedef struct {
- bool done;
+ atomic_bool done;
isc_result_t result;
isc_socket_t *socket;
} completion_t;
static void
completion_init(completion_t *completion) {
- completion->done = false;
+ atomic_store(&completion->done, false);
completion->socket = NULL;
}
UNUSED(task);
completion->result = nevent->result;
- completion->done = true;
+ atomic_store(&completion->done, true);
if (completion->result == ISC_R_SUCCESS) {
completion->socket = nevent->newsocket;
}
default:
assert_false(true);
}
- completion->done = true;
+ atomic_store(&completion->done, true);
isc_event_free(&event);
}
static isc_result_t
waitfor(completion_t *completion) {
int i = 0;
- while (!completion->done && i++ < 5000) {
+ while (!atomic_load(&completion->done) && i++ < 5000) {
isc_test_nap(1000);
}
- if (completion->done) {
+ if (atomic_load(&completion->done)) {
return (ISC_R_SUCCESS);
}
return (ISC_R_FAILURE);
waitfor2(completion_t *c1, completion_t *c2) {
int i = 0;
- while (!(c1->done && c2->done) && i++ < 5000) {
+ while (!(atomic_load(&c1->done) &&
+ atomic_load(&c2->done)) &&
+ i++ < 5000)
+ {
waitbody();
}
- if (c1->done && c2->done) {
+ if (atomic_load(&c1->done) && atomic_load(&c2->done)) {
return (ISC_R_SUCCESS);
}
return (ISC_R_FAILURE);
&addr2, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
&addr2, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
snprintf(sendbuf, sizeof(sendbuf), "World");
&addr2, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
result = isc_socket_recv(s3, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "World");
result = isc_socket_sendto2(s1, &r, task, &addr2, NULL, socketevent, 0);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
result = isc_socket_sendto2(s1, &r, task, &addr2, NULL, socketevent, 0);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
if ((isc_net_probedscp() & ISC_NET_DSCPRECVV6) != 0) {
result = isc_socket_connect(s2, &addr1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor2(&completion, &completion2);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
- assert_true(completion2.done);
+ assert_true(atomic_load(&completion2.done));
assert_int_equal(completion2.result, ISC_R_SUCCESS);
s3 = completion2.socket;
NULL, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s3, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
result = isc_socket_connect(s2, &addr1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor2(&completion, &completion2);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
- assert_true(completion2.done);
+ assert_true(atomic_load(&completion2.done));
assert_int_equal(completion2.result, ISC_R_SUCCESS);
s3 = completion2.socket;
NULL, NULL);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s3, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
result = isc_socket_sendto2(s1, &r, task, &addr2, NULL, socketevent, 0);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
assert_false(recv_trunc);
result = isc_socket_sendto2(s1, &r, task, &addr2, NULL, socketevent, 0);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
r.base = (void *) recvbuf;
result = isc_socket_recv(s2, &r, 1, task, event_done, &completion);
assert_int_equal(result, ISC_R_SUCCESS);
waitfor(&completion);
- assert_true(completion.done);
+ assert_true(atomic_load(&completion.done));
assert_int_equal(completion.result, ISC_R_SUCCESS);
assert_string_equal(recvbuf, "Hello");
assert_true(recv_trunc);