sql_manager.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* 
  14.  * sql_manager.cc
  15.  * This thread manages various maintenance tasks.
  16.  *
  17.  *   o Flushing the tables every flush_time seconds.
  18.  *   o Berkeley DB: removing unneeded log files.
  19.  */
  20. #include "mysql_priv.h"
  21. #include "sql_manager.h"
  22. ulong volatile manager_status;
  23. bool volatile manager_thread_in_use;
  24. pthread_t manager_thread;
  25. pthread_mutex_t LOCK_manager;
  26. pthread_cond_t COND_manager;
  27. extern "C" pthread_handler_decl(handle_manager,arg __attribute__((unused)))
  28. {
  29.   int error = 0;
  30.   ulong status;
  31.   struct timespec abstime;
  32.   bool reset_flush_time = TRUE;
  33.   my_thread_init();
  34.   DBUG_ENTER("handle_manager");
  35.   pthread_detach_this_thread();
  36.   manager_thread = pthread_self();
  37.   manager_status = 0;
  38.   manager_thread_in_use = 1;
  39.   for (;;)
  40.   {
  41.     pthread_mutex_lock(&LOCK_manager);
  42.     /* XXX: This will need to be made more general to handle different
  43.      * polling needs. */
  44.     if (flush_time)
  45.     {
  46.       if (reset_flush_time)
  47.       {
  48. set_timespec(abstime, flush_time);
  49.         reset_flush_time = FALSE;
  50.       }
  51.       while (!manager_status && !error && !abort_loop)
  52.         error = pthread_cond_timedwait(&COND_manager, &LOCK_manager, &abstime);
  53.     }
  54.     else
  55.       while (!manager_status && !error && !abort_loop)
  56.         error = pthread_cond_wait(&COND_manager, &LOCK_manager);
  57.     status = manager_status;
  58.     manager_status = 0;
  59.     pthread_mutex_unlock(&LOCK_manager);
  60.     if (abort_loop)
  61.       break;
  62.     if (error)  /* == ETIMEDOUT */
  63.     {
  64.       flush_tables();
  65.       error = 0;
  66.       reset_flush_time = TRUE;
  67.     }
  68. #ifdef HAVE_BERKELEY_DB
  69.     if (status & MANAGER_BERKELEY_LOG_CLEANUP)
  70.     {
  71.       berkeley_cleanup_log_files();
  72.       status &= ~MANAGER_BERKELEY_LOG_CLEANUP;
  73.     }
  74. #endif
  75.     if (status)
  76.       DBUG_PRINT("error", ("manager did not handle something: %lx", status));
  77.   }
  78.   manager_thread_in_use = 0;
  79.   my_thread_end();
  80.   DBUG_RETURN(NULL);
  81. }