.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 2000-2005 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $SQL$Project Distributed Database System$VGG08$
.tt 2 $$$
.tt 3 $ElkeZ$Regions_and_Longwaits$2000-03-03$
***********************************************************
.nf
 
 .nf
 
    ========== licence begin  GPL
    Copyright (c) 2000-2005 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
.fo
 
 
.fo
.nf
.sp
Module  : Regions_and_Longwaits
=========
.sp
Purpose : Modul for initializing the regions and for RTE-calls
          for long wait situations
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
        VAR
              g08backup        : tsp00_RegionId;
              g08datawrtr      : tsp00_RegionId;
              g08objcontf      : tsp00_RegionId;        (* before: g08cnstview PTS 1127279 FF *)
              g08config        : tsp00_RegionId;
              g08convert0      : tsp00_RegionId;
              g08data1         : tsp00_RegionId;
              g08datacache     : tsp00_RegionId;
              g08dcom          : tsp00_RegionId;
              g08diagcache     : tsp00_RegionId;
              g08fbm           : tsp00_RegionId;
              g08garbage       : tsp00_RegionId;
              g08hashinit      : tsp00_RegionId;
              g08lock0         : tsp00_RegionId;
              g08lockinit      : tsp00_RegionId;
              g08lockpool      : tsp00_RegionId;
              g08lockreq       : tsp00_RegionId;
              g08lockwait      : tsp00_RegionId;
              g08savepoint     : tsp00_RegionId;
              g08logqueue0     : tsp00_RegionId;
              g08loginfo       : tsp00_RegionId;
              g08LVCEmergency  : tsp00_RegionId;
              g08history0      : tsp00_RegionId;
              g08logwriter     : tsp00_RegionId;
              g08monitor       : tsp00_RegionId;
              g08history       : tsp00_RegionId;
              g08oms1          : tsp00_RegionId;
              g08permfdir      : tsp00_RegionId;
              g08save0         : tsp00_RegionId;
              g08server        : tsp00_RegionId;
              g08surrogate     : tsp00_RegionId;
              g08trace         : tsp00_RegionId;
              g08ConvIndex     : tsp00_RegionId;
              g08ConvWaitQueue : tsp00_RegionId;
              g08ComponentEnd  : tsp00_RegionId;
              g08LockParallel  : tsp00_RegionId;
              g08redocontrol   : tsp00_RegionId;
 
        PROCEDURE
              g08check_excl (region : tsp00_RegionId);
 
        PROCEDURE
              g08excl_check (pid : tsp00_TaskId;
                    region       : tsp00_RegionId);
 
        PROCEDURE
              g08region_ids;
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01vtrace : tgg00_VtraceState;
 
        PROCEDURE
              g01abort (msg_no : tsp00_Int4;
                    msg_label  : tsp00_C8;
                    msg_text   : tsp00_C24;
                    bad_value  : tsp00_Int4);
 
        FUNCTION
              g01region_cnt (region_type : tgg00_RegionType) : tsp00_Int4;
 
      ------------------------------ 
 
        FROM
              GG_edit_routines : VGG17;
 
        PROCEDURE
              g17trimint4_to_line (int : tsp00_Int4;
                    VAR ln_len : integer;
                    VAR ln     : tsp00_Region);
 
        PROCEDURE   (* PTS 1124170 *)
              g17int4to_line (
                    intval    : tsp00_Int4;
                    with_zero : boolean;
                    int_len   : integer;
                    ln_pos    : integer;
                    VAR ln    : tsp00_C8);
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        PROCEDURE
              vgetpid (VAR pid : tsp00_TaskId);
 
        FUNCTION
              visexcl (pid : tsp00_TaskId;
                    region : tsp00_RegionId) : boolean;
 
        PROCEDURE
              vsemainfo (sid     : tsp00_RegionId;
                    VAR semaname : tsp00_Region);
 
        PROCEDURE
              vsemaphid (VAR semaname : tsp00_Region;
                    VAR sid           : tsp00_RegionId);
 
      ------------------------------ 
 
        FROM
              KB_Logging : VKB560;
 
        FUNCTION
              kb560GetNumOfUserUKTs : tsp00_Int4;
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        PROCEDURE
              g17trimint4_to_line;
 
              tsp00_Line tsp00_Region
 
        PROCEDURE
              g17int4to_line;
 
              tsp_line tsp_region
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : ElkeZ
.sp
.cp 3
Created : 1983-07-29
.sp
.cp 3
.sp
.cp 3
Release :      Date : 2000-03-03
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      c_nil_region = -1;
 
 
(*------------------------------*) 
 
PROCEDURE
      g08check_excl (region : tsp00_RegionId);
 
VAR
      pid : tsp00_TaskId;
 
