Ejemplo n.º 1
0
void thread_deregister( pthread_t pthreadId )
{
    BalancedBTreeItem_t    *item;
    Thread_t               *thread;

    item = BalancedBTreeFind( ThreadTree, (void *)&pthreadId, UNLOCKED, FALSE );
    if( !item ) {
        return;
    }

    BalancedBTreeRemove( ThreadTree, item, UNLOCKED, TRUE );
    thread = (Thread_t *)item->item;

    LogPrint( LOG_INFO, "Removed Thread %ld as \"%s\"", pthreadId, 
                        (char *)thread->name );

    if( thread->callbacks ) {
        memfree( thread->callbacks );
    }
    memfree( thread );
    memfree( item );

    if( !pthread_equal( pthread_self(), pthreadId ) ) {
        pthread_join( pthreadId, NULL );
    }
}
Ejemplo n.º 2
0
void cursesServerCleanup( void *arg )
{
    IRCServer_t            *server;
    BalancedBTreeItem_t    *item;
    int                     num;

    num = -1;
    item = BalancedBTreeFind( ServerTree, &num, UNLOCKED );
    if( !item ) {
        return;
    }

    BalancedBTreeRemove( ServerTree, item, UNLOCKED, TRUE );
    server = (IRCServer_t *)item->item;
    free( server->server );
    free( server->password );
    free( server->nick );
    free( server->username );
    free( server->realname );
    free( server->nickserv );
    free( server->nickservmsg );
    if( server->menuText ) {
        free( server->menuText );
    }
    free( server );
    free( item );
}
Ejemplo n.º 3
0
void BalancedBTreePrune( BalancedBTreeItem_t *item )
{
    if( !item ) {
        return;
    }

    /* Assumes a locked tree */
    if( item->left ) {
        BalancedBTreePrune( item->left );
    }

    if( item->right ) {
        BalancedBTreePrune( item->right );
    }

    BalancedBTreeRemove( item->btree, item, LOCKED, FALSE );
    free( item );
}
Ejemplo n.º 4
0
void versionRemove( char *what )
{
    BalancedBTreeItem_t    *item;
    Version_t              *vItem;
    
    item = BalancedBTreeFind( versionTree, &what, UNLOCKED );
    if( !item ) {
        return;
    }

    vItem = (Version_t *)item->item;
    vItem->count--;

    if( !vItem->count ) {
        BalancedBTreeRemove( versionTree, item, UNLOCKED, TRUE );

        free( vItem->what );
        free( vItem->version );
        free( vItem );
        free( item );
    }
}
Ejemplo n.º 5
0
bool pluginFlushUnvisited( BalancedBTreeItem_t *node )
{
    Plugin_t       *plugin;

    if( !node ) {
        return( FALSE );
    }

    if( pluginFlushUnvisited( node->left ) ) {
        /* Something was deleted on left side, restart at the root */
        return( TRUE );
    }

    plugin = (Plugin_t *)node->item;
    if( !plugin->visited ) {
        /* Remove it from the tree */
        BalancedBTreeRemove( node->btree, node, LOCKED, FALSE );

        if( plugin->loaded ) {
            pluginUnloadItem( plugin );
        }

        cursesMenuItemRemove( 2, MENU_PLUGINS, plugin->name );
        free( plugin->name );
        free( plugin->libName );
        free( plugin->args );
        free( plugin );
        free( node );
        return( TRUE );
    }

    if( pluginFlushUnvisited( node->right ) ) {
        /* Something was deleted on right side, restart at the root */
        return( TRUE );
    }

    return( FALSE );
}
Ejemplo n.º 6
0
void serverKill( BalancedBTreeItem_t *node, IRCServer_t *server, bool unalloc )
{
    LinkedListItem_t       *listItem, *next;
    IRCChannel_t           *channel;
    BalancedBTreeItem_t    *item;

    if( server->enabled || server->enabledChanged ) {
        server->threadAbort = TRUE;
        thread_deregister( server->txThreadId );
        thread_deregister( server->threadId );
        server->threadAbort = FALSE;
    }

    if( unalloc ) {
        BalancedBTreeRemove( node->btree, node, LOCKED, FALSE );
    } else {
        server->enabled = FALSE;
    }

    if( server->txQueue ) {
        /* This *might* leak the contents of any queue entries? */
        QueueClear( server->txQueue, TRUE );
        QueueLock( server->txQueue );
        QueueDestroy( server->txQueue );
        server->txQueue = NULL;
    }

    if( server->channels ) {
        LinkedListLock( server->channels );
        BalancedBTreeLock( server->channelName );
        BalancedBTreeLock( server->channelNum );

        for( listItem = server->channels->head; listItem; listItem = next ) {
            next = listItem->next;
            channel = (IRCChannel_t *)listItem;

            regexpBotCmdRemove( server, channel );
            LinkedListRemove( server->channels, listItem, LOCKED );

            item = BalancedBTreeFind( server->channelName, 
                                      &channel->channel, LOCKED );
            if( item ) {
                BalancedBTreeRemove( server->channelName, item, LOCKED, 
                                     FALSE );
            }

            item = BalancedBTreeFind( server->channelNum, 
                                      &channel->channelId, LOCKED );
            if( item ) {
                BalancedBTreeRemove( server->channelNum, item, LOCKED, 
                                     FALSE );
            }

            ThreadAllNotifyChannel( channel );

            cursesMenuItemRemove( 2, MENU_CHANNELS, channel->menuText );
            free( channel->menuText );
            free( channel->channel );
            free( channel->fullspec );
            free( channel->url );
            free( channel );
        }

        LinkedListDestroy( server->channels );
        BalancedBTreeDestroy( server->channelName );
        BalancedBTreeDestroy( server->channelNum );
        server->channels = NULL;
        server->channelName = NULL;
        server->channelNum = NULL;
    }

    if( unalloc ) {
        free( server->server );
        free( server->password );
        free( server->nick );
        free( server->username );
        free( server->realname );
        free( server->nickserv );
        free( server->nickservmsg );
        free( server->ircInfo.Server );
    }

    LinkedListLock( server->floodList );
    for( listItem = server->floodList->head; listItem; listItem = next ) {
        next = listItem->next;

        LinkedListRemove( server->floodList, listItem, LOCKED );
        free( listItem );
    }
    LinkedListDestroy( server->floodList );
    server->floodList = NULL;

    ThreadAllNotifyServer( server );

    if( unalloc ) {
        cursesMenuItemRemove( 2, MENU_SERVERS, server->menuText );
        free( server->menuText );
        free( server->threadName );
        free( server->txThreadName );
        free( server );
        free( node );
    }
}
Ejemplo n.º 7
0
void botSighup( int signum, void *arg )
{
    IRCServer_t            *server;
    LinkedListItem_t       *listItem, *next;
    BalancedBTreeItem_t    *item;
    IRCChannel_t           *channel;
    bool                    newChannel = FALSE;

    server = (IRCServer_t *)arg;
    if( !server ) {
        return;
    }

    /*
     * Check each channel on the server, leave those no longer needed
     */
    if( server->channels ) {
        LinkedListLock( server->channels );
        BalancedBTreeLock( server->channelName );
        BalancedBTreeLock( server->channelNum );

        for( listItem = server->channels->head; listItem; listItem = next ) {
            next = listItem->next;
            channel = (IRCChannel_t *)listItem;

            if( !channel->visited ) {
                channelLeave( server, channel, channel->channel );
                regexpBotCmdRemove( server, channel );
                LinkedListRemove( server->channels, listItem, LOCKED );

                item = BalancedBTreeFind( server->channelName, 
                                          &channel->channel, LOCKED );
                if( item ) {
                    BalancedBTreeRemove( server->channelName, item, LOCKED,
                                         FALSE );
                }

                item = BalancedBTreeFind( server->channelNum,
                                          &channel->channelId, LOCKED );
                if( item ) {
                    BalancedBTreeRemove( server->channelNum, item, LOCKED,
                                         FALSE );
                }

                ThreadAllNotifyChannel( channel );

                cursesMenuItemRemove( 2, MENU_CHANNELS, channel->menuText );
                free( channel->menuText );
                free( channel->channel );
                free( channel->fullspec );
                free( channel->url );
                free( channel );
            } else if( channel->newChannel && channel->enabled && 
                       !channel->joined && !newChannel ) {
                newChannel = TRUE;
                transmitMsg( server, TX_JOIN, channel->channel, NULL );
            } else if( channel->newChannel && !channel->enabled ) {
                channel->newChannel = FALSE;
            }
        }
        BalancedBTreeUnlock( server->channelNum );
        BalancedBTreeUnlock( server->channelName );
        LinkedListUnlock( server->channels );
    }
}