fd.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: fd.c,v 1.35.2.1 1999/02/12 22:32:17 wessels Exp $
  3.  *
  4.  * DEBUG: section 51    Filedescriptor Functions
  5.  * AUTHOR: Duane Wessels
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. const char *fdTypeStr[] =
  36. {
  37.     "None",
  38.     "Log",
  39.     "File",
  40.     "Socket",
  41.     "Pipe",
  42.     "Unknown"
  43. };
  44. static void fdUpdateBiggest(int fd, int);
  45. static void
  46. fdUpdateBiggest(int fd, int opening)
  47. {
  48.     if (fd < Biggest_FD)
  49. return;
  50.     assert(fd < Squid_MaxFD);
  51.     if (fd > Biggest_FD) {
  52. /*
  53.  * assert that we are not closing a FD bigger than
  54.  * our known biggest FD
  55.  */
  56. assert(opening);
  57. Biggest_FD = fd;
  58. return;
  59.     }
  60.     /* if we are here, then fd == Biggest_FD */
  61.     /*
  62.      * assert that we are closing the biggest FD; we can't be
  63.      * re-opening it
  64.      */
  65.     assert(!opening);
  66.     while (!fd_table[Biggest_FD].flags.open)
  67. Biggest_FD--;
  68. }
  69. void
  70. fd_close(int fd)
  71. {
  72.     fde *F = &fd_table[fd];
  73.     if (F->type == FD_FILE) {
  74. assert(F->read_handler == NULL);
  75. assert(F->write_handler == NULL);
  76.     }
  77.     debug(51, 3) ("fd_close FD %d %sn", fd, F->desc);
  78.     F->flags.open = 0;
  79.     fdUpdateBiggest(fd, 0);
  80.     Number_FD--;
  81.     commUpdateReadBits(fd, NULL);
  82.     commUpdateWriteBits(fd, NULL);
  83.     memset(F, '', sizeof(fde));
  84.     F->timeout = 0;
  85. }
  86. #if USE_ASYNC_IO
  87. void
  88. fd_was_closed(int fd)
  89. {
  90.     fde *F = &fd_table[fd];
  91.     if (F->flags.closing)
  92. fd_close(fd);
  93. }
  94. #endif
  95. void
  96. fd_open(int fd, unsigned int type, const char *desc)
  97. {
  98.     fde *F = &fd_table[fd];
  99.     assert(fd >= 0);
  100. #if USE_ASYNC_IO
  101.     if (F->flags.closing) {
  102. /* Reuse of a closed FD before we have noticed it is closed */
  103. fd_close(fd);
  104.     }
  105. #endif
  106.     if (F->flags.open) {
  107. debug(51, 1) ("WARNING: Closing open FD %4dn", fd);
  108. fd_close(fd);
  109.     }
  110.     assert(!F->flags.open);
  111.     debug(51, 3) ("fd_open FD %d %sn", fd, desc);
  112.     F->type = type;
  113.     F->flags.open = 1;
  114.     fdUpdateBiggest(fd, 1);
  115.     if (desc)
  116. xstrncpy(F->desc, desc, FD_DESC_SZ);
  117.     Number_FD++;
  118. }
  119. void
  120. fd_note(int fd, const char *s)
  121. {
  122.     fde *F = &fd_table[fd];
  123.     xstrncpy(F->desc, s, FD_DESC_SZ);
  124. }
  125. void
  126. fd_bytes(int fd, int len, unsigned int type)
  127. {
  128.     fde *F = &fd_table[fd];
  129.     if (len < 0)
  130. return;
  131.     assert(type == FD_READ || type == FD_WRITE);
  132.     if (type == FD_READ)
  133. F->bytes_read += len;
  134.     else
  135. F->bytes_written += len;
  136. }
  137. void
  138. fdFreeMemory(void)
  139. {
  140.     safe_free(fd_table);
  141. }
  142. void
  143. fdDumpOpen(void)
  144. {
  145.     int i;
  146.     fde *F;
  147.     for (i = 0; i < Squid_MaxFD; i++) {
  148. F = &fd_table[i];
  149. if (!F->flags.open)
  150.     continue;
  151. if (i == fileno(debug_log))
  152.     continue;
  153. debug(51, 1) ("Open FD %-10s %4d %sn",
  154.     F->bytes_read && F->bytes_written ? "READ/WRITE" :
  155.     F->bytes_read ? "READING" :
  156.     F->bytes_written ? "WRITING" : null_string,
  157.     i, F->desc);
  158.     }
  159. }
  160. int
  161. fdNFree(void)
  162. {
  163.     return Squid_MaxFD - Number_FD - Opening_FD;
  164. }
  165. /* Called when we runs out of file descriptors */
  166. void
  167. fdAdjustReserved(void)
  168. {
  169.     int new;
  170.     int x;
  171.     static time_t last = 0;
  172.     /*
  173.      * don't update too frequently
  174.      */
  175.     if (last + 5 > squid_curtime)
  176. return;
  177.     /*
  178.      * Calculate a new reserve, based on current usage and a small extra
  179.      */
  180.     new = Squid_MaxFD - Number_FD + XMIN(25, Squid_MaxFD / 16);
  181.     if (new <= RESERVED_FD)
  182. return;
  183.     x = Squid_MaxFD - 20 - XMIN(25, Squid_MaxFD / 16);
  184.     if (new > x) {
  185. /* perhaps this should be fatal()? -DW */
  186. debug(51, 0) ("WARNING: This machine has a serious shortage of filedescriptors.n");
  187. new = x;
  188.     }
  189.     debug(51, 0) ("Reserved FD adjusted from %d to %d due to failuresn",
  190. RESERVED_FD, new);
  191.     RESERVED_FD = new;
  192. }