PROTON-1798: [c] Fix benign race in broker.c example found by tsan
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c6db6358 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c6db6358 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c6db6358 Branch: refs/heads/master Commit: c6db635838f0abb67eb37bf565d4072870e1fe9d Parents: 407711a Author: Alan Conway <acon...@redhat.com> Authored: Tue Sep 4 19:32:59 2018 -0400 Committer: Alan Conway <acon...@redhat.com> Committed: Fri Sep 7 11:26:25 2018 -0400 ---------------------------------------------------------------------- c/examples/broker.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c6db6358/c/examples/broker.c ---------------------------------------------------------------------- diff --git a/c/examples/broker.c b/c/examples/broker.c index 69dc536..6ffe8ed 100644 --- a/c/examples/broker.c +++ b/c/examples/broker.c @@ -216,7 +216,6 @@ typedef struct broker_t { size_t threads; const char *container_id; /* AMQP container-id */ queues_t queues; - bool finished; pn_ssl_domain_t *ssl_domain; } broker_t; @@ -276,14 +275,14 @@ static void session_unsub(broker_t *b, pn_session_t *ssn) { static void check_condition(pn_event_t *e, pn_condition_t *cond) { if (pn_condition_is_set(cond)) { - fprintf(stderr, "%s: %s: %s\n", pn_event_type_name(pn_event_type(e)), - pn_condition_get_name(cond), pn_condition_get_description(cond)); + printf("%s: %s: %s\n", pn_event_type_name(pn_event_type(e)), + pn_condition_get_name(cond), pn_condition_get_description(cond)); } } const int WINDOW=5; /* Very small incoming credit window, to show flow control in action */ -static void handle(broker_t* b, pn_event_t* e) { +static bool handle(broker_t* b, pn_event_t* e) { pn_connection_t *c = pn_event_connection(e); switch (pn_event_type(e)) { @@ -418,25 +417,26 @@ static void handle(broker_t* b, pn_event_t* e) { break; case PN_PROACTOR_INTERRUPT: - b->finished = true; pn_proactor_interrupt(b->proactor); /* Pass along the interrupt to the other threads */ - break; + return false; default: break; } + return true; } static void* broker_thread(void *void_broker) { broker_t *b = (broker_t*)void_broker; + bool finished = false; do { pn_event_batch_t *events = pn_proactor_wait(b->proactor); pn_event_t *e; while ((e = pn_event_batch_next(events))) { - handle(b, e); + if (!handle(b, e)) finished = true; } pn_proactor_done(b->proactor, events); - } while(!b->finished); + } while(!finished); return NULL; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org