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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  empty_page.c  -  Operations with pages inside a segment 
  3.  *                   Kernel of GNU SQL-server  
  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: empty_page.c,v 1.247 1997/04/15 11:45:41 vera Exp $ */
  29. #include "destrn.h"
  30. #include "strml.h"
  31. #include "fdcltrn.h"
  32. extern u2_t S_SC_S;
  33. void
  34. emptypg (u2_t sn, u2_t pn, char type)
  35. {
  36.   i4_t n, k;
  37.   char *asp = NULL, *a;
  38.   u2_t rpn;
  39.   i4_t idm;
  40.   struct A pg;
  41.   beg_mop ();
  42.   if (type == 'f')
  43.     {
  44.       asp = getwl (&pg, sn, pn);
  45.       idm = ++((struct p_head *) asp)->idmod;
  46.       recmjform (OLD, sn, pn, idm, 0, BD_PAGESIZE, asp, 0);
  47.       putwul (&pg, 'n');
  48.     }
  49.   n = pn / 8 + 2 * size4b;
  50.   if (pn < 7)
  51.     k = pn;
  52.   else
  53.     k = pn % 8;
  54.   rpn = n / BD_PAGESIZE;
  55.   if (rpn >= S_SC_S)
  56.     fprintf (stderr, "TRN.emptypg: A page number isn't correct");
  57.   while ((asp = getpg (&pg, sn, rpn, 'x')) == NULL);
  58.   a = asp + n;
  59.   if ((*a & BITVL(k)) != 0)
  60.     {
  61.       idm = ++((struct p_head *) asp)->idmod;
  62.       recmjform (OLD, sn, rpn, idm, (u2_t) (a - asp), size1b, a, 0);
  63.       MJ_PUTBL ();
  64.       *a &= ~BITVL(k);
  65.       putpg (&pg, 'm');
  66.     }
  67.   else
  68.     putpg (&pg, 'n');
  69. /*    BUF_unlock(sn,1,&pn);*/
  70. }
  71. u2_t
  72. getempt (u2_t sn)
  73. {
  74.   char *asp = NULL, *a, *lastb;
  75.   i4_t k;
  76.   u2_t pn;
  77.   i4_t idm;
  78.   struct A pg;
  79.   for (pn = (u2_t) 0; pn < S_SC_S; pn++)
  80.     {
  81.       while ((asp = getpg (&pg, sn, pn, 's')) == NULL);
  82.       lastb = asp + BD_PAGESIZE;
  83.       for (a = asp + 2 * size4b, k = 0; a < lastb; a++, k = 0)
  84. for (; k < 8; k++)
  85.   if ((*a & BITVL(k)) == 0)
  86.     {
  87.       idm = begmop (asp);
  88.       recmjform (OLD, sn, pn, idm, (u2_t) (a - asp), size1b, a, 0);
  89.       MJ_PUTBL ();
  90.       *a |= BITVL(k);
  91.       pn = (a - asp - 2 * size4b) * 8 + k;
  92.       putpg (&pg, 'm');
  93.       return (pn);
  94.     }
  95.       putpg (&pg, 'n');
  96.     }
  97.   fprintf (stderr, "TRN.getempt: No free pages in the scale");
  98.   return 0;
  99. }