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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL 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. #include "mysys_priv.h"
  14. #include "my_static.h"
  15. #include <m_string.h>
  16. /*
  17.   set how many open files we want to be able to handle
  18.   SYNOPSIS
  19.     set_maximum_open_files()
  20.     max_file_limit Files to open
  21.   NOTES
  22.     The request may not fulfilled becasue of system limitations
  23.   RETURN
  24.     Files available to open.
  25.     May be more or less than max_file_limit!
  26. */
  27. #if defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE) && !defined(HAVE_mit_thread)
  28. #ifndef RLIM_INFINITY
  29. #define RLIM_INFINITY ((uint) 0xffffffff)
  30. #endif
  31. static uint set_max_open_files(uint max_file_limit)
  32. {
  33.   struct rlimit rlimit;
  34.   uint old_cur;
  35.   DBUG_ENTER("set_max_open_files");
  36.   DBUG_PRINT("enter",("files: %u", max_file_limit));
  37.   if (!getrlimit(RLIMIT_NOFILE,&rlimit))
  38.   {
  39.     old_cur= (uint) rlimit.rlim_cur;
  40.     DBUG_PRINT("info", ("rlim_cur: %u  rlim_max: %u",
  41. (uint) rlimit.rlim_cur,
  42. (uint) rlimit.rlim_max));
  43.     if (rlimit.rlim_cur == RLIM_INFINITY)
  44.       rlimit.rlim_cur = max_file_limit;
  45.     if (rlimit.rlim_cur >= max_file_limit)
  46.       DBUG_RETURN(rlimit.rlim_cur); /* purecov: inspected */
  47.     rlimit.rlim_cur= rlimit.rlim_max= max_file_limit;
  48.     if (setrlimit(RLIMIT_NOFILE, &rlimit))
  49.       max_file_limit= old_cur; /* Use original value */
  50.     else
  51.     {
  52.       rlimit.rlim_cur= 0; /* Safety if next call fails */
  53.       (void) getrlimit(RLIMIT_NOFILE,&rlimit);
  54.       DBUG_PRINT("info", ("rlim_cur: %u", (uint) rlimit.rlim_cur));
  55.       if (rlimit.rlim_cur) /* If call didn't fail */
  56. max_file_limit= (uint) rlimit.rlim_cur;
  57.     }
  58.   }
  59.   DBUG_PRINT("exit",("max_file_limit: %u", max_file_limit));
  60.   DBUG_RETURN(max_file_limit);
  61. }
  62. #elif defined (OS2)
  63. static uint set_max_open_files(uint max_file_limit)
  64. {
  65.   LONG     cbReqCount;
  66.   ULONG    cbCurMaxFH0;
  67.   APIRET   ulrc;
  68.   DBUG_ENTER("set_max_open_files");
  69.   /* get current limit */
  70.   cbReqCount = 0;
  71.   DosSetRelMaxFH( &cbReqCount, &cbCurMaxFH0);
  72.   /* set new limit */
  73.   if ((cbReqCount = max_file_limit - cbCurMaxFH0) > 0)
  74.     ulrc = DosSetRelMaxFH( &cbReqCount, &cbCurMaxFH);
  75.   DBUG_RETURN(cbCurMaxFH0);
  76. }
  77. #else
  78. static int set_max_open_files(uint max_file_limit)
  79. {
  80.   /* We don't know the limit. Return best guess */
  81.   return min(max_file_limit, OS_FILE_LIMIT);
  82. }
  83. #endif
  84. /*
  85.   Change number of open files
  86.   SYNOPSIS:
  87.     my_set_max_open_files()
  88.     files Number of requested files
  89.   RETURN
  90.     number of files available for open
  91. */
  92. uint my_set_max_open_files(uint files)
  93. {
  94.   struct st_my_file_info *tmp;
  95.   DBUG_ENTER("my_set_max_open_files");
  96.   DBUG_PRINT("enter",("files: %u  my_file_limit: %u", files, my_file_limit));
  97.   files= set_max_open_files(min(files, OS_FILE_LIMIT));
  98.   if (files <= MY_NFILE)
  99.     DBUG_RETURN(files);
  100.   if (!(tmp= (struct st_my_file_info*) my_malloc(sizeof(*tmp) * files,
  101.  MYF(MY_WME))))
  102.     DBUG_RETURN(MY_NFILE);
  103.   /* Copy any initialized files */
  104.   memcpy((char*) tmp, (char*) my_file_info, sizeof(*tmp) * my_file_limit);
  105.   my_free_open_file_info(); /* Free if already allocated */
  106.   my_file_info= tmp;
  107.   my_file_limit= files;
  108.   DBUG_PRINT("exit",("files: %u", files));
  109.   DBUG_RETURN(files);
  110. }
  111. void my_free_open_file_info()
  112. {
  113.   DBUG_ENTER("my_free_file_info");
  114.   if (my_file_info != my_file_info_default)
  115.   {
  116.     my_free((char*) my_file_info, MYF(0));
  117.     my_file_info= my_file_info_default;
  118.   }
  119.   DBUG_VOID_RETURN;
  120. }