sql_map.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. #ifdef USE_PRAGMA_IMPLEMENTATION
  14. #pragma implementation // gcc: Class implementation
  15. #endif
  16. #include "mysql_priv.h"
  17. #ifdef HAVE_MMAP
  18. #include <sys/mman.h>
  19. #include <sys/stat.h>
  20. #endif
  21. #ifndef MAP_NORESERVE
  22. #define MAP_NORESERVE 0 // For IRIX
  23. #endif
  24. mapped_files::mapped_files(const my_string filename,byte *magic,uint magic_length)
  25. {
  26. #ifdef HAVE_MMAP
  27.   name=my_strdup(filename,MYF(0));
  28.   use_count=1;
  29.   error=0;
  30.   map=0;
  31.   size=0;
  32.   if ((file=my_open(name,O_RDONLY,MYF(MY_WME))) >= 0)
  33.   {
  34.     struct stat stat_buf;
  35.     if (!fstat(file,&stat_buf))
  36.     {
  37.       if (!(map=(byte*) mmap(0,(size=(ulong) stat_buf.st_size),PROT_READ,
  38.      MAP_SHARED | MAP_NORESERVE,file,
  39.      0L)))
  40.       {
  41. error=errno;
  42. my_printf_error(0,"Can't map file: %s, errno: %d",MYF(0),
  43. (my_string) name,error);
  44.       }
  45.     }
  46.     if (map && memcmp(map,magic,magic_length))
  47.     {
  48.       my_printf_error(0,"Wrong magic in %s",MYF(0),name);
  49.       VOID(munmap(map,size));
  50.       map=0;
  51.     }
  52.     if (!map)
  53.     {
  54.       VOID(my_close(file,MYF(0)));
  55.       file= -1;
  56.     }
  57.   }
  58. #endif
  59. }
  60. mapped_files::~mapped_files()
  61. {
  62. #ifdef HAVE_MMAP
  63.   if (file >= 0)
  64.   {
  65.     VOID(munmap((caddr_t) map,size));
  66.     VOID(my_close(file,MYF(0)));
  67.     file= -1; map=0;
  68.   }
  69.   my_free(name,MYF(0));
  70. #endif
  71. }
  72. static I_List<mapped_files> maps_in_use;
  73. /*
  74. **  Check if a file is mapped. If it is, then return pointer to old map,
  75. **  else alloc new object
  76. */
  77. mapped_files *map_file(const my_string name,byte *magic,uint magic_length)
  78. {
  79. #ifdef HAVE_MMAP
  80.   VOID(pthread_mutex_lock(&LOCK_mapped_file));
  81.   I_List_iterator<mapped_files> list(maps_in_use);
  82.   mapped_files *map;
  83.   char path[FN_REFLEN];
  84.   sprintf(path,"%s/%s/%s.uniq",mysql_data_home,current_thd->db,name);
  85.   (void) unpack_filename(path,path);
  86.   while ((map=list++))
  87.   {
  88.     if (!strcmp(path,map->name))
  89.       break;
  90.   }
  91.   if (!map)
  92.   {
  93.     map=new mapped_files(path,magic,magic_length);
  94.     maps_in_use.append(map);
  95.   }
  96.   else
  97.   {
  98.     map->use_count++;
  99.     if (!map->map)
  100.       my_printf_error(0,"Can't map file: %s, error: %d",MYF(0),path,
  101.       map->error);
  102.   }
  103.   VOID(pthread_mutex_unlock(&LOCK_mapped_file));
  104.   return map;
  105. #else
  106.   return NULL;
  107. #endif
  108. }
  109. /*
  110. ** free the map if there are no more users for it
  111. */
  112. void unmap_file(mapped_files *map)
  113. {
  114. #ifdef HAVE_MMAP
  115.   VOID(pthread_mutex_lock(&LOCK_mapped_file));
  116.   if (!map->use_count--)
  117.     delete map;
  118.   VOID(pthread_mutex_unlock(&LOCK_mapped_file));
  119. #endif
  120. }
  121. /*****************************************************************************
  122. ** Instansiate templates
  123. *****************************************************************************/
  124. #ifdef __GNUC__
  125. /* Used templates */
  126. template class I_List<mapped_files>;
  127. template class I_List_iterator<mapped_files>;
  128. #endif