static 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); }