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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  ljipc.c  -  Interprocess communications of Logical Journal
  3.  *              Kernel of GNU SQL-server. Journals 
  4.  *
  5.  *  This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by  Vera Ponomarenko
  10.  *
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contacts:   gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: ljipc.c,v 1.246 1997/03/31 11:05:14 kml Exp $ */
  29. #include "setup_os.h"
  30. #include "xmem.h"
  31. #include <sys/types.h>
  32. #ifdef HAVE_SYS_IPC_H
  33. #include <sys/ipc.h>
  34. #endif
  35. #ifdef HAVE_SYS_MSG_H
  36. #include <sys/msg.h>
  37. #endif
  38. #include <signal.h>
  39. #ifdef HAVE_UNISTD_H
  40. #include <unistd.h>
  41. #endif
  42. #include <assert.h>
  43. #include "pupsi.h"
  44. #include "strml.h"
  45. #include "inpop.h"
  46. #include "fdecllj.h"
  47. void INI (void);
  48. i4_t msqida, msqidl, msqidbf, msqidm;
  49. pid_t parent;
  50. extern i4_t fdlj;
  51. extern i4_t REDLINE;
  52. extern i4_t MPAGE;
  53. extern struct ADBL ABLOCK;
  54. #define PRINT(x, y)  /*PRINTF ((x, y))*/
  55. void
  56. main (i4_t argc, char **argv)
  57. {
  58.   i4_t op, rep;
  59.   key_t keyadm, keylj, keybf, keymj;
  60.   char *pnt;
  61.   u2_t trnum, sz;
  62.   struct ADBL adlj;
  63.   MEET_DEBUGGER;
  64.   parent = getppid();
  65.   setbuf (stdout, NULL);
  66.   sscanf (argv[1], "%d", &fdlj);
  67.   sscanf (argv[2], "%d", &REDLINE);
  68.   sscanf (argv[3], "%d", &MPAGE);
  69.   {
  70.     i4_t long_key;
  71.     sscanf (argv[4], "%d", &long_key);
  72.     keylj = long_key;
  73.     sscanf (argv[5], "%d", &long_key);
  74.     keybf = long_key;
  75.     sscanf (argv[6], "%d", &long_key);
  76.     keyadm = long_key;
  77.     sscanf (argv[7], "%d", &long_key);
  78.     keymj = long_key;
  79.   }
  80.   
  81.   if ((msqidl = msgget (keylj, IPC_CREAT | DEFAULT_ACCESS_RIGHTS)) < 0)
  82.     {
  83.       perror ("LJ.msgget: Queue for LJ");
  84.       exit (1);
  85.     }
  86.   MSG_INIT (msqidbf, keybf, "BUF");
  87.   MSG_INIT (msqida, keyadm, "ADM");
  88.   MSG_INIT (msqidm, keymj, "MJ");
  89.   INI ();
  90.   for (;;)
  91.     {
  92.       static struct msg_buf rbuf, sbuf;
  93.       struct msg_buf *mp = &rbuf;
  94.       __MSGRCV(msqidl, mp, 2 * RPAGE, -(ANSLJ - 1), 0,"LJ.msgrcv");
  95.       op = mp->mtype;
  96. /*      PRINT ("LJ: msgrcv op = %dn", op);*/
  97.       pnt = mp->mtext;
  98.       switch (op)
  99. {
  100. case RENEW:
  101.   BUFUPACK(pnt,fdlj);
  102.   BUFUPACK(pnt,REDLINE);
  103.   rep = renew ();
  104.   ans_adm (rep);
  105.   break;
  106. case PUTOUT:
  107.           BUFUPACK(pnt,trnum); 
  108.           BUFUPACK(pnt,sz); 
  109.   putout (sz, pnt);
  110.   ans_trn (trnum, PUTOUT);
  111.   break;
  112. case PUTREC:
  113.           BUFUPACK(pnt,trnum); 
  114.           BUFUPACK(pnt,sz); 
  115.   putrec (sz, pnt);
  116.   ans_trn (trnum, PUTREC);
  117.   break;
  118. case PUTHREC:
  119.           BUFUPACK(pnt,trnum); 
  120.           BUFUPACK(pnt,sz);
  121.   PUTRC (sz, pnt);
  122.   ans_trn (trnum, PUTHREC);
  123.   break;
  124. case GETREC:
  125.           BUFUPACK(pnt,trnum); 
  126.           bcopy (pnt, (char *) &adlj, sizeof (struct ADBL));
  127.   get_rec (sbuf.mtext, adlj, fdlj);
  128.   sbuf.mtype = trnum;
  129.   __MSGSND(msqidl, &sbuf, SZMSGBUF, 0,
  130.                    "LJ.msgsnd: Answer to TRN on GETREC");
  131.   break;
  132. case BEGFIX:
  133.           PRINT ("LJ.main: before begfix op = %dn", op);                    
  134.   begfix ();
  135.   break;
  136. case OVFLMJ:
  137.           PRINT ("LJ.main: before overflowmj op = %dn", op);          
  138.   overflow_mj ();
  139.   break;
  140.         case INILJ:
  141.           TUPACK(pnt,trnum);
  142.   INI ();
  143.           sbuf.mtype = trnum;
  144.   __MSGSND(msqidl, &sbuf, 0, 0,
  145.                    "LJ.msgsnd: Answer to MCR on INILJ");
  146.   break;
  147. case STATE:
  148.           /*                        ask(); */
  149.   break;
  150.         case FINIT:
  151.           ans_adm (1);
  152.           exit(0);
  153.           break;
  154. default:
  155.   perror ("LJ.main: No such operation");
  156.   break;
  157. }
  158.     }
  159. }
  160. i4_t
  161. BUF_INIFIXB (struct ADBL addr_lj, i4_t nop)
  162. {
  163.   char *p;
  164.   struct msg_buf mbuf;
  165.   i4_t rep;
  166.   PRINT ("LJ: BUF_INIFIXB: before connection to buf: msqidbf = %dn", msqidbf);
  167.   mbuf.mtype = INIFIXB;
  168.   p = mbuf.mtext;
  169.   t4bpack (nop, p);
  170.   p += sizeof(nop);
  171.   bcopy ((char *) &addr_lj, p, sizeof (struct ADBL));
  172.   __MSGSND(msqidbf, &mbuf, sizeof(nop) + sizeof (struct ADBL), 0,
  173.            "LJ.msgsnd: INIFIXBUF");
  174.   /*  __MSGRCV(msqidbf, &mbuf, sizeof(i4_t), ANSBUF, 0,"LJ.msgrcv: INIFIXBF") */
  175.   
  176.   for (;;)
  177.     {
  178.       if (msgrcv (msqidl, (MSGBUFP)&mbuf, 2 * RPAGE, PUTHREC, IPC_NOWAIT) >=0 )
  179.         {
  180.           u2_t trnum, sz;
  181.           p = mbuf.mtext;
  182.           BUFUPACK(p,trnum); 
  183.           BUFUPACK(p,sz);
  184.   PUTRC (sz, p);
  185.   ans_trn (trnum, PUTHREC);
  186.         }
  187.       if (msgrcv (msqidbf, (MSGBUFP)&mbuf, sizeof(rep), ANSBUF, IPC_NOWAIT) > 0)
  188.         break;
  189.     }
  190.   rep = t4bunpack (mbuf.mtext);
  191.   PRINT ("LJ: BUF_INIFIXB: after connection to buf: rep = %dn", rep);
  192.   return (rep);
  193. }
  194. void
  195. ADML_COPY (void)
  196. {
  197.   struct msg_buf sbuf;
  198.   t2bpack (COPY, sbuf.mtext);
  199.   ADM_SEND (NUM_LJ /* LJ number in TABTR */, sizeof(u2_t), "LJ.msgsnd: COPY");
  200. }
  201. void
  202. ADM_ERRFU (i4_t p)
  203. {
  204. #if 1
  205.   perror ("LJ. ERROR");
  206. #else
  207.   struct msg_buf sbuf;
  208.   sbuf.mtype = ERRFU;
  209.   sbuf.mtext[0] = (char) p;
  210.   sbuf.mtext[1] = LJ_PPS;
  211.   __MSGSND(msqida, &sbuf, 1, 0,"LJ. ERROR");
  212. #endif
  213. }
  214. void
  215. ans_adm (i4_t rep)
  216. {
  217.   struct msg_buf sbuf;
  218.   sbuf.mtype = ANSLJ;
  219.   *sbuf.mtext = (char)rep;
  220.   __MSGSND(msqidl, &sbuf, 1, 0,"LJ.msgsnd: Answer to ADM");
  221. }
  222. void
  223. ans_trn (u2_t trnum, i4_t tpop)
  224. {
  225.   struct msg_buf sbuf;
  226.   i4_t len;
  227.   sbuf.mtype = (i4_t) trnum;
  228.   if (tpop == PUTOUT)
  229.     len = 0;
  230.   else
  231.     {
  232.       len = sizeof (struct ADBL);
  233.       TPACK(ABLOCK, sbuf.mtext);
  234.     }
  235.   __MSGSND(msqidl, &sbuf, len, 0,"LJ.msgsnd: Answer to TRN");
  236. }
  237. void
  238. push_microj ()
  239. {
  240.   struct msg_buf sbuf;
  241.   sbuf.mtype = OUTDISK;
  242.   TPACK(ABLOCK, sbuf.mtext);
  243.   __MSGSND(msqidm, &sbuf, sizeof(ABLOCK), 0, "LJ.msgsnd: OUTDISK"); /* Push MJ */
  244.   __MSGRCV(msqidm, &sbuf, 0, ANSMJ, 0, "LJ.msgrcv");
  245. }