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

SQL Server

开发平台:

Unix_Linux

  1. /*  snipc.c - Interprocess communication of Synchronizer
  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: snipc.c,v 1.246 1997/03/31 11:04:58 kml Exp $ */
  28. #include "setup_os.h"
  29. #include <sys/types.h>
  30. #include <sys/times.h>
  31. #if TIME_WITH_SYS_TIME
  32. # include <sys/time.h>
  33. # include <time.h>
  34. #else
  35. # if HAVE_SYS_TIME_H
  36. #  include <sys/time.h>
  37. # else
  38. #  include <time.h>
  39. # endif
  40. #endif
  41. #include <sys/ipc.h>
  42. #include <sys/msg.h>
  43. #include <sys/shm.h>
  44. #include "xmem.h"
  45. #include "dessnch.h"
  46. #include "inpop.h"
  47. #include "f1f2decl.h"
  48. #include "fdclsyn.h"
  49. #include "strml.h"
  50. #ifndef CLK_TCK
  51. #define CLK_TCK 60
  52. #endif
  53. static struct tms buffer;
  54. static i4_t tt, syntime;
  55. i4_t msqid, msqidb;
  56. extern char *segadd;
  57. struct A page;
  58. #define AR     256
  59. static void
  60. opusk_tr (u2_t trnum)
  61. {
  62.   struct msg_buf sbuf;
  63.   
  64.   sbuf.mtype = trnum;
  65.   __MSGSND(msqid, &sbuf, 0, 0,"SYN.msgsnd");
  66. }
  67. static void
  68. finit (void)
  69. {
  70.   PRINTF (("SYN.finit: syntime=%d(msec)n", syntime * 1000 / CLK_TCK));
  71.   exit (0);
  72. }
  73. void
  74. main (i4_t argc, char **argv)
  75. {
  76.   i4_t op, sz;
  77.   key_t keysn, keybf;
  78.   struct msg_buf rbuf;
  79.   struct id_rel idrel;
  80.   u2_t trnum;
  81.   CPNM cpn;
  82.   char *p, lin;
  83.   COST cost;
  84.   MEET_DEBUGGER;
  85.   setbuf (stdout, NULL);
  86.   times (&buffer);
  87.   tt = buffer.tms_utime;
  88.   sscanf (argv[1], "%d", &keysn);
  89.   sscanf (argv[2], "%d", &keybf);
  90.   if ((msqid = msgget (keysn, IPC_CREAT | DEFAULT_ACCESS_RIGHTS)) < 0)
  91.     {
  92.       perror ("SN.msgget");
  93.       exit (1);
  94.     }
  95.   MSG_INIT (msqidb, keybf, "BUF");
  96.   for (;;)
  97.     {
  98.       __MSGRCV(msqid, &rbuf, BD_PAGESIZE, -(ANSSYN - 1), 0,"SN.msgrcv");
  99.       times (&buffer);
  100.       tt = buffer.tms_utime;
  101.       op = rbuf.mtype;
  102.       p = rbuf.mtext;
  103.       switch (op)
  104. {
  105. case START:
  106.   trnum = t2bunpack (p);
  107.   synstart (trnum);
  108.   break;
  109. case LOCK:
  110.           BUFUPACK(p,trnum);
  111.           BUFUPACK(p,idrel);
  112.           BUFUPACK(p,cost);
  113.   lin = *p++;
  114.           BUFUPACK(p,sz);
  115.   cpn = lock (trnum, idrel, cost, lin, sz, p);
  116.   break;
  117. case SVPNT:
  118.   trnum = t2bunpack (p);
  119.   cpn = svpnt (trnum);
  120.   answer_opusk (trnum, cpn);
  121.   break;
  122. case UNLTSP:
  123.           BUFUPACK(p,trnum);
  124.           bcopy (p, (char *) &cpn, sizeof (CPNM));
  125.   unltsp (trnum, cpn);
  126.   opusk_tr (trnum);
  127.   break;
  128. case COMMIT:
  129.   trnum = t2bunpack (p);
  130.   commit (trnum);
  131.   opusk_tr (trnum);
  132.   break;
  133. case FINIT:
  134.   finit ();
  135.   break;
  136. default:
  137.   perror ("SYN.main: No such operation");
  138.   break;
  139. }
  140.       times (&buffer);
  141.       tt = buffer.tms_utime - tt;
  142.       syntime += tt;
  143.     }
  144. }
  145. void
  146. answer_opusk (u2_t trnum, CPNM cpn)
  147. {
  148.   /* this function looks to be totally undebugged */
  149.   struct msg_buf sbuf;
  150.   
  151.   sbuf.mtype = trnum;
  152.   /* make sure we don't receive this message by ourself */
  153.   assert(trnum > FINIT ); 
  154.   *(CPNM *) sbuf.mtext = cpn;
  155.   __MSGSND(msqid, &sbuf, sizeof (CPNM), 0,"SYN.msgsnd");
  156. }
  157. char *
  158. getpage (u2_t trn, u2_t segn, u2_t pn)
  159. {
  160.   struct msg_buf sbuf;
  161.   char *p;
  162.   i4_t shmid;
  163.   key_t keyseg;
  164.   char *shm;
  165.   sbuf.mtype = LOCKGET;
  166.   p = sbuf.mtext;
  167.   BUFPACK(trn,p);
  168.   BUFPACK(segn,p);
  169.   BUFPACK(pn,p);
  170.   *p = WEAK;
  171.   keyseg = BACKUP;
  172.   while (keyseg == BACKUP)
  173.     {
  174.       __MSGSND(msqidb, &sbuf, 3 * size2b + 1, 0,"SYN.msgsnd: LOCKGET to BUF");
  175.       __MSGRCV(msqidb, &sbuf, sizeof (key_t), trn, 0,"SYN.msgrcv: LOCKPAGE from BUF");
  176.       keyseg = *(key_t *) sbuf.mtext;
  177.     }
  178.   if ((shmid = shmget (keyseg, BD_PAGESIZE, DEFAULT_ACCESS_RIGHTS)) < 0)
  179.     {
  180.       perror ("SYN.shmget");
  181.       exit (1);
  182.     }
  183.   if ((shm = shmat (shmid, NULL, 0)) == (char *) -1)
  184.     {
  185.       perror ("SYN.shmat");
  186.       exit (1);
  187.     }
  188.   page.p_shm = shm;
  189.   page.p_sn = segn;
  190.   page.p_pn = pn;
  191.   return (shm);
  192. }
  193. void
  194. putpage (u2_t trn)
  195. {
  196.   struct msg_buf sbuf;
  197.   char *p;
  198.   sbuf.mtype = PUTUNL;
  199.   p = sbuf.mtext;
  200.   BUFPACK(trn,p);
  201.   BUFPACK(page.p_sn, p);
  202.   BUFPACK(page.p_pn, p);
  203.   t4bpack (0, p);
  204.   p += size4b;
  205.   *p++ = PRNMOD;
  206.   __MSGSND(msqidb, &sbuf, p - sbuf.mtext, 0,"SYN.msgsnd: PUTUNL to BUF");
  207.   __MSGRCV(msqidb, &sbuf, sizeof (i4_t), trn, 0,"SYN.msgrcv: PUTUNL from BUF");
  208.   shmdt (page.p_shm);
  209. }