All pastes #433575 Raw Edit

Untitled

public text v1 · immutable
·published 2007-04-10 21:36 UTC
rendered paste body
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);
}