connection.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:4k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** connection.c
  3. **
  4. ** Copyright (c) 1994-1997 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <syslog.h>
  20. #include "phttpd.h"
  21. static struct connectioninfo *ciptab;
  22. /* The Garbage Collector Thread - used to clean up hanging connections */
  23. static void *gc_thread(void *misc)
  24. {
  25.     time_t curr_time;
  26.     int i;
  27.     struct connectioninfo *cip;
  28.     
  29. /* added RK: In case that gc_time is less that 10 seconds, forget this gc stuff*/
  30.     if ( gc_time < 10 ) 
  31.     { fprintf(stderr,"gc_thread(): gc_time < 10 sec, no garbage collector started !n");
  32.       return 0;
  33.     }
  34.   Loop:
  35.     s_sleep(gc_sleep > 0 ? gc_sleep : 60);
  36.     if (debug > 1)
  37. s_write(2, "gc_thread(): Timeoutn", 21);
  38.     time(&curr_time);
  39.     
  40.     for (i = 0; i < max_fds; i++)
  41.     {
  42. cip = &ciptab[i];
  43. mutex_lock(&cip->lock);
  44. if (cip->inuse == 0)
  45. {
  46. /* added RK ... */
  47.     mutex_unlock(&cip->lock);
  48. /* this is wrong ...  return 0; */
  49. }
  50. if (cip->inuse != 0 )
  51. { if (curr_time - cip->cn_time > gc_time)
  52.   {
  53.     syslog(LOG_DEBUG, "terminating connection #%d", cip->request_no);
  54. /* was a BUG, need to free memory ! RK11 */
  55.     cn_free(cip);
  56. /*     fd_shutdown(cip->fd, -2); */
  57.   }
  58. }
  59. mutex_unlock(&cip->lock);
  60.     }
  61.     if (debug > 1)
  62. s_write(2, "gc_thread(): sleepingn", 22);
  63.     goto Loop;
  64. }
  65. void cn_start_gc(void)
  66. {
  67.     if (thr_create(NULL, 0,
  68.    (void *(*)(void *)) gc_thread,
  69.    NULL, THR_DETACHED+THR_DAEMON, NULL))
  70.     {
  71. syslog(LOG_ERR, "thr_create(gc_thread) failed: %m");
  72. exit(1);
  73.     }
  74. }
  75. struct connectioninfo *cn_new(int fd)
  76. {
  77.     struct connectioninfo *cip;
  78.     cip = &ciptab[fd];
  79.     mutex_lock(&cip->lock);
  80.     cip->fd = fd;
  81.     cip->bytes=0;
  82.     cip->inuse = 1;
  83.     mutex_unlock(&cip->lock);
  84.     
  85.     time(&cip->cn_time);
  86.     return cip;
  87. }
  88. void cn_init(void)
  89. {
  90.     ciptab = s_malloc(max_fds * sizeof(struct connectioninfo));
  91. }
  92. void cn_free(struct connectioninfo *cip)
  93. {
  94.     int fd;
  95.     
  96.     fd_shutdown(cip->fd, 2);
  97.     http_freeinfo(cip->hip);
  98.     cip->hip = NULL;
  99.     
  100.     si_free(cip->sip);
  101.     cip->sip = NULL;
  102.     dns_free(cip->server);
  103.     dns_free(cip->client);
  104.     cip->server = cip->client = NULL;
  105.     
  106.     ident_free(cip->ident);
  107.     cip->ident = NULL;
  108.     mutex_lock(&cip->lock);
  109.     fd = cip->fd;
  110.     cip->fd = -1;
  111.     cip->inuse = 0;
  112.     mutex_unlock(&cip->lock);
  113.     fd_close(fd);
  114. }
  115. int cn_closeall(void)
  116. {
  117.     int active = 0;
  118.     int i;
  119.     struct connectioninfo *cip;
  120.     
  121.     
  122.     for (i = 0; i < max_fds; i++)
  123.     {
  124. cip = &ciptab[i];
  125. mutex_lock(&cip->lock);
  126. if (cip->inuse)
  127. {
  128.     ++active;
  129.     fd_shutdown(cip->fd, -2);
  130. }
  131. mutex_unlock(&cip->lock);
  132.     }
  133.     return active;
  134. }
  135. int cn_active(void)
  136. {
  137.     int active = 0;
  138.     int i;
  139.     struct connectioninfo *cip;
  140.     
  141.     
  142.     for (i = 0; i < max_fds; i++)
  143.     {
  144. cip = &ciptab[i];
  145. mutex_lock(&cip->lock);
  146. if (cip->inuse)
  147.     ++active;
  148. mutex_unlock(&cip->lock);
  149.     }
  150.     return active;
  151. }
  152. int cn_foreach(int (*foreach)(struct connectioninfo *cip, void *misc),
  153.        void *misc)
  154. {
  155.     int i, status = 0;
  156.     struct connectioninfo *cip;
  157.     
  158.     
  159.     for (i = 0; i < max_fds && status == 0; i++)
  160.     {
  161. cip = &ciptab[i];
  162. mutex_lock(&cip->lock);
  163. if (cip->inuse)
  164.     status = (*foreach)(cip, misc);
  165. mutex_unlock(&cip->lock);
  166.     }
  167.     return status;
  168. }