Skip to content
This repository has been archived by the owner on Nov 10, 2021. It is now read-only.

Commit

Permalink
Add remove observer logic when delete resource.
Browse files Browse the repository at this point in the history
In case of deleting resource using oc_delete_resource(),
add remove observer logic in delete resource logic.
If observer is not removed when delete resource, it will
occur crash when remove every observers from shutdown(because
observer has resource pointer in their member struct).

Change-Id: Ic71b90b76fce43df2ca7d8aa2a3904d892959044
Signed-off-by: Jaehyun Cho <jaehyun3.cho@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/26575
Tested-by: IoTivity Jenkins <jenkins-daemon@iotivity.org>
Reviewed-by: Jaehong Jo <jaehong.jo@samsung.com>
Reviewed-by: Kishen Maloor <kishen.maloor@intel.com>
  • Loading branch information
looksgoood authored and kmaloor committed Aug 13, 2018
1 parent da62cb7 commit 22bbbc9
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 0 deletions.
3 changes: 3 additions & 0 deletions api/oc_ri.c
Expand Up @@ -316,6 +316,9 @@ oc_ri_delete_resource(oc_resource_t *resource)
if (!resource)
return false;

if (resource->num_observers > 0) {
coap_remove_observer_by_resource(resource);
}
oc_list_remove(app_resources, resource);
oc_ri_free_resource_properties(resource);
oc_memb_free(&app_resources_s, resource);
Expand Down
20 changes: 20 additions & 0 deletions messaging/coap/observe.c
Expand Up @@ -246,6 +246,26 @@ coap_remove_observer_by_mid(oc_endpoint_t *endpoint, uint16_t mid)
OC_DBG("Removed %d observers", removed);
return removed;
}
/*---------------------------------------------------------------------------*/
int
coap_remove_observer_by_resource(const oc_resource_t *rsc)
{
int removed = 0;
coap_observer_t *obs = (coap_observer_t *)oc_list_head(observers_list), *next;

while (obs) {
next = obs->next;
if ((obs->resource == rsc) && (oc_string(rsc->uri) &&
memcmp(obs->url, oc_string(rsc->uri) + 1,
oc_string_len(rsc->uri) - 1) == 0)) {
obs->resource->num_observers--;
coap_remove_observer(obs);
removed++;
}
obs = next;
}
return removed;
}

/*---------------------------------------------------------------------------*/
/*- Notification ------------------------------------------------------------*/
Expand Down
1 change: 1 addition & 0 deletions messaging/coap/observe.h
Expand Up @@ -83,6 +83,7 @@ int coap_remove_observer_by_client(oc_endpoint_t *endpoint);
int coap_remove_observer_by_token(oc_endpoint_t *endpoint, uint8_t *token,
size_t token_len);
int coap_remove_observer_by_mid(oc_endpoint_t *endpoint, uint16_t mid);
int coap_remove_observer_by_resource(const oc_resource_t *rsc);
void coap_free_all_observers(void);

int coap_notify_observers(oc_resource_t *resource,
Expand Down

0 comments on commit 22bbbc9

Please sign in to comment.