Skip to content

Commit 5f98235

Browse files
improve trigger subscription performance
1 parent fee6247 commit 5f98235

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/session/subscription.c

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ static z_result_t _z_trigger_subscriptions_inner(_z_session_t *zn, _z_subscriber
245245
z_reliability_t reliability) {
246246
// Retrieve sub infos
247247
_z_subscription_cache_data_t sub_infos = _z_subscription_cache_data_null();
248-
sub_infos.ke_in = _z_keyexpr_alias(keyexpr);
249-
_Z_CLEAN_RETURN_IF_ERR(_z_subscription_get_infos(zn, sub_kind, &sub_infos), _z_keyexpr_clear(keyexpr);
248+
sub_infos.ke_in = _z_keyexpr_steal(keyexpr);
249+
_Z_CLEAN_RETURN_IF_ERR(_z_subscription_get_infos(zn, sub_kind, &sub_infos), _z_keyexpr_clear(&sub_infos.ke_in);
250250
_z_encoding_clear(encoding); _z_bytes_drop(payload); _z_bytes_drop(attachment););
251251
// Check if there are subs
252252
_Z_DEBUG("Triggering %ju subs for key %d - %.*s", (uintmax_t)sub_infos.sub_nb, sub_infos.ke_out._id,
@@ -257,25 +257,31 @@ static z_result_t _z_trigger_subscriptions_inner(_z_session_t *zn, _z_subscriber
257257

258258
z_result_t ret = _Z_RES_OK;
259259
// Parse subscription infos svec
260-
for (size_t i = 0; i < sub_infos.sub_nb; i++) {
261-
_z_subscription_infos_t *sub_info = _z_subscription_infos_svec_get(&sub_infos.infos, i);
262-
if (i + 1 == sub_infos.sub_nb) {
263-
sub_info->callback(&sample, sub_info->arg);
264-
} else {
265-
_z_sample_t sample_copy;
266-
ret = _z_sample_copy(&sample_copy, &sample);
267-
if (ret != _Z_RES_OK) {
268-
break;
260+
if (sub_infos.sub_nb == 1) {
261+
_z_subscription_infos_t *sub_info = _z_subscription_infos_svec_get(&sub_infos.infos, 0);
262+
sub_info->callback(&sample, sub_info->arg);
263+
} else {
264+
for (size_t i = 0; i < sub_infos.sub_nb; i++) {
265+
_z_subscription_infos_t *sub_info = _z_subscription_infos_svec_get(&sub_infos.infos, i);
266+
if (i + 1 == sub_infos.sub_nb) {
267+
sub_info->callback(&sample, sub_info->arg);
268+
} else {
269+
_z_sample_t sample_copy;
270+
ret = _z_sample_copy(&sample_copy, &sample);
271+
if (ret != _Z_RES_OK) {
272+
break;
273+
}
274+
sub_info->callback(&sample_copy, sub_info->arg);
275+
_z_sample_clear(&sample_copy);
269276
}
270-
sub_info->callback(&sample_copy, sub_info->arg);
271-
_z_sample_clear(&sample_copy);
272277
}
273278
}
274279
_z_sample_clear(&sample);
275280
#if Z_FEATURE_RX_CACHE == 0
276281
_z_subscription_infos_svec_release(&sub_infos.infos);
282+
#else
283+
_z_keyexpr_clear(&sub_infos.ke_in);
277284
#endif
278-
_z_keyexpr_clear(keyexpr);
279285
return ret;
280286
}
281287

0 commit comments

Comments
 (0)