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