diff options
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/my_fopen.c | 1 | ||||
-rw-r--r-- | mysys/my_open.c | 1 | ||||
-rw-r--r-- | mysys/my_static.c | 1 | ||||
-rw-r--r-- | mysys/thr_alarm.c | 51 |
4 files changed, 45 insertions, 9 deletions
diff --git a/mysys/my_fopen.c b/mysys/my_fopen.c index 09f710c1ef4..44156da6ae3 100644 --- a/mysys/my_fopen.c +++ b/mysys/my_fopen.c @@ -76,6 +76,7 @@ FILE *my_fopen(const char *filename, int flags, myf MyFlags) my_strdup(filename,MyFlags))) { my_stream_opened++; + my_file_total_opened++; my_file_info[fileno(fd)].type = STREAM_BY_FOPEN; pthread_mutex_unlock(&THR_LOCK_open); DBUG_PRINT("exit",("stream: 0x%lx", (long) fd)); diff --git a/mysys/my_open.c b/mysys/my_open.c index 5ad48e66b68..938dbc5dde2 100644 --- a/mysys/my_open.c +++ b/mysys/my_open.c @@ -151,6 +151,7 @@ File my_register_filename(File fd, const char *FileName, enum file_type if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags))) { my_file_opened++; + my_file_total_opened++; my_file_info[fd].type = type_of_file; #if defined(THREAD) && !defined(HAVE_PREAD) pthread_mutex_init(&my_file_info[fd].mutex,MY_MUTEX_INIT_FAST); diff --git a/mysys/my_static.c b/mysys/my_static.c index b8bff0e9810..cb482b19b57 100644 --- a/mysys/my_static.c +++ b/mysys/my_static.c @@ -30,6 +30,7 @@ const char *my_progname=0; char NEAR curr_dir[FN_REFLEN]= {0}, NEAR home_dir_buff[FN_REFLEN]= {0}; ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0; +ulong my_file_total_opened= 0; int NEAR my_umask=0664, NEAR my_umask_dir=0777; #ifndef THREAD int NEAR my_errno=0; diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c index 2934e724724..afa5aadece7 100644 --- a/mysys/thr_alarm.c +++ b/mysys/thr_alarm.c @@ -38,7 +38,7 @@ uint thr_client_alarm; static int alarm_aborted=1; /* No alarm thread */ my_bool thr_alarm_inited= 0; volatile my_bool alarm_thread_running= 0; - +time_t next_alarm_expire_time= ~ (time_t) 0; static sig_handler process_alarm_part2(int sig); #if !defined(__WIN__) @@ -71,6 +71,7 @@ void init_thr_alarm(uint max_alarms) sigset_t s; DBUG_ENTER("init_thr_alarm"); alarm_aborted=0; + next_alarm_expire_time= ~ (time_t) 0; init_queue(&alarm_queue,max_alarms+1,offsetof(ALARM,expire_time),0, compare_ulong,NullS); sigfillset(&full_signal_set); /* Neaded to block signals */ @@ -150,22 +151,28 @@ void resize_thr_alarm(uint max_alarms) my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data) { - ulong now; + time_t now; +#ifndef USE_ONE_SIGNAL_HAND sigset_t old_mask; +#endif my_bool reschedule; struct st_my_thread_var *current_my_thread_var= my_thread_var; DBUG_ENTER("thr_alarm"); DBUG_PRINT("enter",("thread: %s sec: %d",my_thread_name(),sec)); - now=(ulong) my_time(0); + now= my_time(0); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask); +#endif pthread_mutex_lock(&LOCK_alarm); /* Lock from threads & alarms */ if (alarm_aborted > 0) { /* No signal thread */ DBUG_PRINT("info", ("alarm aborted")); *alrm= 0; /* No alarm */ pthread_mutex_unlock(&LOCK_alarm); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_SETMASK,&old_mask,NULL); +#endif DBUG_RETURN(1); } if (alarm_aborted < 0) @@ -179,14 +186,14 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data) fprintf(stderr,"Warning: thr_alarm queue is full\n"); *alrm= 0; /* No alarm */ pthread_mutex_unlock(&LOCK_alarm); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_SETMASK,&old_mask,NULL); +#endif DBUG_RETURN(1); } max_used_alarms=alarm_queue.elements+1; } - reschedule= (!alarm_queue.elements || - (int) (((ALARM*) queue_top(&alarm_queue))->expire_time - now) > - (int) sec); + reschedule= (ulong) next_alarm_expire_time > (ulong) now + sec; if (!alarm_data) { if (!(alarm_data=(ALARM*) my_malloc(sizeof(ALARM),MYF(MY_WME)))) @@ -194,7 +201,9 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data) DBUG_PRINT("info", ("failed my_malloc()")); *alrm= 0; /* No alarm */ pthread_mutex_unlock(&LOCK_alarm); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_SETMASK,&old_mask,NULL); +#endif DBUG_RETURN(1); } alarm_data->malloced=1; @@ -212,12 +221,17 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data) { DBUG_PRINT("info", ("reschedule")); if (pthread_equal(pthread_self(),alarm_thread)) + { alarm(sec); /* purecov: inspected */ + next_alarm_expire_time= now + sec; + } else reschedule_alarms(); /* Reschedule alarms */ } pthread_mutex_unlock(&LOCK_alarm); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_SETMASK,&old_mask,NULL); +#endif (*alrm)= &alarm_data->alarmed; DBUG_RETURN(0); } @@ -230,11 +244,15 @@ my_bool thr_alarm(thr_alarm_t *alrm, uint sec, ALARM *alarm_data) void thr_end_alarm(thr_alarm_t *alarmed) { ALARM *alarm_data; +#ifndef USE_ONE_SIGNAL_HAND sigset_t old_mask; +#endif uint i, found=0; DBUG_ENTER("thr_end_alarm"); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_BLOCK,&full_signal_set,&old_mask); +#endif pthread_mutex_lock(&LOCK_alarm); alarm_data= (ALARM*) ((uchar*) *alarmed - offsetof(ALARM,alarmed)); @@ -261,7 +279,9 @@ void thr_end_alarm(thr_alarm_t *alarmed) (long) *alarmed)); } pthread_mutex_unlock(&LOCK_alarm); +#ifndef USE_ONE_SIGNAL_HAND pthread_sigmask(SIG_SETMASK,&old_mask,NULL); +#endif DBUG_VOID_RETURN; } @@ -380,10 +400,18 @@ static sig_handler process_alarm_part2(int sig __attribute__((unused))) alarm(0); /* Remove old alarm */ #endif alarm((uint) (alarm_data->expire_time-now)); + next_alarm_expire_time= alarm_data->expire_time; } #endif } } + else + { + /* + Ensure that next time we call thr_alarm(), we will schedule a new alarm + */ + next_alarm_expire_time= ~(time_t) 0; + } DBUG_VOID_RETURN; } @@ -537,6 +565,7 @@ static void *alarm_handler(void *arg __attribute__((unused))) { abstime.tv_sec=sleep_time; abstime.tv_nsec=0; + next_alarm_expire_time= sleep_time; if ((error=pthread_cond_timedwait(&COND_alarm,&LOCK_alarm,&abstime)) && error != ETIME && error != ETIMEDOUT) { @@ -549,12 +578,16 @@ static void *alarm_handler(void *arg __attribute__((unused))) } else if (alarm_aborted == -1) break; - else if ((error=pthread_cond_wait(&COND_alarm,&LOCK_alarm))) + else { + next_alarm_expire_time= ~ (time_t) 0; + if ((error=pthread_cond_wait(&COND_alarm,&LOCK_alarm))) + { #ifdef MAIN - printf("Got error: %d from ptread_cond_wait (errno: %d)\n", - error,errno); + printf("Got error: %d from ptread_cond_wait (errno: %d)\n", + error,errno); #endif + } } process_alarm(0); } |