home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / myisam / mi_close.c < prev    next >
C/C++ Source or Header  |  2000-09-27  |  3KB  |  106 lines

  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.  
  17. /* close a isam-database */
  18. /*
  19.   TODO:
  20.    We need to have a separate mutex on the closed file to allow other threads
  21.    to open other files during the time we flush the cache and close this file
  22. */
  23.  
  24. #include "myisamdef.h"
  25.  
  26. int mi_close(register MI_INFO *info)
  27. {
  28.   int error=0,flag;
  29.   MYISAM_SHARE *share=info->s;
  30.   DBUG_ENTER("mi_close");
  31.   DBUG_PRINT("enter",("base: %lx  reopen: %u  locks: %u",
  32.               info,(uint) share->reopen,
  33.               (uint) (share->w_locks+share->r_locks)));
  34.  
  35.   pthread_mutex_lock(&THR_LOCK_myisam);
  36.   if (info->lock_type == F_EXTRA_LCK)
  37.     info->lock_type=F_UNLCK;            /* HA_EXTRA_NO_USER_CHANGE */
  38.  
  39.   if (share->reopen == 1 && share->kfile >= 0)
  40.     _mi_decrement_open_count(info);
  41.  
  42.   if (info->lock_type != F_UNLCK)
  43.   {
  44.     if (mi_lock_database(info,F_UNLCK))
  45.       error=my_errno;
  46.   }
  47.   pthread_mutex_lock(&share->intern_lock);
  48.  
  49.   if (share->options & HA_OPTION_READ_ONLY_DATA)
  50.     share->r_locks--;
  51.   if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
  52.   {
  53.     if (end_io_cache(&info->rec_cache))
  54.       error=my_errno;
  55.     info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
  56.   }
  57.   flag= !--share->reopen;
  58.   myisam_open_list=list_delete(myisam_open_list,&info->open_list);
  59.   pthread_mutex_unlock(&share->intern_lock);
  60.  
  61.   if (flag)
  62.   {
  63.     if (share->kfile >= 0 &&
  64.     flush_key_blocks(share->kfile,
  65.              share->temporary ? FLUSH_IGNORE_CHANGED :
  66.              FLUSH_RELEASE))
  67.       error=my_errno;
  68.     if (share->kfile >= 0 && my_close(share->kfile,MYF(0)))
  69.       error = my_errno;
  70. #ifdef HAVE_MMAP
  71.     if (share->file_map)
  72.       _mi_unmap_file(info);
  73. #endif
  74.     if (share->decode_trees)
  75.     {
  76.       my_free((gptr) share->decode_trees,MYF(0));
  77.       my_free((gptr) share->decode_tables,MYF(0));
  78.     }
  79. #ifdef THREAD
  80.     thr_lock_delete(&share->lock);
  81.     VOID(pthread_mutex_destroy(&share->intern_lock));
  82.     {
  83.       int i,keys;
  84.       keys = share->state.header.keys;
  85.       for(i=0; i<keys; i++) {
  86.     VOID(rwlock_destroy(&share->key_root_lock[i]));
  87.       }
  88.     }
  89. #endif
  90.     my_free((gptr) info->s,MYF(0));
  91.   }
  92.   pthread_mutex_unlock(&THR_LOCK_myisam);
  93.   if (info->dfile >= 0 && my_close(info->dfile,MYF(0)))
  94.     error = my_errno;
  95.  
  96.   myisam_log_command(MI_LOG_CLOSE,info,NULL,0,error);
  97.   my_free((gptr) info->rec_alloc,MYF(MY_ALLOW_ZERO_PTR));
  98.   my_free((gptr) info,MYF(0));
  99.  
  100.   if (error)
  101.   {
  102.     DBUG_RETURN(my_errno=error);
  103.   }
  104.   DBUG_RETURN(0);
  105. } /* mi_close */
  106.