buf.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:5k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  buf.c  - This file contains functions maintaining the pool of buffers
  3.  *           Kernel of GNU SQL-server. Buffer
  4.  *
  5.  * This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by  Vera Ponomarenko
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts:   gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: buf.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29. #include "fdeclbuf.h"
  30. #include "bufdefs.h"
  31. #include "rnmtp.h"
  32. #include "inpop.h"
  33. /*****************************************************************************
  34.      This file contains functions maintaining the pool of buffers
  35. ********************************* base data *********************************/
  36. struct BUFF *prios[PRIORITIES]; /* priority rings */
  37. extern i4_t N_buf; /* number of buffers */
  38. extern i4_t N_opt; /* optimal number of buffers */
  39. extern i4_t max_buffers_number; /* max number of buffers */
  40. /*************************** change priority ********************************/
  41. void
  42. set_prio (struct BUFF *buf, u2_t new_prio) /* set priority */
  43. {
  44.   if (new_prio < USED)
  45.     {
  46.       if (prios[new_prio] == NULL)
  47. {
  48.   buf->b_next = buf;
  49.   buf->b_prev = buf;
  50.   prios[new_prio] = buf;
  51. }
  52.       else
  53. {
  54.   buf->b_prev = prios[new_prio]->b_prev;
  55.   prios[new_prio]->b_prev->b_next = buf;
  56.   buf->b_next = prios[new_prio];
  57.   prios[new_prio]->b_prev = buf;
  58. }
  59.     }
  60.   else
  61.     {
  62.       buf->b_next = NULL;
  63.       buf->b_prev = NULL;
  64.     }
  65.   buf->b_status = new_prio;
  66. }
  67. void
  68. unset_prio (struct BUFF *buf) /* unset priority */
  69. {
  70.   u2_t status;
  71.   status = buf->b_status;
  72.   if (status < USED)
  73.     if (buf->b_next == buf)
  74.       prios[status] = NULL;
  75.     else
  76.       {
  77. buf->b_next->b_prev = buf->b_prev;
  78. buf->b_prev->b_next = buf->b_next;
  79. if (prios[status] == buf)
  80.   prios[status] = buf->b_next;
  81.       }
  82. }
  83. void
  84. change_prio (struct BUFF *buf, u2_t new_prio) /* change priority */
  85. {
  86.   unset_prio (buf);
  87.   set_prio (buf, new_prio);
  88. }
  89. /********************** find the least useful buffer ************************/
  90. struct BUFF *
  91. find_buf ()
  92. {
  93.   struct BUFF *buf;
  94.   u2_t prio;
  95.   for (prio = 0; prio < PRIORITIES; prio++)
  96.     if (prios[prio] != NULL)
  97.       {
  98. buf = prios[prio];
  99. change_prio (buf, USED);
  100. return (buf);
  101.       }
  102.   return (NULL);
  103. }
  104. /*************************** take new buffer ********************************/
  105. struct BUFF *
  106. get_buf ()
  107. {
  108.   struct BUFF *buf;
  109.   
  110.   if (N_buf > N_opt)
  111.     {
  112.       if ((buf = find_buf ())!= NULL)
  113. {
  114.           struct PAGE *page;
  115.   push_buf (buf);
  116.   unset_prio (buf);
  117.   page = buf->b_page;
  118.   if (page->p_status == 0 && page->p_ltype != STRONG)
  119.     del_page (page);
  120.   else
  121.     page->p_buf = NULL;
  122.   return (buf);
  123. }
  124.     }
  125.   if ((N_buf + 1) == max_buffers_number)
  126.     {
  127.       waitfor_seg (max_buffers_number);
  128.       buf = find_buf ();
  129.     }
  130.   else
  131.     {
  132.       buf = (struct BUFF *) get_empty (sizeof (struct BUFF));
  133.       buf->b_seg = new_seg ();
  134.       N_buf++;
  135.     }
  136.   buf->b_next = NULL;
  137.   buf->b_prev = NULL;
  138.   buf->b_status = EMP;
  139.   buf->b_page = NULL;
  140.   buf->b_prmod = PRNMOD;
  141.   buf->b_micro = NULL_MICRO;
  142.   return (buf);
  143. }
  144. /****************************** delete buffer *******************************/
  145. void
  146. del_buf (struct BUFF *buf)
  147. {
  148.   push_buf (buf);
  149.   buf->b_page->p_buf = NULL;
  150.   del_seg (buf->b_seg);
  151.   unset_prio (buf);
  152.   xfree ((char *) buf);
  153.   N_buf--;
  154. }
  155. void
  156. push_buf (struct BUFF *buf)
  157. {
  158.   if (buf->b_micro != NULL_MICRO)
  159.     push_micro (buf->b_micro);
  160.   if (buf->b_prmod == PRMOD)
  161.     write_buf (buf);
  162. }
  163. /*****************************************************************************
  164.                         OPTIMAL NUMBER OF BUFFERS
  165. */
  166. extern i4_t N_opt; /* optimal number of buffers */
  167. void
  168. optimal (u2_t num)
  169. {
  170.   struct BUFF *buf;
  171.   N_opt = num;
  172.   for (; N_buf <= N_opt;)
  173.     {
  174.       if ((buf = find_buf ())== NULL)
  175. break;
  176.       del_buf (buf);
  177.     }
  178. }
  179. char *
  180. get_empty (unsigned size)
  181. {
  182.   char *item;
  183.   while ((item = (char *) xmalloc (size)) == NULL)
  184.     ;
  185.   return (item);
  186. }
  187. /********************************** the end *********************************/