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

SQL Server

开发平台:

Unix_Linux

  1. /*  dlock.c  - Unlock narrow locks
  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: dlock.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "xmem.h"
  29. #include "dessnch.h"
  30. #include "sctpsyn.h"
  31. #include "sctp.h"
  32. #include "fdclsyn.h"
  33. static void
  34. bltrrem (struct des_lock *a, struct des_lock *anl)
  35.      /* move blocking tree */
  36. {
  37.   struct des_wlock *aw, *aw1;
  38.   
  39.   for (aw = aw1 = a->Ddown; aw != NULL; aw1 = aw, aw = aw->Dqueue)
  40.     aw->Dup = anl;
  41.   aw1->Dqueue = anl->Ddown;
  42.   anl->Ddown = a->Ddown;
  43. }
  44. static char *
  45. twrem (struct des_tran *tr, struct des_lock *a, char *t)
  46. {
  47.   i4_t n;
  48.   
  49.   if ((n = a->dls) == cpsize)
  50.     {
  51.       struct des_cp *cp, *cp1;
  52.       cp = (struct des_cp *) a;
  53.       *(struct des_cp *) t = *cp;
  54.       for (cp1 = tr->plcp; cp1 != NULL; cp1 = cp1->pdcp)
  55. if (cp1->pdcp == cp)
  56.   {
  57.     cp1->pdcp = (struct des_cp *) t;
  58.     break;
  59.   }
  60.     }
  61.   else
  62.     {
  63.       bcopy ((char *) a, t, n);
  64.       refrem ((struct des_lock *) t);
  65.     }
  66.   return (t + n);
  67. }
  68. #define BETWEEN_CMP(t)  (t == SS || t == SES || t == SSE || t == SESE)
  69. static int
  70. fullcv (struct des_lock *a, struct des_lock *b)
  71.      /* 1-  a cover is full, 0- not */
  72.      /* a - a new lock, b - an old lock */
  73. {
  74.   u2_t at, bt, astsc, bstsc, na1, na2, nb1, nb2, type;
  75.   i4_t (*f) (char *, char *, u2_t, u2_t);
  76.   i4_t v, v1, v2;  
  77.   char *ad, *bd, *a1, *b1, *a2, *b2;
  78.   char *ascale, *bscale;
  79.   struct des_field *field;
  80.   ascale = (char *) a + a->dls;
  81.   ascale--;
  82.   bscale = (char *) b + b->dls;
  83.   bscale--;
  84.   astsc = 1;
  85.   bstsc = 1;
  86.   field = (struct des_field *) (a->rel + 1);
  87.   ad = (char *) a + locksize;
  88.   bd = (char *) b + locksize;
  89.   for (;; field++)
  90.     {
  91.       at = ss1 (&ascale, astsc++);
  92.       bt = ss1 (&bscale, bstsc++);
  93.       type = field->field_type;
  94.       if (bt == ENDSC)
  95. return (1);
  96.       if (at == ENDSC)
  97. return (0);
  98.       if (bt == NOTLOCK)
  99. {
  100.   if (at == X_X || at == S_S)
  101.     continue;
  102.   at = ss1 (&ascale, astsc++);
  103.   if (at == SS || at == SES || at == SSE || at == SESE)
  104.     ad = proval (ad, type);
  105.   ad = proval (ad, type);
  106.   continue;
  107. }
  108.       if (at == NOTLOCK)
  109. return (0);
  110.       if (at == X_X)
  111. {
  112.   if (bt == X_X || bt == S_S)
  113.     continue;
  114.   bt = ss1 (&bscale, bstsc++);
  115.   if (bt == SS || bt == SES || bt == SSE || bt == SESE)
  116.     bd = proval (bd, type);
  117.   bd = proval (bd, type);
  118.   continue;
  119. }
  120.       if (bt == X_X)
  121. return (0);
  122.       if (at == S_S)
  123. {
  124.   if (bt == X_D)
  125.     return (0);
  126.   if (bt == S_S)
  127.     continue;
  128.   bt = ss1 (&bscale, bstsc++);
  129.   if (bt == SS || bt == SES || bt == SSE || bt == SESE)
  130.     bd = proval (bd, type);
  131.   bd = proval (bd, type);
  132.   continue;
  133. }
  134.       if (bt == S_S || (bt == X_D && at == S_D))
  135. return (0);
  136.       at = ss1 (&ascale, astsc++);
  137.       bt = ss1 (&bscale, bstsc++);
  138.       if (BETWEEN_CMP (at))
  139. {      
  140.   if (bt == SML || bt || SMLEQ || bt == GRT || bt == GRTEQ)
  141.     return(0);
  142. }
  143.       if (bt == NEQ && at != NEQ)
  144. return (0);
  145.       if (at == EQ && bt != EQ)
  146. return (0);
  147.       switch (type)
  148. {
  149. case T1B:
  150.   f = f1b;
  151.   ad = ftint (at, ad, &a1, &a2, size1b);
  152.   bd = ftint (bt, bd, &b1, &b2, size1b);
  153.   break;
  154. case T2B:
  155.   f = f2b;
  156.   ad = ftint (at, ad, &a1, &a2, size2b);
  157.   bd = ftint (bt, bd, &b1, &b2, size2b);
  158.   break;
  159. case T4B:
  160.   f = f4b;
  161.   ad = ftint (at, ad, &a1, &a2, size4b);
  162.   bd = ftint (bt, bd, &b1, &b2, size4b);
  163.   break;
  164. case TFLOAT:
  165.   f = flcmp;
  166.   ad = ftint (at, ad, &a1, &a2, size4b);
  167.   bd = ftint (bt, bd, &b1, &b2, size4b);
  168.   break;
  169. case TFL:
  170.   f = ffloat;
  171.   ad = ftch (at, ad, &a1, &a2, &na1, &na2);
  172.   bd = ftch (bt, bd, &b1, &b2, &nb1, &nb2);
  173.   break;
  174. case TCH:
  175.     f = chcmp;
  176.   ad = ftch (at, ad, &a1, &a2, &na1, &na2);
  177.   bd = ftch (bt, bd, &b1, &b2, &nb1, &nb2);
  178.   break;
  179. default:
  180.   f = NULL;
  181.   error ("SYN.fullcv: This type is false");
  182.   break;
  183. }
  184.       if (at == SML || at == SMLEQ)
  185. na1 = 0;
  186.       if (bt == SML || bt == SMLEQ)
  187. nb1 = 0;
  188.       if (at == GRT || at == GRTEQ)
  189. na2 = (u2_t) ~0;
  190.       if (bt == GRT || bt == GRTEQ)
  191. nb2 = (u2_t) ~0; 
  192.       
  193.       v = f (a2, b1, na2, nb1);
  194.       if (at == NEQ)
  195. {
  196.   if (bt == NEQ &&  v != 0)
  197.     return (0);
  198. }
  199.       else
  200. {
  201.   if (v < 0)
  202.     return (0);
  203.   if ((v1 = f (b1, a1, nb1, na1)) < 0)
  204.     return (0);
  205.   if ((v2 = f (a2, b2, na2, nb2)) < 0)
  206.     return (0);   
  207.   if (v == 0)     /* a2 was compared with b1 */
  208.     {
  209.       if ( bt == EQ && (at == SML || at == SS || at == SES))
  210. return (0);
  211.       if ( (bt == SES || bt == SESE) && (at == SSE || at == SESE))
  212. return (0);
  213.     }
  214.   if (v1 == 0)    /* b1 was compared with a1 */
  215.     {
  216.       if (bt == EQ && (at == GRT || at == SS || at == SSE))
  217. return (0);
  218.       if ((bt == SES || bt == SESE) && (at == GRT || at == SS || at == SSE))
  219. return (0);
  220.     }
  221.   if (v2 == 0)     /* a2 was compared with b2 */
  222.     {
  223.       if (bt == EQ && (at == SES || at == SESE))
  224. return (0);
  225.       if (bt == SMLEQ && at == SML)
  226. return (0);       
  227.       if ((bt == SSE || bt == SESE) && (at == SS || at == SES))
  228. return (0);
  229.     }
  230. }
  231.     }}
  232. int
  233. dlock (struct des_lock *anl) /* unlock narrow locks */
  234. {
  235.   char *c, *t, *b;
  236.   struct des_rel *r;
  237.   struct des_tran *tr;
  238.   struct des_lock *a, *a1;
  239.   struct des_cp *cp, *cpnext;
  240.   i4_t anldls, delta, n, adls, p = 0;
  241.   r = anl->rel;
  242.   tr = anl->tran;
  243.   anldls = anl->dls;
  244.   a = (struct des_lock *) ((char *) tr->ptlb + cpsize);
  245.   for (t = (char *) a; a != anl; a = (struct des_lock *) ((char *) a + adls))
  246.     if ((adls = a->dls) != cpsize && a->rel == r && a->lockin == 't'
  247. && fullcv (anl, a) == 1)
  248.       { /* if cover is full */
  249. if (p == 0)
  250.   {
  251.     p = 1;
  252.     lilore (r, anl, anl->of, anl->ob);
  253.   }
  254. else
  255.   lilore (r, a, a->of, a->ob);
  256. if (a->Ddown != NULL)
  257.   bltrrem (a, anl); /* move blocking tree */
  258.       }
  259.     else
  260.       {
  261. if (t != (char *) a)
  262.   {
  263.     delta = anldls - ((char *) a - t);
  264.     if (delta > 0)
  265.       {
  266. for (c = tr->firstfree - 1, b = c + delta; c < (char *) a;)
  267.   *b-- = *c--;
  268. if (t <= (char *) tr->plcp)
  269.   tr->plcp = (struct des_cp *) ((char *) tr->plcp + delta);
  270. cp = tr->plcp;
  271. for (cpnext = cp->pdcp; t <= (char *) cpnext; cpnext = cp->pdcp)
  272.   {
  273.     cp->pdcp = (struct des_cp *) ((char *) cp->pdcp + delta);
  274.     cp = cp->pdcp;
  275.   }
  276. a = (struct des_lock *) ((char *) a + delta);
  277. tr->firstfree += delta;
  278. tr->freelb -= delta;
  279. c = tr->firstfree;
  280. a1 = a;
  281. for (; c > (char *) a1; a1 = (struct des_lock *) ((char *) a1 + n))
  282.   if ((n = a1->dls) != cpsize)
  283.     refrem (a1);
  284. anl = (struct des_lock *) ((char *) anl + delta);
  285.       }
  286.             bcopy ((char *) anl, t, anldls);
  287.             anl = (struct des_lock *) t;
  288.             t += anldls;
  289.     tr->firstfree -= anldls;
  290.     tr->freelb += anldls;
  291.     t = twrem (tr, a, t);
  292.     break;
  293.   }
  294. else
  295.   {
  296.     t += adls;
  297.   }
  298.       }
  299.   if (p == 1)
  300.     {
  301.       b = tr->firstfree;
  302.       for (; b != (char *) a; a = (struct des_lock *) ((char *) a + adls))
  303. if ((adls = a->dls) != cpsize && a->rel == r && a->lockin == 't'
  304.     && fullcv (anl, a) == 1)
  305.   {
  306.     lilore (r, a, a->of, a->ob);
  307.     if (a->Ddown != NULL)
  308.       bltrrem (a, anl); /* move blocking tree */
  309.   }
  310. else
  311.   {
  312.     if (t != (char *) a)
  313.       t = twrem (tr, a, t);
  314.     else
  315.       t += adls;
  316.   }
  317.       n = b - t;
  318.       tr->firstfree -= n;
  319.       tr->freelb += n;
  320.     }
  321.   return (0);
  322. }