Skip to content

Commit 2f6e9c9

Browse files
committed
fix(network_monitor): Delete previously allocated events in contiki
Now events are forwarded to C++ handler functions by reference, instead of pointers, it is safer to avoid potential use on null pointers. So now on, previously allocated (in post) user data are freed just after handling them. I am assuming that once events are posted, the owner is the contiki event loop, which should free events data once consumed by handler. In other works contiki is managing the lifecyle of user data. Note that once event if processed, the address still remain in contiki queue but no more referenced since the queue pointer is moving to the next one. A later change for contiki can explicitly set the consumed pointer to null in consumed queue cell. Relate-to: UIC-3659 Relate-to: SiliconLabsSoftware/z-wave-engine-application-layer#17 Signed-off-by: Philippe Coval <[email protected]>
1 parent 2f44f3f commit 2f6e9c9

File tree

1 file changed

+34
-24
lines changed

1 file changed

+34
-24
lines changed

applications/zpc/components/network_monitor/src/network_monitor.cpp

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -716,49 +716,44 @@ static void
716716
network_initialized = true;
717717
}
718718

719-
static void network_monitor_handle_event_network_ready(network_data *event_data)
719+
static void network_monitor_handle_event_network_ready(network_data const &event_data)
720720
{
721721
// Make sure that UNID / ZPC UNID are configured correctly.
722-
zwave_unid_set_home_id(event_data->home_id);
723-
zwave_unid_from_node_id(event_data->node_id, zpc_unid);
722+
zwave_unid_set_home_id(event_data.home_id);
723+
zwave_unid_from_node_id(event_data.node_id, zpc_unid);
724724

725725
// Save our updated granted keys/KEX fail
726726
network_monitor_create_attribute_store_network_nodes(
727-
event_data->granted_keys,
728-
event_data->kex_fail_type);
727+
event_data.granted_keys,
728+
event_data.kex_fail_type);
729729

730730
// Pause node resolution on any other network than ours in the Attribute Store.
731731
network_monitor_activate_network_resolution(true);
732-
733-
delete event_data;
734732
}
735733

736734
static void network_monitor_handle_event_node_id_assigned(
737-
node_id_assigned_event_data *event_data)
735+
node_id_assigned_event_data const &event_data)
738736
{
739737
network_monitor_add_attribute_store_node(
740-
event_data->node_id,
738+
event_data.node_id,
741739
ZCL_NODE_STATE_NETWORK_STATUS_COMMISIONING_STARTED);
742-
zwave_store_inclusion_protocol(event_data->node_id,
743-
event_data->inclusion_protocol);
744-
745-
delete event_data;
740+
zwave_store_inclusion_protocol(event_data.node_id,
741+
event_data.inclusion_protocol);
746742
}
747743

748744
static void
749-
network_monitor_handle_event_node_added(node_added_event_data *event_data)
745+
network_monitor_handle_event_node_added(node_added_event_data const &event_data)
750746
{
751747
// Attribute store node should already exist, but in case NODE_ID_ASSIGNED_EVENT
752748
// did not happen before this event, we ensure the node exists in the attribute store.
753-
network_monitor_update_new_node_attribute_store(*event_data);
749+
network_monitor_update_new_node_attribute_store(event_data);
754750

755-
zwave_store_inclusion_protocol(event_data->node_id,
756-
event_data->inclusion_protocol);
751+
zwave_store_inclusion_protocol(event_data.node_id,
752+
event_data.inclusion_protocol);
757753

758754
// Finally we want to update our local cache of the node list:
759755
zwave_network_management_get_network_node_list(current_node_list);
760756
// TODO: Add timeout system to detect node interview failed
761-
delete event_data;
762757
}
763758

764759
static void network_monitor_handle_event_node_interview_initiated(
@@ -1088,18 +1083,33 @@ PROCESS_THREAD(network_monitor_process, ev, data)
10881083
break;
10891084

10901085
case NETWORK_READY_EVENT:
1091-
network_monitor_handle_event_network_ready(
1092-
static_cast<network_data *>(data));
1086+
if (data) {
1087+
network_data const *event_data
1088+
= static_cast<network_data const *>(data);
1089+
data = NULL;
1090+
network_monitor_handle_event_network_ready(*event_data);
1091+
delete event_data; //< Allocated by network_monitor_on_network_ready
1092+
};
10931093
break;
10941094

10951095
case NODE_ID_ASSIGNED_EVENT:
1096-
network_monitor_handle_event_node_id_assigned(
1097-
static_cast<node_id_assigned_event_data *>(data));
1096+
if (data) {
1097+
node_id_assigned_event_data const *event_data
1098+
= static_cast<node_id_assigned_event_data const *>(data);
1099+
data = NULL;
1100+
network_monitor_handle_event_node_id_assigned(*event_data);
1101+
delete event_data; //< Allocated by network_monitor_on_node_id_assigned
1102+
};
10981103
break;
10991104

11001105
case NODE_ADDED_EVENT:
1101-
network_monitor_handle_event_node_added(
1102-
static_cast<node_added_event_data *>(data));
1106+
if (data) {
1107+
node_added_event_data const *event_data
1108+
= static_cast<node_added_event_data const *>(data);
1109+
data = NULL;
1110+
network_monitor_handle_event_node_added(*event_data);
1111+
delete event_data; //< Allocated by network_monitor_on_node_added
1112+
};
11031113
break;
11041114

11051115
case NODE_INTERVIEW_INITIATED_EVENT:

0 commit comments

Comments
 (0)