BEGIN
IF  region <> c_nil_region
THEN
    BEGIN
    vgetpid (pid);
    g08excl_check (pid, region)
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      g08excl_check (pid : tsp00_TaskId;
            region       : tsp00_RegionId);
 
VAR
      i        : integer;
      semaname : tsp00_Region;
      msg      : tsp00_C24;
 
BEGIN
IF  (region <> c_nil_region) AND g01vtrace.vtrCheck_gg00
THEN
    BEGIN
    IF  NOT visexcl (pid, region)
    THEN
        BEGIN
        vsemainfo (region, semaname);
        msg := 'NOT IN REGION           ';
        FOR i := 1 TO 8 DO
            msg [14+i] := semaname [i];
        (*ENDFOR*) 
        g01abort (csp3_g08x1_excl_check, csp3_n_check, msg, region)
        END
    (*ENDIF*) 
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      g08region_ids;
 
VAR
      semaname : tsp00_Region;
 
BEGIN
semaname :=            'BACKUP  ';
vsemaphid (semaname, g08backup   );
(* *)
semaname :=            'DATAWRTR';
vsemaphid (semaname, g08datawrtr );
(* *)
semaname :=            'CONFIG  ';
vsemaphid (semaname, g08config   );
(* *)
gg08multi_vsemaphid   ('CONV    ', g08convert0, 1,
      g01region_cnt (rgnConvert_egg00));
(* *)
semaname :=            'DATACACH';
vsemaphid (semaname, g08datacache);
(* *)
semaname :=            'DCOM    ';
vsemaphid (semaname, g08dcom);
(* *)
semaname :=            'DIAGCACH';
vsemaphid (semaname, g08diagcache);
(* *)
semaname :=            'FBM     ';
vsemaphid (semaname, g08fbm      );
(* *)
semaname :=            'HASHINIT';
vsemaphid (semaname, g08hashinit );
(* *)
(* PTS 1113051 E.Z. *)
(* *)
semaname :=            'GARBAGE ';
vsemaphid (semaname, g08garbage  );
(* *)
semaname :=            'LOCKINIT';
vsemaphid (semaname, g08lockinit );
(* *)
semaname :=            'LOCKPOOL';
vsemaphid (semaname, g08lockpool );
(* *)
semaname :=            'LOCKREQ ';
vsemaphid (semaname, g08lockreq  );
(* *)
semaname :=            'LOCKWAIT';
vsemaphid (semaname, g08lockwait );
(* *)
semaname :=            'SAVEPOIN';
vsemaphid (semaname, g08savepoint );
(* *)
gg08multi_vsemaphid   ('LOGQUE  ', g08logqueue0, 1, 1(*+++*));
(* *)
semaname :=            'LOGINFO ';
vsemaphid (semaname, g08loginfo);
(* *)
semaname :=            'LVC_EMCY';
vsemaphid (semaname, g08LVCEmergency);
(* *)
gg08multi_vsemaphid   ('HIST    ', g08history0, 1, kb560GetNumOfUserUKTs);
(* *)
semaname :=            'LOGWRITE';
vsemaphid (semaname, g08logwriter);
(* *)
semaname :=            'MONITOR ';
vsemaphid (semaname, g08monitor  );
(* *)
semaname :=            'SERVER  ';
vsemaphid (semaname, g08server   );
(* *)
semaname :=            'OBJCONTF';      (* before: CNSTVIEW PTS 1127279 FF *)
vsemaphid (semaname, g08objcontf ); (* before: g08cnstview PTS 1127279 FF *)
(* *)
semaname :=            'HISTORY ';
vsemaphid (semaname, g08history);
(* *)
semaname :=            'PERMFDIR';
vsemaphid (semaname, g08permfdir );
(* *)
semaname :=            'SURROGAT';
vsemaphid (semaname, g08surrogate);
(* *)
semaname :=            'CONVINDX';
vsemaphid (semaname, g08ConvIndex);
(* *)
semaname :=            'CONVWAIT';
vsemaphid (semaname, g08ConvWaitQueue);
(* *)
semaname :=            'TRACE   ';
vsemaphid (semaname, g08trace    );
(* *)
semaname :=            'COMP_END';                                   (* PTS 1118263 FF 2002-10-09 *)
vsemaphid (semaname, g08ComponentEnd );
(* *)
semaname :=            'LOCKPAR ';                                   (* PTS 1126829 *)
vsemaphid (semaname, g08LockParallel);
(* *)
semaname :=            'REDOCTRL';
vsemaphid (semaname, g08redocontrol);
(* *)
gg08OMSmulti_vsemaphid   ('OMS     ', g08oms1, 1,
      g01region_cnt (rgnOMS_egg00));
