Commit e605df8c authored by unknown's avatar unknown
Browse files

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

into  zim.(none):/home/brian/mysql/cleanup-5.1

parents 2ecd916d 0b6cff33
Loading
Loading
Loading
Loading
+25 −20
Original line number Diff line number Diff line
@@ -35,9 +35,10 @@


/* Global Thread counter */
int counter= 0;
int counter;
#ifdef HAVE_LIBPTHREAD
pthread_mutex_t counter_mutex;
pthread_cond_t count_threshhold;
#endif

static void db_error_with_table(MYSQL *mysql, char *table);
@@ -556,6 +557,7 @@ pthread_handler_t worker_thread(void *arg)

  pthread_mutex_lock(&counter_mutex);
  counter--;
  pthread_cond_signal(&count_threshhold);
  pthread_mutex_unlock(&counter_mutex);
  my_thread_end();

@@ -584,28 +586,26 @@ int main(int argc, char **argv)
  {
    pthread_t mainthread;            /* Thread descriptor */
    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_cond_init(&count_threshhold, NULL));

    for (; *argv != NULL; argv++) /* Loop through tables */
    for (counter= 0; *argv != NULL; argv++) /* Loop through tables */
    {
      /*
        If we hit thread count limit we loop until some threads exit.
        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)
      pthread_mutex_lock(&counter_mutex);
      while (counter == opt_use_threads)
      {
        sleep(1);
        goto sanity_label;
        struct timespec abstime;

        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++;
      pthread_mutex_unlock(&counter_mutex);
      pthread_attr_init(&attr);
      pthread_attr_setdetachstate(&attr,
                                   PTHREAD_CREATE_DETACHED);

      /* now create the thread */
      if (pthread_create(&mainthread, &attr, worker_thread, 
                         (void *)*argv) != 0)
@@ -621,13 +621,18 @@ int main(int argc, char **argv)
    /*
      We loop until we know that all children have cleaned up.
    */
loop_label:
    if (counter)
    pthread_mutex_lock(&counter_mutex);
    while (counter)
    {
      sleep(1);
      goto loop_label;
      struct timespec abstime;

      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_cond_destroy(&count_threshhold));
    pthread_attr_destroy(&attr);
  }
  else
#endif