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

SQL Server

开发平台:

Unix_Linux

  1. /*  incrs.c  - Lock
  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: lock.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "xmem.h"
  29. #include <sys/types.h>
  30. #include "dessnch.h"
  31. #include "deftr.h"
  32. #include "fdclsyn.h"
  33. #include <assert.h>
  34. struct des_rel *firstrel;
  35. extern struct des_tran artran[];
  36. static void
  37. lform1 (struct des_lock *anl, struct des_tran *tr, struct des_rel *r, char lin)
  38. {
  39.   anl->tran = tr;
  40.   anl->rel = r;
  41.   anl->lockin = lin;
  42.   anl->of = NULL;
  43.   anl->ob = r->rob;
  44.   anl->Ddown = NULL;
  45. }
  46. static void
  47. lform2 (struct des_lock *a, i4_t n, u2_t els, char *con)
  48. {
  49.   struct des_rel *r;
  50.   register i4_t i;
  51.   r = a->rel;
  52.   if (r->rof == NULL)
  53.     r->rof = a; /* place the lock into relation locks list */
  54.   if (r->rob != NULL)
  55.     r->rob->of = a;
  56.   r->rob = a;
  57.   if (a->lockin != 'm')
  58.     {
  59.       char *c;
  60.       c = (char *) a + n;
  61.       bcopy (con, c, els);
  62.     }
  63.   i = n + els;
  64.   assert (i % sizeof(i4_t) == 0);
  65.   a->dls = i;
  66.   a->tran->freelb -= i;
  67.   a->tran->firstfree += i;
  68. }
  69. CPNM 
  70. lock(u2_t trnum, struct id_rel rel, COST cost,
  71.      char lin, i4_t totsize, char *lc)
  72. {
  73.   i4_t i;
  74.   char *lastb, *c;
  75.   struct des_tran *tr;
  76.   i4_t rn;
  77.   u2_t arsize, els;
  78.   struct des_rel *r;
  79.   struct des_lock *anl, *fanl;
  80.   for (i = 0; i < TRNUM && artran[i].idtr != trnum; i++);
  81.   tr = artran + i;
  82.   rn = rel.urn.obnum;
  83.   for (r = firstrel; r != NULL; r = r->frellist)
  84.     {
  85.       if (r->idrel.obnum == rn)
  86. goto m1;
  87.     }
  88.   r = crtsrd (trnum, &rel.urn, rel.pagenum, rel.index);
  89. m1:
  90.   if (lin == 'm')
  91.     {
  92.       u2_t *a2b;
  93.       if ((wlocksize + 2 * size2b) > tr->freelb)
  94. increase (tr);
  95.       els = t2bunpack (lc);
  96.       lc += size2b;
  97.       els -= size2b;
  98.       anl = (struct des_lock *) tr->firstfree;
  99.       lform1 (anl, tr, r, lin);
  100.       if ((i = shartest (anl, 0, lc, r->rof)) == 1)
  101. { /* not shared */
  102.   lform2 (anl, wlocksize, 2 * size2b, lc);
  103.   a2b = (u2_t *) ((char *) anl + locksize);
  104.   *a2b++ = rel.pagenum;
  105.   *a2b = rel.index;
  106. }
  107.       else if (i == 2)
  108. return (0);
  109.       else
  110. {
  111.   lform2 (anl, locksize, 2 * size2b, lc);
  112.   a2b = (u2_t *) ((char *) anl + locksize);
  113.   *a2b++ = rel.pagenum;
  114.   *a2b = rel.index;
  115.   answer_opusk (trnum, (CPNM) 0);
  116.   return ((CPNM) 0);
  117. }
  118.     }
  119.   lastb = lc + totsize;
  120.   for (arsize = wlsize, c = lc; c < lastb; c += els - size2b)
  121.     {
  122.       els = t2bunpack (c);
  123.       c +=size2b;
  124.       arsize += locksize + els - size2b;
  125.       if (arsize > tr->freelb)
  126. increase (tr);
  127.     }
  128.   fanl = (struct des_lock *) tr->firstfree;
  129.   for (; lc < lastb; lc += els)
  130.     {
  131.       els = t2bunpack (lc);
  132.       lc += size2b;
  133.       els -= size2b;
  134.       anl = (struct des_lock *) tr->firstfree;
  135.       lform1 (anl, tr, r, lin);
  136.       if ((i = shartest (anl, els, lc, r->rof)) == 1)
  137. {  /* not shared, but this transaction isn't a rollback victim */
  138.   lform2 (anl, wlocksize, els, lc);
  139.   tr->pwlock = anl;
  140.   ((struct des_wlock *) anl)->newcost = cost;
  141.   for (lc += els; lc < lastb; lc += els)
  142.     {
  143.       els = t2bunpack (lc);
  144.       lc += size2b;
  145.       els -= size2b;
  146.       anl = (struct des_lock *) tr->firstfree;
  147.       lform1 (anl, tr, r, lin);
  148.       lform2 (anl, locksize, els, lc);
  149.     }
  150.   return ((CPNM) 0);
  151. }
  152.       if (i == 2)
  153.         return (0);
  154.       lform2 (anl, locksize, els, lc);
  155.     } /* all elementary locks are satisfyed */
  156.   if (lin == 'w')
  157.     dlock (fanl);
  158.   tr->trcost = cost;
  159.   answer_opusk (trnum, (CPNM) 0);
  160.   return ((CPNM) 0);
  161. }
  162. struct des_rel *
  163. crtsrd ( u2_t trnum,  struct id_ob *udr, u2_t pn, u2_t ind)
  164. {
  165.   i4_t rn;
  166.   u2_t fn, arsize;
  167.   struct des_rel *r;
  168.   char *a = NULL;
  169.   rn = udr->obnum;
  170.   if (rn == RDRNUM)
  171.     fn = 7;
  172.   else
  173.     {
  174.       char *asp;
  175.       struct d_r_bd drbd;
  176.       u2_t segn;
  177.       unsigned char t;
  178.       
  179.       segn = udr->segnum;
  180.       asp = getpage (trnum, segn, pn);
  181.       a = asp + *((u2_t *) (asp + phsize) + ind);
  182.       t = *a & MSKCORT;
  183.       if (t == IND)
  184. { /* indirect reference */
  185.   ind = t2bunpack (a + 1);
  186.   pn = t2bunpack (a + 1 + size2b);
  187.   putpage (trnum);
  188.   asp = getpage (trnum, segn, pn);
  189.   a = asp + *((u2_t *) (asp + phsize) + ind);
  190. }
  191.       for (; (*a & EOSC) == 0; a++);
  192.       a++;
  193.       bcopy (a, (char *) &drbd, drbdsize);
  194.       fn = drbd.fieldnum;
  195.     }
  196.   arsize = rfsize * fn;
  197.   r = (struct des_rel *) xmalloc (relsize + arsize);
  198.   r->idrel = *udr;
  199.   r->frellist = firstrel;
  200.   r->brellist = NULL;
  201.   if (firstrel != NULL)
  202.     firstrel->brellist = r;
  203.   firstrel = r;
  204.   r->rof = NULL;
  205.   r->rob = NULL;
  206.   r->rfn = fn;
  207.   if (rn == RDRNUM)
  208.     {
  209.       struct des_field *df, *ldf;
  210.       df = (struct des_field *) (r + 1);
  211.       df->field_type = T4B;
  212.       for (df++, ldf = df + 4; df < ldf; df++)
  213. df->field_type = T2B;
  214.       for (ldf = df + 2; df < ldf; df++)
  215. {
  216.   df->field_type = TCH;
  217.   df->field_size = BD_PAGESIZE - phsize - size2b;
  218. }
  219.     }
  220.   else
  221.     {
  222.       bcopy (a + drbdsize, r + 1, arsize);
  223.       putpage (trnum);
  224.     }
  225.   return (r);
  226. }