mi_close.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /* close a isam-database */
  17. /*
  18.   TODO:
  19.    We need to have a separate mutex on the closed file to allow other threads
  20.    to open other files during the time we flush the cache and close this file
  21. */
  22. #include "myisamdef.h"
  23. int mi_close(register MI_INFO *info)
  24. {
  25.   int error=0,flag;
  26.   MYISAM_SHARE *share=info->s;
  27.   DBUG_ENTER("mi_close");
  28.   DBUG_PRINT("enter",("base: %lx  reopen: %u  locks: %u",
  29.       info,(uint) share->reopen,
  30.       (uint) (share->w_locks+share->r_locks)));
  31.   pthread_mutex_lock(&THR_LOCK_myisam);
  32.   if (info->lock_type == F_EXTRA_LCK)
  33.     info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */
  34.   if (share->reopen == 1 && share->kfile >= 0)
  35.     _mi_decrement_open_count(info);
  36.   if (info->lock_type != F_UNLCK)
  37.   {
  38.     if (mi_lock_database(info,F_UNLCK))
  39.       error=my_errno;
  40.   }
  41.   pthread_mutex_lock(&share->intern_lock);
  42.   if (share->options & HA_OPTION_READ_ONLY_DATA)
  43.     share->r_locks--;
  44.   if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
  45.   {
  46.     if (end_io_cache(&info->rec_cache))
  47.       error=my_errno;
  48.     info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
  49.   }
  50.   flag= !--share->reopen;
  51.   myisam_open_list=list_delete(myisam_open_list,&info->open_list);
  52.   pthread_mutex_unlock(&share->intern_lock);
  53.   if (flag)
  54.   {
  55.     if (share->kfile >= 0 &&
  56. flush_key_blocks(share->kfile,
  57.  share->temporary ? FLUSH_IGNORE_CHANGED :
  58.  FLUSH_RELEASE))
  59.       error=my_errno;
  60.     if (share->kfile >= 0)
  61.     {
  62.       if (share->mode != O_RDONLY && mi_is_crashed(info))
  63. mi_state_info_write(share->kfile, &share->state, 1);
  64.       if (my_close(share->kfile,MYF(0)))
  65.         error = my_errno;
  66.     }
  67. #ifdef HAVE_MMAP
  68.     if (share->file_map)
  69.       _mi_unmap_file(info);
  70. #endif
  71.     if (share->decode_trees)
  72.     {
  73.       my_free((gptr) share->decode_trees,MYF(0));
  74.       my_free((gptr) share->decode_tables,MYF(0));
  75.     }
  76. #ifdef THREAD
  77.     thr_lock_delete(&share->lock);
  78.     VOID(pthread_mutex_destroy(&share->intern_lock));
  79.     {
  80.       int i,keys;
  81.       keys = share->state.header.keys;
  82.       for(i=0; i<keys; i++) {
  83. VOID(rwlock_destroy(&share->key_root_lock[i]));
  84.       }
  85.     }
  86. #endif
  87.     my_free((gptr) info->s,MYF(0));
  88.   }
  89.   pthread_mutex_unlock(&THR_LOCK_myisam);
  90.   if (info->dfile >= 0 && my_close(info->dfile,MYF(0)))
  91.     error = my_errno;
  92.   myisam_log_command(MI_LOG_CLOSE,info,NULL,0,error);
  93.   my_free((gptr) info->rec_alloc,MYF(MY_ALLOW_ZERO_PTR));
  94.   my_free((gptr) info,MYF(0));
  95.   if (error)
  96.   {
  97.     DBUG_RETURN(my_errno=error);
  98.   }
  99.   DBUG_RETURN(0);
  100. } /* mi_close */