Commit a5a770c7 authored by brian@zim.(none)'s avatar brian@zim.(none)

Merge baker@bk-internal.mysql.com:/home/bk/mysql-5.1

into  zim.(none):/home/brian/mysql/cleanup-5.1
parents 02c25f80 b977471e
...@@ -35,9 +35,10 @@ ...@@ -35,9 +35,10 @@
/* Global Thread counter */ /* Global Thread counter */
int counter= 0; int counter;
#ifdef HAVE_LIBPTHREAD #ifdef HAVE_LIBPTHREAD
pthread_mutex_t counter_mutex; pthread_mutex_t counter_mutex;
pthread_cond_t count_threshhold;
#endif #endif
static void db_error_with_table(MYSQL *mysql, char *table); static void db_error_with_table(MYSQL *mysql, char *table);
...@@ -556,6 +557,7 @@ error: ...@@ -556,6 +557,7 @@ error:
pthread_mutex_lock(&counter_mutex); pthread_mutex_lock(&counter_mutex);
counter--; counter--;
pthread_cond_signal(&count_threshhold);
pthread_mutex_unlock(&counter_mutex); pthread_mutex_unlock(&counter_mutex);
my_thread_end(); my_thread_end();
...@@ -584,28 +586,26 @@ int main(int argc, char **argv) ...@@ -584,28 +586,26 @@ int main(int argc, char **argv)
{ {
pthread_t mainthread; /* Thread descriptor */ pthread_t mainthread; /* Thread descriptor */
pthread_attr_t attr; /* Thread attributes */ pthread_attr_t attr; /* Thread attributes */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED);
VOID(pthread_mutex_init(&counter_mutex, NULL)); VOID(pthread_mutex_init(&counter_mutex, NULL));
VOID(pthread_cond_init(&count_threshhold, NULL));
for (; *argv != NULL; argv++) /* Loop through tables */ for (counter= 0; *argv != NULL; argv++) /* Loop through tables */
{ {
/* pthread_mutex_lock(&counter_mutex);
If we hit thread count limit we loop until some threads exit. while (counter == opt_use_threads)
We sleep for a second, so that we don't chew up a lot of
CPU in the loop.
*/
sanity_label:
if (counter == opt_use_threads)
{ {
sleep(1); struct timespec abstime;
goto sanity_label;
set_timespec(abstime, 3);
pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime);
} }
pthread_mutex_lock(&counter_mutex); /* Before exiting the lock we set ourselves up for the next thread */
counter++; counter++;
pthread_mutex_unlock(&counter_mutex); pthread_mutex_unlock(&counter_mutex);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED);
/* now create the thread */ /* now create the thread */
if (pthread_create(&mainthread, &attr, worker_thread, if (pthread_create(&mainthread, &attr, worker_thread,
(void *)*argv) != 0) (void *)*argv) != 0)
...@@ -621,13 +621,18 @@ sanity_label: ...@@ -621,13 +621,18 @@ sanity_label:
/* /*
We loop until we know that all children have cleaned up. We loop until we know that all children have cleaned up.
*/ */
loop_label: pthread_mutex_lock(&counter_mutex);
if (counter) while (counter)
{ {
sleep(1); struct timespec abstime;
goto loop_label;
set_timespec(abstime, 3);
pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime);
} }
pthread_mutex_unlock(&counter_mutex);
VOID(pthread_mutex_destroy(&counter_mutex)); VOID(pthread_mutex_destroy(&counter_mutex));
VOID(pthread_cond_destroy(&count_threshhold));
pthread_attr_destroy(&attr);
} }
else else
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment