summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysys/thr_alarm.c36
-rw-r--r--readline/display.c2
-rw-r--r--sql/net_serv.cc20
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. */