(* *)
gg08multi_vsemaphid   ('SAVE    ', g08save0, 1,
      g01region_cnt (rgnSave_egg00));
g08save0 := g08save0 - 1;
(* *)
gg08multi_vsemaphid   ('DATA    ', g08data1, 1,
      g01region_cnt (rgnData_egg00));
(* *)
gg08multi_vsemaphid   ('TRANS   ', g08lock0,
      1,
      g01region_cnt (rgnTrans_egg00));
(* *)
gg08multi_vsemaphid   ('TAB     ', g08lock0,
      g01region_cnt (rgnTrans_egg00) +
      1,
      g01region_cnt (rgnTrans_egg00) +
      g01region_cnt (rgnTab_egg00  ));
(* *)
gg08multi_vsemaphid   ('ROW     ', g08lock0,
      g01region_cnt (rgnTrans_egg00) +
      g01region_cnt (rgnTab_egg00  ) +
      1,
      g01region_cnt (rgnTrans_egg00) +
      g01region_cnt (rgnTab_egg00  ) +
      g01region_cnt (rgnRow_egg00  ));
(* *)
g08lock0 := g08lock0 - 1
END;
 
(*------------------------------*) 
 
PROCEDURE
      gg08multi_vsemaphid (region_name_prefix : tsp00_Region;
            VAR first_region_id : tsp00_RegionId;
            region_lwb          : integer;
            region_cnt          : integer);
 
VAR
      i          : integer;
      len        : integer;
      prefix_len : integer;
      aux_sem_id : tsp00_RegionId;
      semaname   : tsp00_Region;
 
BEGIN
prefix_len := sizeof (region_name_prefix);
WHILE (prefix_len > 1) AND (region_name_prefix [prefix_len] = ' ') DO
    prefix_len := prefix_len - 1;
(*ENDWHILE*) 
FOR i := region_lwb TO region_cnt DO
    BEGIN
    semaname := region_name_prefix;
    len      := prefix_len;
    g17trimint4_to_line (i, len, semaname);
    IF  i = 1
    THEN
        vsemaphid (semaname, first_region_id)
    ELSE
        vsemaphid (semaname, aux_sem_id)
    (*ENDIF*) 
    END
(*ENDFOR*) 
END;
 
(* PTS 1108531 *)
(*------------------------------*) 
 
PROCEDURE
      gg08OMSmulti_vsemaphid (region_name_prefix : tsp00_Region;
            VAR first_region_id : tsp00_RegionId;
            region_lwb          : integer;
            region_cnt          : integer);
 
CONST
      OMS_VDIR_SIZE = 17; (* PTS 1124170; must match definition in OMS_Defines.h *)
      OMS_SYS_RGNS  = 7 + OMS_VDIR_SIZE; (* PTS 1124533 *)
 
VAR
      i           : integer;
      len         : integer;
      prefix_len  : integer;
      aux_sem_id  : tsp00_RegionId;
      semaname    : tsp00_Region;
      semanameArr : ARRAY[1..OMS_SYS_RGNS] OF tsp00_Region;
 
BEGIN
semanameArr[1] := 'OMSMON  ';
semanameArr[2] := 'OMSUNLDV';
semanameArr[3] := 'OMSCDIR '; (* PTS 1112197 *)
semanameArr[4] := 'OMSVDIR ';
semanameArr[5] := 'OMSSHHP ';
semanameArr[6] := 'OMSSTHP ';
semanameArr[7] := 'OMSEMHP ';
(*
      ** If index of the array for the following entries is changed, then
      ** these changes must be applied in OMS_Defines.h to the following 'define':
      ** OMS_VDIR_CS_START_CNT
      *)
FOR i := 1 TO OMS_VDIR_SIZE DO (* PTS 1124533 *)
    BEGIN
    semanameArr[7+i] := 'OMSVD   ';
    g17int4to_line (i, true, 3, 6, semanameArr[7+i])
    END;
(*ENDFOR*) 
vsemaphid (semanameArr[1], first_region_id);
FOR i := 2 TO OMS_SYS_RGNS DO
    vsemaphid (semanameArr[i], aux_sem_id);
(*ENDFOR*) 
region_cnt := region_cnt - OMS_SYS_RGNS;
prefix_len := sizeof (region_name_prefix);
WHILE (prefix_len > 1) AND (region_name_prefix [prefix_len] = ' ') DO
    prefix_len := prefix_len - 1;
(*ENDWHILE*) 
FOR i := region_lwb TO region_cnt DO
    BEGIN
    semaname := region_name_prefix;
    len      := prefix_len;
    g17trimint4_to_line (i, len, semaname);
    vsemaphid (semaname, aux_sem_id)
    END
(*ENDFOR*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
