Changeset 82ca986 for irc.c


Ignore:
Timestamp:
2010-07-27T17:45:16Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
f6f5eee
Parents:
a7dbf45
Message:

Fixed shutdown sequence (could cause 100% CPU usage on SIGTERM).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    ra7dbf45 r82ca986  
    161161void irc_abort( irc_t *irc, int immed, char *format, ... )
    162162{
     163        char *reason = NULL;
     164       
    163165        if( format != NULL )
    164166        {
    165167                va_list params;
    166                 char *reason;
    167168               
    168169                va_start( params, format );
    169170                reason = g_strdup_vprintf( format, params );
    170171                va_end( params );
    171                
    172                 if( !immed )
    173                         irc_write( irc, "ERROR :Closing link: %s", reason );
    174                
    175                 ipc_to_master_str( "OPERMSG :Client exiting: %s@%s [%s]\r\n",
    176                                    irc->user->nick ? irc->user->nick : "(NONE)", irc->user->host, reason );
    177                
    178                 g_free( reason );
     172        }
     173       
     174        irc_write( irc, "ERROR :Closing link: %s", reason ? : "" );
     175       
     176        ipc_to_master_str( "OPERMSG :Client exiting: %s@%s [%s]\r\n",
     177                           irc->user->nick ? irc->user->nick : "(NONE)",
     178                           irc->user->host, reason ? : "" );
     179       
     180        g_free( reason );
     181       
     182        irc_flush( irc );
     183        if( immed )
     184        {
     185                irc_free( irc );
    179186        }
    180187        else
    181188        {
    182                 if( !immed )
    183                         irc_write( irc, "ERROR :Closing link" );
    184                
    185                 ipc_to_master_str( "OPERMSG :Client exiting: %s@%s [%s]\r\n",
    186                                    irc->user->nick ? irc->user->nick : "(NONE)", irc->user->host, "No reason given" );
    187         }
    188        
     189                b_event_remove( irc->ping_source_id );
     190                irc->ping_source_id = b_timeout_add( 1, (b_event_handler) irc_free, irc );
     191        }
     192}
     193
     194static gboolean irc_free_hashkey( gpointer key, gpointer value, gpointer data );
     195
     196void irc_free( irc_t * irc )
     197{
    189198        irc->status |= USTATUS_SHUTDOWN;
    190         if( irc->sendbuffer && !immed )
    191         {
    192                 /* Set up a timeout event that should shut down the connection
    193                    in a second, just in case ..._write doesn't do it first. */
    194                
    195                 b_event_remove( irc->r_watch_source_id );
    196                 irc->r_watch_source_id = 0;
    197                
    198                 b_event_remove( irc->ping_source_id );
    199                 irc->ping_source_id = b_timeout_add( 1000, (b_event_handler) irc_free, irc );
    200         }
    201         else
    202         {
    203                 irc_free( irc );
    204         }
    205 }
    206 
    207 static gboolean irc_free_hashkey( gpointer key, gpointer value, gpointer data );
    208 
    209 void irc_free( irc_t * irc )
    210 {
     199       
    211200        log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd );
    212201       
Note: See TracChangeset for help on using the changeset viewer.