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

SQL Server

开发平台:

Unix_Linux

  1. /*  shartest.c - Check sharing with a locks qroup
  2.  *               Kernel of GNU SQL-server. Synchronizer     
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by  Vera Ponomarenko
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts:   gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: shartest.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "dessnch.h"
  29. #include "fdclsyn.h"
  30. int
  31. shartest (struct des_lock *anl, i4_t size, char *con, struct des_lock *bl)
  32.      /* bl- begin, anl- end */
  33.      /* 0- is shared with the locks qroup */
  34. {
  35.   struct des_lock *a;
  36.   struct des_cp *cp;
  37.   struct des_tran *tr, *bltran, *rolltr;
  38.   char *b, *aold, *anew, *f;
  39.   COST ccost, mincost;
  40.   CPNM rollcpn;
  41.   for (; bl != anl && bl != NULL; bl = bl->of)
  42.     {
  43.       if (anl->tran == bl->tran)
  44. continue; /* from the same transaction */
  45.       if (anl->lockin == 'm' || bl->lockin == 'm' || shtest1 (anl, con, size, bl) != 0)
  46. {
  47.   /* not shared */
  48.   tr = anl->tran;
  49.   for (bltran = bl->tran; bltran != NULL; bltran = bltran->pbltr)
  50.     if (bltran->pbltr == tr)
  51.       { /* deadlock */
  52. rolltr = tr;
  53. cp = (struct des_cp *) tr->ptlb;
  54. rollcpn = cp->cpnum;
  55. mincost = tr->trcost - cp->cpcost;
  56. /* the second pass along the deadlock ring */
  57. for (bltran = bl->tran, a = bl;; bltran = bltran->pbltr)
  58.   {
  59.     a = (struct des_lock *) ((char *) a + a->dls);
  60.     if (a <= (struct des_lock *) bltran->plcp)
  61.       {
  62. /* block lock is before a checkpoint */
  63. while (a->dls != cpsize)
  64.   a = (struct des_lock *) ((char *) a + a->dls);
  65. cp = ((struct des_cp *) a)->pdcp;
  66.       }
  67.     else
  68.       cp = bltran->plcp;
  69.     ccost = bltran->trcost - cp->cpcost; /* a rollback cost */
  70.     if (ccost < mincost)
  71.       {
  72. mincost = ccost;
  73. rolltr = bltran; /* a rollback victim */
  74. rollcpn = cp->cpnum;
  75.       }
  76.     if (bltran == tr)
  77.       break;
  78.     a = ((struct des_wlock *) bltran->pwlock)->Dup;
  79.   }
  80. /*                  rolltr->pbltr=NULL;     break up the deadlock chain */
  81. answer_opusk (rolltr->idtr, rollcpn);
  82. if (rolltr == tr)
  83.   {
  84.     return (2);
  85.   }
  86. break;
  87.       }
  88.   if (anl != (a = tr->pwlock) && a != NULL)
  89.     { /*if the lock isn't first wait*/
  90.       f = tr->firstfree;
  91.       aold = f - 1;
  92.       anew = aold + wlsize;
  93.       b = (char *) anl + locksize - 1;
  94.       for (; aold >= b;)
  95. *anew-- = *aold--;
  96.       anl->dls += wlsize;
  97.       f += wlsize;
  98.       tr->freelb -= wlsize;
  99.       a = (struct des_lock *) ((char *) anl + anl->dls);
  100.       for (; f > (char *) a; a = (struct des_lock *) ((char *) a + a->dls))
  101. refrem (a);
  102.     }
  103.   tr->pbltr = bl->tran;
  104.   ((struct des_wlock *) anl)->Dup = bl;
  105.   ((struct des_wlock *) anl)->Dqueue = bl->Ddown;
  106.   bl->Ddown = (struct des_wlock *) anl;
  107.   return (1);
  108. }
  109.     }
  110.   return (0);
  111. }
  112. void
  113. refrem (struct des_lock *a)
  114. {
  115.   struct des_wlock *aw;
  116.   
  117.   lilore (a->rel, a, a, a);
  118.   for (aw = a->Ddown; aw != NULL; aw = aw->Dqueue)
  119.     aw->Dup = a;
  120. }