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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  queue.c  -  This file contains functions maintaining queues of 
  3.  *              waiting locks
  4.  *              Kernel of GNU SQL-server. Buffer 
  5.  *
  6.  *     We assume: the last element of a ring lies in the field "p_queue"
  7.  *  of the current page descriptor; we include queue items at the end of the
  8.  *  ring and exclude items at the beginning of it.
  9.  *
  10.  *  This file is a part of GNU SQL Server
  11.  *
  12.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  13.  *  Developed at the Institute of System Programming
  14.  *  This file is written by  Vera Ponomarenko
  15.  *
  16.  *  This program is free software; you can redistribute it and/or modify
  17.  *  it under the terms of the GNU General Public License as published by
  18.  *  the Free Software Foundation; either version 2 of the License, or
  19.  *  (at your option) any later version.
  20.  *
  21.  *  This program is distributed in the hope that it will be useful,
  22.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  23.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24.  *  GNU General Public License for more details.
  25.  *
  26.  *  You should have received a copy of the GNU General Public License
  27.  *  along with this program; if not, write to the Free Software
  28.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  29.  *
  30.  *  Contacts:   gss@ispras.ru
  31.  *
  32.  */
  33. /* $Id: queue.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  34. #include "setup_os.h"
  35. #include "inpop.h"
  36. #include "bufdefs.h"
  37. #include "fdeclbuf.h"
  38.       
  39. struct WAIT *
  40. new_wait (u2_t conn, u2_t type, u2_t tact, u2_t prg)
  41. {
  42.   struct WAIT *wait;
  43.   wait = (struct WAIT *) get_empty (sizeof (struct WAIT));
  44.   wait->w_conn = conn;
  45.   wait->w_type = type;
  46.   wait->w_tact = tact;
  47.   wait->w_prget = prg;
  48.   return (wait);
  49. }
  50. void
  51. into_wait (struct PAGE *page, struct WAIT *wait) /* insert new waiting lock */
  52. {
  53.   struct WAIT *w;
  54.   w = page->p_queue;
  55.   wait->w_next = NULL;
  56.   if (!w)
  57.     page->p_queue = wait;
  58.   else
  59.     {
  60.       while (w->w_next)
  61.         w = w->w_next;
  62.       w->w_next = wait;
  63.     }
  64. }
  65. void
  66. out_first (struct PAGE *page) /* exclude first waiting lock */
  67. {
  68.   struct WAIT *wait;
  69.   wait = page->p_queue;
  70.   assert(wait);
  71.   page->p_queue = wait->w_next;
  72.   xfree ((char *) wait);
  73. }
  74. void
  75. set_weak_locks (struct PAGE *page)
  76. {
  77.   struct WAIT *wait;
  78.   struct BUFF *buf;
  79.   u2_t prg, trnum;
  80.   while (page->p_queue->w_type == WEAK)
  81.     {
  82.       wait = page->p_queue;
  83.       page->p_status++;
  84.       prg = wait->w_prget;
  85.       trnum = wait->w_conn;
  86.       out_first (page);
  87.       if (prg == 1)
  88. {
  89.   buf = get (page->p_seg, page->p_page, 'r');
  90.   buf_to_user (trnum, buf->b_seg->keyseg);
  91. }
  92.       else
  93. user_p (trnum, GOOD);
  94.     }
  95. }
  96. /********************************* the end **********************************/