diff options
-rw-r--r-- | mysys/thr_alarm.c | 36 | ||||
-rw-r--r-- | readline/display.c | 2 | ||||
-rw-r--r-- | sql/net_serv.cc | 20 |
3 files changed, 38 insertions, 20 deletions
diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c index 902b8212cca..11e6fa97ab6 100644 --- a/mysys/thr_alarm.c +++ b/mysys/thr_alarm.c @@ -39,6 +39,8 @@ static my_bool alarm_aborted=1; my_bool thr_alarm_inited=0; +static sig_handler process_alarm_part2(int sig); + #if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) static pthread_mutex_t LOCK_alarm; @@ -244,8 +246,6 @@ void thr_end_alarm(thr_alarm_t *alarmed) sig_handler process_alarm(int sig __attribute__((unused))) { sigset_t old_mask; - ALARM *alarm_data; - /* This must be first as we can't call DBUG inside an alarm for a normal thread */ @@ -262,11 +262,33 @@ sig_handler process_alarm(int sig __attribute__((unused))) return; } #endif - { + + /* + We have to do do the handling of the alarm in a sub function, + because otherwise we would get problems with two threads calling + DBUG_... functions at the same time (as two threads may call + process_alarm() at the same time + */ + #ifndef USE_ALARM_THREAD pthread_sigmask(SIG_SETMASK,&full_signal_set,&old_mask); pthread_mutex_lock(&LOCK_alarm); #endif + process_alarm_part2(sig); +#ifndef USE_ALARM_THREAD +#if defined(DONT_REMEMBER_SIGNAL) && !defined(USE_ONE_SIGNAL_HAND) + sigset(THR_SERVER_ALARM,process_alarm); +#endif + pthread_mutex_unlock(&LOCK_alarm); + pthread_sigmask(SIG_SETMASK,&old_mask,NULL); +#endif + return; +} + + +static sig_handler process_alarm_part2(int sig __attribute__((unused))) +{ + ALARM *alarm_data; DBUG_ENTER("process_alarm"); DBUG_PRINT("info",("sig: %d active alarms: %d",sig,alarm_queue.elements)); @@ -333,15 +355,7 @@ sig_handler process_alarm(int sig __attribute__((unused))) #endif } } -#ifndef USE_ALARM_THREAD -#if defined(DONT_REMEMBER_SIGNAL) && !defined(USE_ONE_SIGNAL_HAND) - sigset(THR_SERVER_ALARM,process_alarm); -#endif - pthread_mutex_unlock(&LOCK_alarm); - pthread_sigmask(SIG_SETMASK,&old_mask,NULL); -#endif DBUG_VOID_RETURN; - } } diff --git a/readline/display.c b/readline/display.c index e21af1f472d..df9e212ac0c 100644 --- a/readline/display.c +++ b/readline/display.c @@ -623,7 +623,7 @@ rl_redisplay () _rl_move_vert (linenum); _rl_move_cursor_relative (0, tt); _rl_clear_to_eol - ((linenum == _rl_vis_botlin) ? strlen (tt) : screenwidth); + ((linenum == _rl_vis_botlin) ? (int) strlen (tt) : screenwidth); } } _rl_vis_botlin = inv_botlin; diff --git a/sql/net_serv.cc b/sql/net_serv.cc index da4f75e74b5..bb7100f31be 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -162,20 +162,24 @@ static my_bool net_realloc(NET *net, ulong length) void net_clear(NET *net) { + DBUG_ENTER("net_clear"); #if !defined(EXTRA_DEBUG) && !defined(EMBEDDED_LIBRARY) - int count; /* One may get 'unused' warn */ - my_bool old_mode; - if (!vio_blocking(net->vio, FALSE, &old_mode)) { - while ( (count = vio_read(net->vio, (char*) (net->buff), - (uint32) net->max_packet)) > 0) - DBUG_PRINT("info",("skipped %d bytes from file: %s", - count,vio_description(net->vio))); - vio_blocking(net->vio, TRUE, &old_mode); + int count; /* One may get 'unused' warn */ + my_bool old_mode; + if (!vio_blocking(net->vio, FALSE, &old_mode)) + { + while ((count = vio_read(net->vio, (char*) (net->buff), + (uint32) net->max_packet)) > 0) + DBUG_PRINT("info",("skipped %d bytes from file: %s", + count, vio_description(net->vio))); + vio_blocking(net->vio, TRUE, &old_mode); + } } #endif /* EXTRA_DEBUG */ net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */ net->write_pos=net->buff; + DBUG_VOID_RETURN; } /* Flush write_buffer if not empty. */ |