diff options
author | unknown <jani@hynda.mysql.fi> | 2007-08-22 17:29:38 +0300 |
---|---|---|
committer | unknown <jani@hynda.mysql.fi> | 2007-08-22 17:29:38 +0300 |
commit | b3dd7d5ca6f501210ca7f0f98c2029376c42e03c (patch) | |
tree | eb1ce9100b55c8b26a72392c57e84461668936c7 /mysys | |
parent | 7dd4e789586bef5141e1a1d4da4b7efc271708aa (diff) | |
parent | edf4fccf98ce701a984e13e2c7bd174a15226ed4 (diff) | |
download | mariadb-git-b3dd7d5ca6f501210ca7f0f98c2029376c42e03c.tar.gz |
Merge hynda.mysql.fi:/home/my/mysql-5.1-main
into hynda.mysql.fi:/home/my/mysql-5.1-marvel
client/mysqldump.c:
Auto merged
sql/event_db_repository.cc:
Auto merged
sql/event_queue.cc:
Auto merged
sql/field.cc:
Auto merged
sql/item.cc:
Auto merged
sql/item_subselect.cc:
Auto merged
sql/log_event.h:
Auto merged
sql/sp.cc:
Auto merged
sql/sql_class.cc:
Auto merged
sql/sql_db.cc:
Auto merged
sql/sql_handler.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_plugin.cc:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/table.h:
Auto merged
sql/sql_yacc.yy:
Manual merge with 5.1 main tree.
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/my_thr_init.c | 18 | ||||
-rw-r--r-- | mysys/thr_alarm.c | 51 |
5 files changed, 58 insertions, 14 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/my_thr_init.c b/mysys/my_thr_init.c index 8b935c895c8..1ba6e5ac92d 100644 --- a/mysys/my_thr_init.c +++ b/mysys/my_thr_init.c @@ -47,7 +47,7 @@ pthread_mutexattr_t my_fast_mutexattr; pthread_mutexattr_t my_errorcheck_mutexattr; #endif -#ifdef NPTL_PTHREAD_EXIT_BUG /* see my_pthread.h */ +#ifdef TARGET_OS_LINUX /* Dummy thread spawned in my_thread_global_init() below to avoid @@ -61,7 +61,8 @@ nptl_pthread_exit_hack_handler(void *arg __attribute((unused))) pthread_exit(0); return 0; } -#endif + +#endif /* TARGET_OS_LINUX */ static uint get_thread_lib(void); @@ -88,7 +89,7 @@ my_bool my_thread_global_init(void) return 1; } -#ifdef NPTL_PTHREAD_EXIT_BUG +#ifdef TARGET_OS_LINUX /* BUG#24507: Race conditions inside current NPTL pthread_exit() implementation. @@ -112,7 +113,7 @@ my_bool my_thread_global_init(void) pthread_create(&dummy_thread,&dummy_thread_attr, nptl_pthread_exit_hack_handler, NULL); } -#endif +#endif /* TARGET_OS_LINUX */ #ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP /* @@ -179,10 +180,17 @@ void my_thread_global_end(void) &abstime); if (error == ETIMEDOUT || error == ETIME) { +#ifdef HAVE_PTHREAD_KILL + /* + We shouldn't give an error here, because if we don't have + pthread_kill(), programs like mysqld can't ensure that all threads + are killed when we enter here. + */ if (THR_thread_count) fprintf(stderr, "Error in my_thread_global_end(): %d threads didn't exit\n", THR_thread_count); +#endif all_threads_killed= 0; break; } @@ -208,7 +216,7 @@ void my_thread_global_end(void) if (all_threads_killed) { pthread_mutex_destroy(&THR_LOCK_threads); - pthread_cond_destroy (&THR_COND_threads); + pthread_cond_destroy(&THR_COND_threads); } #if !defined(HAVE_LOCALTIME_R) || !defined(HAVE_GMTIME_R) pthread_mutex_destroy(&LOCK_localtime_r); 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); } |