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

SQL Server

开发平台:

Unix_Linux

  1. /*  incrs.c  - Transaction locks region extension
  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: incrs.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "xmem.h"
  29. #include "dessnch.h"
  30. #include "fdclsyn.h"
  31. #include <assert.h>
  32. extern i4_t reg_tran_size;
  33.  /*********************************/
  34.  /* Transaction locks region copy */
  35.  /*********************************/
  36. static
  37. int
  38. lbrem (struct des_tran *tr, char *newadd, i4_t N_new)
  39. {
  40.   struct des_lock *a, *a1, *end_of_locks;
  41.   struct des_rel *r;
  42.   struct des_wlock *aw, *oldadd;
  43.   char *b, *oldb, *ff;
  44.   i4_t N, N_old, adls;
  45.   ff = tr->firstfree;
  46.   oldb = tr->ptlb; /* an old place */
  47.   tr->ptlb = newadd;
  48.   tr->plcp = (struct des_cp *) newadd;
  49.   N_old = ff - oldb;
  50.   bcopy (oldb, newadd, N_old);
  51.   N = newadd - oldb;
  52.   if (tr->pwlock != NULL)
  53.     tr->pwlock = (struct des_lock *) ((char *) tr->pwlock + N);
  54.   tr->freelb = N_new - N_old;
  55.   tr->firstfree = newadd + N_old;
  56.   a = (struct des_lock *) (newadd + cpsize); /* The first lock address */
  57.   end_of_locks = (struct des_lock *) tr->firstfree;  
  58.   for (; a < end_of_locks; a = (struct des_lock *) ((char *) a + adls))
  59.     {
  60.       adls = a->dls;
  61.       assert (adls % sizeof (i4_t) == 0);
  62.       if (adls == cpsize)
  63. {
  64.   ((struct des_cp *) a)->pdcp = tr->plcp;
  65.   tr->plcp = (struct des_cp *) a;
  66. }
  67.       else
  68. {
  69.   r = a->rel;
  70.   b = (char *) a->of;
  71.   if (b != NULL)
  72.     {
  73.       if (b >= oldb && b < ff)
  74. a->of = (struct des_lock *) ((char *) a->of + N);
  75.       else
  76. a->of->ob = a;
  77.     }
  78.   else
  79.     r->rob = a; /* if the lock is last */
  80.   b = (char *) a->ob;
  81.   if (b != NULL)
  82.     {
  83.       if (b >= oldb && b < ff)
  84. a->ob = (struct des_lock *) ((char *) a->ob + N);
  85.       else
  86. a->ob->of = a;
  87.     }
  88.   else
  89.     r->rof = a; /* if the lock is first in the list */
  90.   for (aw = a->Ddown; aw != NULL; aw = aw->Dqueue)
  91.     aw->Dup = a;
  92.   if (a == tr->pwlock)
  93.     { /* if the lock is first wait */
  94.       oldadd = (struct des_wlock *) (oldb + ((char *) a - newadd));
  95.       aw = (struct des_wlock *) a;
  96.       a1 = aw->Dup; /* a block lock address */
  97.       if (a1->Ddown == oldadd)
  98. a1->Ddown = aw;
  99.       else
  100. {
  101.   aw = a1->Ddown;
  102.   while (aw->Dqueue != oldadd)
  103.     aw = aw->Dqueue;
  104.   aw->Dqueue = (struct des_wlock *) a;
  105. }
  106.     }
  107. }
  108.     }
  109.   return (0);
  110. }
  111. int
  112. increase (struct des_tran *tr)
  113.      /* increase Transaction locks region */
  114. {
  115.   char *oldptlb, *newadd;
  116.   i4_t N;
  117.   oldptlb = tr->ptlb;
  118.   N = tr->firstfree - tr->ptlb + tr->freelb + reg_tran_size;
  119.   newadd = (char *) xmalloc (N);
  120.   lbrem (tr, newadd, N);
  121.   xfree ((void *) oldptlb);
  122.   return (0);
  123. }