summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
c8cc0d6)
Allowing to subscribe to a request that was replied
was possible and lead to problem revealed by issues
SPEC-2542 and SPEC-2599 (these issues are more related
to processing unordered incoming messages).
The choice was
- fix the bug and authorize (un)subscribe after reply
- forbids to (un)subscribe after reply
Second solution was chosen for its simplicity and
its networking efficiency.
Bug-AGL: SPEC-2542
Bug-AGL: SPEC-2599
Change-Id: I09f48b760b1fd6f70d42b80df3c8053696c45966
Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
* Establishes for the client link identified by 'req' a subscription
* to the 'event'.
*
* Establishes for the client link identified by 'req' a subscription
* to the 'event'.
*
+ * Establishing subscription MUST be called BEFORE replying to the request.
+ *
* @param req the request
* @param event the event to subscribe
*
* @param req the request
* @param event the event to subscribe
*
* link identified by 'req'.
* Returns 0 in case of successful subscription or -1 in case of error.
*
* link identified by 'req'.
* Returns 0 in case of successful subscription or -1 in case of error.
*
+ * Revoking subscription MUST be called BEFORE replying to the request.
+ *
* @param req the request
* @param event the event to revoke
*
* @param req the request
* @param event the event to revoke
*
*
* Establishes for the client link identified by 'req' a subscription
* to the 'event'.
*
* Establishes for the client link identified by 'req' a subscription
* to the 'event'.
+ * Establishing subscriptions MUST be called BEFORE replying to the request.
* Returns 0 in case of successful subscription or -1 in case of error.
*/
static inline int afb_req_x1_subscribe(struct afb_req_x1 req, struct afb_event_x1 event)
* Returns 0 in case of successful subscription or -1 in case of error.
*/
static inline int afb_req_x1_subscribe(struct afb_req_x1 req, struct afb_event_x1 event)
*
* Revokes the subscription established to the 'event' for the client
* link identified by 'req'.
*
* Revokes the subscription established to the 'event' for the client
* link identified by 'req'.
+ * Revoking subscription MUST be called BEFORE replying to the request.
* Returns 0 in case of successful subscription or -1 in case of error.
*/
static inline int afb_req_x1_unsubscribe(struct afb_req_x1 req, struct afb_event_x1 event)
* Returns 0 in case of successful subscription or -1 in case of error.
*/
static inline int afb_req_x1_unsubscribe(struct afb_req_x1 req, struct afb_event_x1 event)
* Establishes for the client link identified by 'req' a subscription
* to the 'event'.
*
* Establishes for the client link identified by 'req' a subscription
* to the 'event'.
*
+ * Establishing subscription MUST be called BEFORE replying to the request.
+ *
* @param req the request
* @param event the event to subscribe
*
* @param req the request
* @param event the event to subscribe
*
* link identified by 'req'.
* Returns 0 in case of successful subscription or -1 in case of error.
*
* link identified by 'req'.
* Returns 0 in case of successful subscription or -1 in case of error.
*
+ * Revoking subscription MUST be called BEFORE replying to the request.
+ *
* @param req the request
* @param event the event to revoke
*
* @param req the request
* @param event the event to revoke
*
int afb_xreq_subscribe(struct afb_xreq *xreq, struct afb_event_x2 *event)
{
int afb_xreq_subscribe(struct afb_xreq *xreq, struct afb_event_x2 *event)
{
- if (xreq->listener)
- return afb_evt_event_x2_add_watch(xreq->listener, event);
- if (xreq->queryitf->subscribe)
- return xreq->queryitf->subscribe(xreq, event);
- ERROR("no event listener, subscription impossible");
- errno = EINVAL;
+ if (xreq->replied) {
+ ERROR("request replied, subscription impossible");
+ errno = EINVAL;
+ } else {
+ if (xreq->listener)
+ return afb_evt_event_x2_add_watch(xreq->listener, event);
+ if (xreq->queryitf->subscribe)
+ return xreq->queryitf->subscribe(xreq, event);
+ ERROR("no event listener, subscription impossible");
+ errno = ENOTSUP;
+ }
int afb_xreq_unsubscribe(struct afb_xreq *xreq, struct afb_event_x2 *event)
{
int afb_xreq_unsubscribe(struct afb_xreq *xreq, struct afb_event_x2 *event)
{
- if (xreq->listener)
- return afb_evt_event_x2_remove_watch(xreq->listener, event);
- if (xreq->queryitf->unsubscribe)
- return xreq->queryitf->unsubscribe(xreq, event);
- ERROR("no event listener, unsubscription impossible");
- errno = EINVAL;
+ if (xreq->replied) {
+ ERROR("request replied, unsubscription impossible");
+ errno = EINVAL;
+ } else {
+ if (xreq->listener)
+ return afb_evt_event_x2_remove_watch(xreq->listener, event);
+ if (xreq->queryitf->unsubscribe)
+ return xreq->queryitf->unsubscribe(xreq, event);
+ ERROR("no event listener, unsubscription impossible");
+ errno = ENOTSUP;
+ }