~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000 MySQL 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; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
#include "mysys_priv.h"
17
#include "my_static.h"
212.5.18 by Monty Taylor
Moved m_ctype, m_string and my_bitmap. Removed t_ctype.
18
#include <mystrings/m_string.h>
629.1.1 by Monty Taylor
More solaris fixes.
19
#include <stdlib.h>
20
#include <string.h>
1 by brian
clean slate
21
22
/*
23
  set how many open files we want to be able to handle
24
25
  SYNOPSIS
26
    set_maximum_open_files()
27
    max_file_limit		Files to open
28
29
  NOTES
30
    The request may not fulfilled becasue of system limitations
31
32
  RETURN
33
    Files available to open.
34
    May be more or less than max_file_limit!
35
*/
36
37
#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)
38
39
#ifndef RLIM_INFINITY
895 by Brian Aker
Completion (?) of uint conversion.
40
#define RLIM_INFINITY ((uint32_t) 0xffffffff)
1 by brian
clean slate
41
#endif
42
779.3.23 by Monty Taylor
More fixy-fixes.
43
static uint64_t set_max_open_files(uint64_t max_file_limit)
1 by brian
clean slate
44
{
45
  struct rlimit rlimit;
632.1.11 by Monty Taylor
Fixed Sun Studio warnings in mysys.
46
  rlim_t old_cur;
1 by brian
clean slate
47
48
  if (!getrlimit(RLIMIT_NOFILE,&rlimit))
49
  {
632.1.11 by Monty Taylor
Fixed Sun Studio warnings in mysys.
50
    old_cur= rlimit.rlim_cur;
1 by brian
clean slate
51
    if (rlimit.rlim_cur == RLIM_INFINITY)
52
      rlimit.rlim_cur = max_file_limit;
53
    if (rlimit.rlim_cur >= max_file_limit)
637 by Brian Aker
Merge from Monty
54
    {
632.1.11 by Monty Taylor
Fixed Sun Studio warnings in mysys.
55
      if (rlimit.rlim_cur > UINT32_MAX)
56
        return UINT32_MAX;
57
      else
58
        return((uint32_t)rlimit.rlim_cur);
637 by Brian Aker
Merge from Monty
59
    }
1 by brian
clean slate
60
    rlimit.rlim_cur= rlimit.rlim_max= max_file_limit;
61
    if (setrlimit(RLIMIT_NOFILE, &rlimit))
632.1.11 by Monty Taylor
Fixed Sun Studio warnings in mysys.
62
      max_file_limit= (old_cur < UINT32_MAX) ? (uint32_t)old_cur : UINT32_MAX;
1 by brian
clean slate
63
    else
64
    {
65
      rlimit.rlim_cur= 0;			/* Safety if next call fails */
66
      (void) getrlimit(RLIMIT_NOFILE,&rlimit);
67
      if (rlimit.rlim_cur)			/* If call didn't fail */
632.1.11 by Monty Taylor
Fixed Sun Studio warnings in mysys.
68
	max_file_limit= (uint32_t) rlimit.rlim_cur;
1 by brian
clean slate
69
    }
70
  }
51.3.19 by Jay Pipes
Phase 6 - Remove DBUG from mysys
71
  return(max_file_limit);
1 by brian
clean slate
72
}
73
74
#else
779.3.23 by Monty Taylor
More fixy-fixes.
75
static int set_max_open_files(uint64_t max_file_limit)
1 by brian
clean slate
76
{
77
  /* We don't know the limit. Return best guess */
398.1.4 by Monty Taylor
Renamed max/min.
78
  return cmin(max_file_limit, OS_FILE_LIMIT);
1 by brian
clean slate
79
}
80
#endif
81
82
83
/*
84
  Change number of open files
85
86
  SYNOPSIS:
87
    my_set_max_open_files()
88
    files		Number of requested files
89
90
  RETURN
91
    number of files available for open
92
*/
93
779.3.23 by Monty Taylor
More fixy-fixes.
94
uint64_t my_set_max_open_files(uint64_t files)
1 by brian
clean slate
95
{
96
  struct st_my_file_info *tmp;
97
398.1.4 by Monty Taylor
Renamed max/min.
98
  files= set_max_open_files(cmin(files, OS_FILE_LIMIT));
1 by brian
clean slate
99
  if (files <= MY_NFILE)
51.3.19 by Jay Pipes
Phase 6 - Remove DBUG from mysys
100
    return(files);
1 by brian
clean slate
101
779.3.23 by Monty Taylor
More fixy-fixes.
102
  if (!(tmp= (st_my_file_info*) malloc((size_t)cmax(sizeof(st_my_file_info) * files,SIZE_MAX))))
51.3.19 by Jay Pipes
Phase 6 - Remove DBUG from mysys
103
    return(MY_NFILE);
1 by brian
clean slate
104
105
  /* Copy any initialized files */
779.3.23 by Monty Taylor
More fixy-fixes.
106
  memcpy(tmp, my_file_info,
107
         sizeof(*tmp) *
108
            (size_t)cmin(my_file_limit,
779.3.24 by Monty Taylor
Fixed solaris fixes on linux again.
109
                 cmax(files,UINT32_MAX)));
212.6.14 by Mats Kindahl
Removing redundant use of casts in mysys for memcmp(), memcpy(), memset(), and memmove().
110
  /*
111
    The int cast is necessary since 'my_file_limits' might be greater
112
    than 'files'.
113
  */
114
  memset(tmp + my_file_limit, 0,
398.1.4 by Monty Taylor
Renamed max/min.
115
         cmax((int) (files - my_file_limit), 0)*sizeof(*tmp));
1 by brian
clean slate
116
  my_free_open_file_info();			/* Free if already allocated */
117
  my_file_info= tmp;
779.3.24 by Monty Taylor
Fixed solaris fixes on linux again.
118
  my_file_limit= (size_t)cmax(UINT32_MAX,files);
51.3.19 by Jay Pipes
Phase 6 - Remove DBUG from mysys
119
  return(files);
1 by brian
clean slate
120
}
121
122
123
void my_free_open_file_info()
124
{
125
  if (my_file_info != my_file_info_default)
126
  {
127
    /* Copy data back for my_print_open_files */
212.6.14 by Mats Kindahl
Removing redundant use of casts in mysys for memcmp(), memcpy(), memset(), and memmove().
128
    memcpy(my_file_info_default, my_file_info,
1 by brian
clean slate
129
           sizeof(*my_file_info_default)* MY_NFILE);
477 by Monty Taylor
Removed my_free(). It turns out that it had been def'd to ignore the flags passed to it in the second arg anyway. Gotta love that.
130
    free((char*) my_file_info);
1 by brian
clean slate
131
    my_file_info= my_file_info_default;
132
    my_file_limit= MY_NFILE;
133
  }
51.3.19 by Jay Pipes
Phase 6 - Remove DBUG from mysys
134
  return;
1 by brian
clean slate
135
}