Repository: qpid-proton Updated Branches: refs/heads/master 4f11a90e9 -> 15e0ae96a
added API to allow handling of error events like POLLHUP, POLLERR Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/15e0ae96 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/15e0ae96 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/15e0ae96 Branch: refs/heads/master Commit: 15e0ae96a7e884439c1eda93089e16e0d3128231 Parents: 4f11a90 Author: Rafael Schloming <[email protected]> Authored: Thu Jan 22 15:38:16 2015 -0500 Committer: Rafael Schloming <[email protected]> Committed: Thu Jan 22 15:38:16 2015 -0500 ---------------------------------------------------------------------- proton-c/bindings/python/proton/__init__.py | 1 + proton-c/include/proton/event.h | 1 + proton-c/include/proton/selectable.h | 8 ++++++++ proton-c/include/proton/selector.h | 1 + proton-c/src/events/event.c | 2 ++ proton-c/src/handlers/iohandler.c | 3 +++ proton-c/src/posix/selector.c | 3 +-- proton-c/src/reactor/connection.c | 7 +++++++ proton-c/src/selectable.c | 20 ++++++++++++++++++++ .../org/apache/qpid/proton/engine/Event.java | 1 + proton-j/src/main/resources/cengine.py | 1 + 11 files changed, 46 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/bindings/python/proton/__init__.py ---------------------------------------------------------------------- diff --git a/proton-c/bindings/python/proton/__init__.py b/proton-c/bindings/python/proton/__init__.py index d07fb6f..03bff98 100644 --- a/proton-c/bindings/python/proton/__init__.py +++ b/proton-c/bindings/python/proton/__init__.py @@ -3363,6 +3363,7 @@ class Event(Wrapper, EventBase): SELECTABLE_READABLE = EventType(PN_SELECTABLE_READABLE, "on_selectable_readable") SELECTABLE_WRITABLE = EventType(PN_SELECTABLE_WRITABLE, "on_selectable_writable") SELECTABLE_EXPIRED = EventType(PN_SELECTABLE_EXPIRED, "on_selectable_expired") + SELECTABLE_ERROR = EventType(PN_SELECTABLE_ERROR, "on_selectable_error") SELECTABLE_FINAL = EventType(PN_SELECTABLE_FINAL, "on_selectable_final") @staticmethod http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/include/proton/event.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/event.h b/proton-c/include/proton/event.h index a4d3d52..404a871 100644 --- a/proton-c/include/proton/event.h +++ b/proton-c/include/proton/event.h @@ -293,6 +293,7 @@ typedef enum { PN_SELECTABLE_UPDATED, PN_SELECTABLE_READABLE, PN_SELECTABLE_WRITABLE, + PN_SELECTABLE_ERROR, PN_SELECTABLE_EXPIRED, PN_SELECTABLE_FINAL http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/include/proton/selectable.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/selectable.h b/proton-c/include/proton/selectable.h index ac0416c..07cb212 100644 --- a/proton-c/include/proton/selectable.h +++ b/proton-c/include/proton/selectable.h @@ -96,6 +96,7 @@ PN_EXTERN pn_selectable_t *pn_selectable(void); PN_EXTERN void pn_selectable_on_readable(pn_selectable_t *sel, void (*readable)(pn_selectable_t *)); PN_EXTERN void pn_selectable_on_writable(pn_selectable_t *sel, void (*writable)(pn_selectable_t *)); PN_EXTERN void pn_selectable_on_expired(pn_selectable_t *sel, void (*expired)(pn_selectable_t *)); +PN_EXTERN void pn_selectable_on_error(pn_selectable_t *sel, void (*error)(pn_selectable_t *)); PN_EXTERN void pn_selectable_on_release(pn_selectable_t *sel, void (*release)(pn_selectable_t *)); PN_EXTERN void pn_selectable_on_finalize(pn_selectable_t *sel, void (*finalize)(pn_selectable_t *)); @@ -166,6 +167,13 @@ PN_EXTERN void pn_selectable_readable(pn_selectable_t *selectable); PN_EXTERN void pn_selectable_writable(pn_selectable_t *selectable); /** + * Notify a selectable that there is an error on the file descriptor. + * + * @param[in] selectable a selectable object + */ +PN_EXTERN void pn_selectable_error(pn_selectable_t *selectable); + +/** * Notify a selectable that its deadline has expired. * * @param[in] selectable a selectable object http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/include/proton/selector.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/selector.h b/proton-c/include/proton/selector.h index d0cc352..c942393 100644 --- a/proton-c/include/proton/selector.h +++ b/proton-c/include/proton/selector.h @@ -33,6 +33,7 @@ extern "C" { #define PN_READABLE (1) #define PN_WRITABLE (2) #define PN_EXPIRED (4) +#define PN_ERROR (8) pn_selector_t *pni_selector(void); PN_EXTERN void pn_selector_free(pn_selector_t *selector); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/src/events/event.c ---------------------------------------------------------------------- diff --git a/proton-c/src/events/event.c b/proton-c/src/events/event.c index 54ef92f..00ca8ff 100644 --- a/proton-c/src/events/event.c +++ b/proton-c/src/events/event.c @@ -330,6 +330,8 @@ const char *pn_event_type_name(pn_event_type_t type) return "PN_SELECTABLE_READABLE"; case PN_SELECTABLE_WRITABLE: return "PN_SELECTABLE_WRITABLE"; + case PN_SELECTABLE_ERROR: + return "PN_SELECTABLE_ERROR"; case PN_SELECTABLE_EXPIRED: return "PN_SELECTABLE_EXPIRED"; case PN_SELECTABLE_FINAL: http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/src/handlers/iohandler.c ---------------------------------------------------------------------- diff --git a/proton-c/src/handlers/iohandler.c b/proton-c/src/handlers/iohandler.c index 1983bd4..be976e5 100644 --- a/proton-c/src/handlers/iohandler.c +++ b/proton-c/src/handlers/iohandler.c @@ -42,6 +42,9 @@ void pni_handle_quiesced(pn_reactor_t *reactor, pn_selector_t *selector) { if (events & PN_EXPIRED) { pn_selectable_expired(sel); } + if (events & PN_ERROR) { + pn_selectable_error(sel); + } } pn_reactor_yield(reactor); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/src/posix/selector.c ---------------------------------------------------------------------- diff --git a/proton-c/src/posix/selector.c b/proton-c/src/posix/selector.c index db82f11..079df07 100644 --- a/proton-c/src/posix/selector.c +++ b/proton-c/src/posix/selector.c @@ -186,8 +186,7 @@ pn_selectable_t *pn_selector_next(pn_selector_t *selector, int *events) if ((pfd->revents & POLLERR) || (pfd->revents & POLLHUP) || (pfd->revents & POLLNVAL)) { - ev |= PN_READABLE; - ev |= PN_WRITABLE; + ev |= PN_ERROR; } if (pfd->revents & POLLOUT) { ev |= PN_WRITABLE; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/src/reactor/connection.c ---------------------------------------------------------------------- diff --git a/proton-c/src/reactor/connection.c b/proton-c/src/reactor/connection.c index 86b84e9..e5233fc 100644 --- a/proton-c/src/reactor/connection.c +++ b/proton-c/src/reactor/connection.c @@ -173,6 +173,12 @@ static void pni_connection_writable(pn_selectable_t *sel) } } +static void pni_connection_error(pn_selectable_t *sel) { + pn_reactor_t *reactor = (pn_reactor_t *) pni_selectable_get_context(sel); + pn_selectable_terminate(sel); + pn_reactor_update(reactor, sel); +} + static void pni_connection_expired(pn_selectable_t *sel) {} static void pni_connection_finalize(pn_selectable_t *sel) { @@ -189,6 +195,7 @@ pn_selectable_t *pn_reactor_selectable_transport(pn_reactor_t *reactor, pn_socke pn_selectable_set_fd(sel, sock); pn_selectable_on_readable(sel, pni_connection_readable); pn_selectable_on_writable(sel, pni_connection_writable); + pn_selectable_on_error(sel, pni_connection_error); pn_selectable_on_expired(sel, pni_connection_expired); pn_selectable_on_finalize(sel, pni_connection_finalize); pn_record_t *record = pn_selectable_attachments(sel); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-c/src/selectable.c ---------------------------------------------------------------------- diff --git a/proton-c/src/selectable.c b/proton-c/src/selectable.c index 94856ab..88a60f7 100644 --- a/proton-c/src/selectable.c +++ b/proton-c/src/selectable.c @@ -46,6 +46,7 @@ struct pn_selectable_t { pn_record_t *attachments; void (*readable)(pn_selectable_t *); void (*writable)(pn_selectable_t *); + void (*error)(pn_selectable_t *); void (*expired)(pn_selectable_t *); void (*release) (pn_selectable_t *); void (*finalize)(pn_selectable_t *); @@ -64,6 +65,7 @@ void pn_selectable_initialize(pn_selectable_t *sel) sel->attachments = pn_record(); sel->readable = NULL; sel->writable = NULL; + sel->error = NULL; sel->expired = NULL; sel->release = NULL; sel->finalize = NULL; @@ -135,6 +137,11 @@ void pn_selectable_on_writable(pn_selectable_t *sel, void (*writable)(pn_selecta sel->writable = writable; } +void pn_selectable_on_error(pn_selectable_t *sel, void (*error)(pn_selectable_t *)) { + assert(sel); + sel->error = error; +} + void pn_selectable_on_expired(pn_selectable_t *sel, void (*expired)(pn_selectable_t *)) { assert(sel); sel->expired = expired; @@ -206,6 +213,14 @@ void pn_selectable_writable(pn_selectable_t *selectable) } } +void pn_selectable_error(pn_selectable_t *selectable) +{ + assert(selectable); + if (selectable->error) { + selectable->error(selectable); + } +} + void pn_selectable_expired(pn_selectable_t *selectable) { assert(selectable); @@ -259,6 +274,10 @@ static void pni_writable(pn_selectable_t *selectable) { pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_WRITABLE); } +static void pni_error(pn_selectable_t *selectable) { + pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_ERROR); +} + static void pni_expired(pn_selectable_t *selectable) { pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_EXPIRED); } @@ -272,6 +291,7 @@ void pn_selectable_collect(pn_selectable_t *selectable, pn_collector_t *collecto if (collector) { pn_selectable_on_readable(selectable, pni_readable); pn_selectable_on_writable(selectable, pni_writable); + pn_selectable_on_error(selectable, pni_error); pn_selectable_on_expired(selectable, pni_expired); } } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java index ebbf648..ddb6937 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java @@ -75,6 +75,7 @@ public interface Event SELECTABLE_READABLE, SELECTABLE_WRITABLE, SELECTABLE_EXPIRED, + SELECTABLE_ERROR, SELECTABLE_FINAL } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/15e0ae96/proton-j/src/main/resources/cengine.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/cengine.py b/proton-j/src/main/resources/cengine.py index 69fe4dd..c7b6a7f 100644 --- a/proton-j/src/main/resources/cengine.py +++ b/proton-j/src/main/resources/cengine.py @@ -990,6 +990,7 @@ PN_SELECTABLE_UPDATED = Event.Type.SELECTABLE_UPDATED PN_SELECTABLE_READABLE = Event.Type.SELECTABLE_READABLE PN_SELECTABLE_WRITABLE = Event.Type.SELECTABLE_WRITABLE PN_SELECTABLE_EXPIRED = Event.Type.SELECTABLE_EXPIRED +PN_SELECTABLE_ERROR = Event.Type.SELECTABLE_ERROR PN_SELECTABLE_FINAL = Event.Type.SELECTABLE_FINAL def pn_collector(): --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
