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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  page.c  -  This file contains functions supporting the possibility
  3.  *               of entering into the page table.
  4.  *             Kernel of GNU SQL-server. Buffer  
  5.  *
  6.  *  This file is a part of GNU SQL Server
  7.  *
  8.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  9.  *  Developed at the Institute of System Programming
  10.  *  This file is written by  Vera Ponomarenko
  11.  *
  12.  *  This program is free software; you can redistribute it and/or modify
  13.  *  it under the terms of the GNU General Public License as published by
  14.  *  the Free Software Foundation; either version 2 of the License, or
  15.  *  (at your option) any later version.
  16.  *
  17.  *  This program is distributed in the hope that it will be useful,
  18.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20.  *  GNU General Public License for more details.
  21.  *
  22.  *  You should have received a copy of the GNU General Public License
  23.  *  along with this program; if not, write to the Free Software
  24.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  25.  *
  26.  *  Contacts:   gss@ispras.ru
  27.  *
  28.  */
  29. /* $Id: page.c,v 1.246 1997/03/31 11:05:17 kml Exp $ */
  30. #include "setup_os.h"
  31. #include "inpop.h"
  32. #include "bufdefs.h"
  33. #include "fdeclbuf.h"
  34. /*****************************************************************************
  35.                                 HASH TABLE
  36. */
  37. struct PAGE *hash_table[HASHSIZE];
  38. void
  39. init_hash (void) /* initilization of hash table */
  40. {
  41.   u2_t item;
  42.   for (item = 0; item < HASHSIZE; item++)
  43.     hash_table[item] = NULL;
  44. }
  45. u2_t
  46. hash (u2_t page) /* hash address */
  47. {
  48.   return (page & (HASHSIZE - 1));
  49. }
  50. /*****************************************************************************
  51.                                PAGE TABLE
  52. ************************* page rings service ********************************/
  53. struct PAGE *
  54. new_page (u2_t seg_num, u2_t page_num) /* full page address */
  55. {
  56.   struct PAGE *page;
  57.   u2_t item;
  58.   page = (struct PAGE *) get_empty (sizeof (struct PAGE));
  59.   page->p_seg = seg_num;
  60.   page->p_page = page_num;
  61.   page->p_status = 0;
  62.   page->p_ltype = NO_LOCK;
  63.   page->p_queue = NULL;
  64.   page->p_buf = NULL;
  65.   item = hash (page_num);
  66.   if (hash_table[item] == NULL)
  67.     {
  68.       page->p_next = page;
  69.       page->p_prev = page;
  70.       hash_table[item] = page;
  71.     }
  72.   else
  73.     {
  74.       page->p_prev = hash_table[item]->p_prev;
  75.       hash_table[item]->p_prev->p_next = page;
  76.       page->p_next = hash_table[item];
  77.       hash_table[item]->p_prev = page;
  78.     }
  79.   return (page);
  80. }
  81. void
  82. del_page (struct PAGE *page)      /* exclude item from page ring */
  83. {
  84.   u2_t item;
  85.   item = hash (page->p_page);
  86.   if (page->p_next == page)
  87.     hash_table[item] = NULL;
  88.   else
  89.     {
  90.       page->p_next->p_prev = page->p_prev;
  91.       page->p_prev->p_next = page->p_next;
  92.       if (hash_table[item] == page)
  93. hash_table[item] = page->p_next;
  94.     }
  95.   xfree ((char *) page);
  96. }
  97. /************************* finding page descriptor **************************/
  98. struct PAGE *
  99. find_page (u2_t n_seg, u2_t n_page) /* full page number */
  100. {
  101.   struct PAGE *page, *page0;
  102.   page = page0 = hash_table[hash (n_page)];
  103.   if (page != NULL) /* if there is a nontrivial ring */
  104.     do
  105.       if (page->p_seg == n_seg && page->p_page == n_page)
  106. return (page);
  107.       else
  108. page = page->p_next;
  109.     while (page != page0); /* search in page ring */
  110.   return (NULL);
  111. }
  112. /********************************** the end *********************************/