rendered paste bodystatic void send_monitor_end_messages(co_monitor_t *cmon)
{
co_manager_open_desc_t opened;
int i;
co_os_mutex_acquire(cmon->connected_modules_write_lock);
for (i = 0; i < CO_MONITOR_MODULES_COUNT; i++) {
opened = cmon->connected_modules[i];
if (!opened)
continue;
co_manager_send_eof(cmon->manager, opened);
cmon->connected_modules[i] = NULL; <--- !!! Crash !!!
co_manager_close(cmon->manager, opened);
}
co_os_mutex_release(cmon->connected_modules_write_lock);
}
co_rc_t co_monitor_refdown(co_monitor_t *cmon, bool_t user_context, bool_t monitor_owner)
{
co_manager_t *manager;
int new_count;
bool_t destroy = PFALSE;
bool_t end_messages = PFALSE;
manager = cmon->manager;
co_os_mutex_acquire(manager->lock);
new_count = cmon->refcount;
if (new_count > 0) {
cmon->refcount--;
if (monitor_owner && cmon->listed_in_manager) {
cmon->listed_in_manager = PFALSE;
manager->monitors_count--;
co_list_del(&cmon->node);
}
if (monitor_owner)
end_messages = PTRUE;
if (cmon->refcount == 0) {
destroy = PTRUE;
}
}
co_os_mutex_release(manager->lock);
if (end_messages)
send_monitor_end_messages(cmon);
if (destroy) {
return co_monitor_destroy(cmon, monitor_owner);
}
return CO_RC(OK);
}