Skip to content

Commit

Permalink
PROTON-1104: Delay releasing timer and IPC pipes until pn_reactor_stop()
Browse files Browse the repository at this point in the history
  • Loading branch information
kgiusti committed Jan 26, 2016
1 parent 72b5f95 commit 8c6c7c5
Showing 1 changed file with 12 additions and 29 deletions.
41 changes: 12 additions & 29 deletions proton-c/src/reactor/reactor.c
Expand Up @@ -406,22 +406,14 @@ bool pn_reactor_process(pn_reactor_t *reactor) {
previous = reactor->previous = type;
pn_decref(event);
pn_collector_pop(reactor->collector);
} else {
if (pni_reactor_more(reactor)) {
if (previous != PN_REACTOR_QUIESCED && reactor->previous != PN_REACTOR_FINAL) {
pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_QUIESCED);
} else {
return true;
}
} else if (pni_reactor_more(reactor)) {
if (previous != PN_REACTOR_QUIESCED && reactor->previous != PN_REACTOR_FINAL) {
pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_QUIESCED);
} else {
if (reactor->selectable) {
pn_selectable_terminate(reactor->selectable);
pn_reactor_update(reactor, reactor->selectable);
reactor->selectable = NULL;
} else {
return false;
}
return true;
}
} else {
return false;
}
}
}
Expand All @@ -441,25 +433,11 @@ static void pni_timer_readable(pn_selectable_t *sel) {
pni_timer_expired(sel);
}

static void pni_timer_finalize(pn_selectable_t *sel) {
pn_reactor_t *reactor = pni_reactor(sel);
pn_socket_t fd = pn_selectable_get_fd(sel);
if (fd == reactor->wakeup[0]) {
for (int i = 0; i < 2; i++) {
if (reactor->wakeup[i] != PN_INVALID_SOCKET) {
pn_close(reactor->io, reactor->wakeup[i]);
reactor->wakeup[i] = PN_INVALID_SOCKET;
}
}
}
}

pn_selectable_t *pni_timer_selectable(pn_reactor_t *reactor) {
pn_selectable_t *sel = pn_reactor_selectable(reactor);
pn_selectable_set_fd(sel, reactor->wakeup[0]);
pn_selectable_on_readable(sel, pni_timer_readable);
pn_selectable_on_expired(sel, pni_timer_expired);
pn_selectable_on_finalize(sel, pni_timer_finalize);
pn_selectable_set_reading(sel, true);
pn_selectable_set_deadline(sel, pn_timer_deadline(reactor->timer));
pn_reactor_update(reactor, sel);
Expand All @@ -484,8 +462,13 @@ void pn_reactor_start(pn_reactor_t *reactor) {

void pn_reactor_stop(pn_reactor_t *reactor) {
assert(reactor);
if (reactor->selectable) {
pn_selectable_terminate(reactor->selectable);
pn_reactor_update(reactor, reactor->selectable);
reactor->selectable = NULL;
}
pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_FINAL);
// XXX: should consider removing this fron stop to avoid reentrance
// XXX: should consider removing this from stop to avoid reentrance
pn_reactor_process(reactor);
pn_collector_release(reactor->collector);
}
Expand Down

0 comments on commit 8c6c7c5

Please sign in to comment.