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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  srtpc.c - Interpocess communications of Sorter
  3.  *            Kernel of GNU SQL-server. Sorter    
  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: srtipc.c,v 1.246 1997/03/31 11:05:02 kml Exp $ */
  29. #include "setup_os.h"
  30. #include <sys/types.h>
  31. #include <stdio.h>
  32. #include <signal.h>
  33. #include <sys/ipc.h>
  34. #include <sys/msg.h>
  35. #include <sys/shm.h>
  36. #if TIME_WITH_SYS_TIME
  37. # include <sys/time.h>
  38. # include <time.h>
  39. #else
  40. # if HAVE_SYS_TIME_H
  41. #  include <sys/time.h>
  42. # else
  43. #  include <time.h>
  44. # endif
  45. #endif
  46. #include "dessrt.h"
  47. #include "inpop.h"
  48. #include "pupsi.h"
  49. #include "f1f2decl.h"
  50. #include "fdclsrt.h"
  51. #include "strml.h"
  52. i4_t TRNUM, msqid, msqida, msqidb;
  53. pid_t parent;
  54. i4_t segsize;
  55. u2_t fields_n;
  56. extern i4_t EXNSSIZE;
  57. extern char *adrseg;
  58. extern u2_t trn,fdfn,kn;
  59. extern COST cost;
  60. extern i4_t pinit;
  61. extern i4_t NFP;
  62. extern u2_t *cutfpn;
  63. extern u2_t *arrfpn;
  64. extern u2_t *arrpn;
  65. #define SMMAX 6
  66. static i4_t N_AT_SEG;
  67. /*extern struct shminfo shminfo;*/
  68. #define PRINT(x) PRINTF(x)
  69. #define ARG(num, what, type)   sscanf (argv[num], "%d", &argum); 
  70.                                what = (type)(argum)
  71. void
  72. main (i4_t argc, char **argv)
  73. {
  74.   char *p;
  75.   i4_t op, n;
  76.   key_t keysr, keybf, keyadm;
  77.   struct msg_buf rbuf;
  78.   u2_t *mfs, fpn, sn, lpn, arr_kn[BD_PAGESIZE];
  79.   char prdbl;
  80.   i4_t argum;
  81.   struct des_field *adf, df[BD_PAGESIZE];
  82.   MEET_DEBUGGER;
  83.   
  84.   setbuf (stdout, NULL);
  85.   ARG(1, keysr,    key_t);
  86.   ARG(2, keybf,    key_t);
  87.   ARG(3, EXNSSIZE, i4_t  );
  88.   ARG(4, parent,   pid_t);
  89.   ARG(5, keyadm,   key_t);
  90.   
  91.   if ((msqid = msgget (keysr, IPC_CREAT | DEFAULT_ACCESS_RIGHTS)) < 0)
  92.     {
  93.       perror ("SRT.msgget");
  94.       exit (1);
  95.     }
  96.   MSG_INIT (msqidb, keybf, "BUF");
  97.   MSG_INIT (msqida, keyadm, "ADM");
  98.   
  99.   N_AT_SEG = 0;
  100.   
  101. /*  max_att_seg = shminfo.shmseg;*/
  102.   
  103.   if (PINIT > SMMAX)
  104.     pinit = SMMAX - 2;
  105.   else
  106.     pinit = PINIT;
  107.   
  108.   if ((adrseg = (char *) malloc (segsize = BD_PAGESIZE * PINIT)) == NULL)
  109.     {
  110.       perror ("SRT.malloc: No segment");
  111.       exit (1);
  112.     }  
  113.   arrfpn = (u2_t *) malloc (pinit * size2b);
  114.   cutfpn = (u2_t *) malloc (pinit * size2b);
  115.   if (pinit < EXNSSIZE)
  116.     NFP = pinit;
  117.   else
  118.     NFP = EXNSSIZE;  
  119.   arrpn = (u2_t *) malloc (NFP * size2b);
  120.   
  121.   for (;;)
  122.     {
  123.       __MSGRCV(msqid, &rbuf, BD_PAGESIZE, -(ANSSRT - 1), 0,"SRT.msgrcv");
  124.       
  125.       op = rbuf.mtype;
  126.       p = rbuf.mtext;
  127.       BUFUPACK(p,trn);
  128.       TRNUM = trn - CONSTTR;
  129.       switch (op)
  130. {
  131. case TRSORT:
  132.           BUFUPACK(p,fpn);
  133.           BUFUPACK(p,fields_n);
  134.           BUFUPACK(p,fdfn);
  135.           for (adf = df, n = fields_n; n != 0; n--, adf++)
  136.             BUFUPACK(p,*adf);
  137.           BUFUPACK(p,kn);
  138.           for (mfs = arr_kn, n = kn; n != 0; n--, mfs++)
  139.             BUFUPACK(p,*mfs);
  140.           prdbl = *p++;
  141. /*
  142.   if (kn == fn)
  143.   lpn = sort_tuples (&fpn, df,mfs,prdbl,p);
  144.   else
  145.   */
  146.           lpn = trsort (&fpn, df, arr_kn, prdbl, p);
  147.           ans_srt (fpn, lpn);
  148.           break;
  149. case FLSORT:
  150.           BUFUPACK(p,fpn);
  151.           BUFUPACK(p,fields_n);
  152.           BUFUPACK(p,fdfn);
  153.           for (adf = df, n = fields_n; n != 0; n--, adf++)
  154.             BUFUPACK(p,*adf);
  155.           BUFUPACK(p,sn);
  156.           BUFUPACK(p,kn);
  157.           for (mfs = arr_kn, n = kn; n != 0; n--, mfs++)
  158.             BUFUPACK(p,*mfs);
  159.   prdbl = *p++;
  160.   lpn = flsort (sn, &fpn, df, arr_kn, prdbl, p);
  161.   ans_srt (fpn, lpn);
  162.   break;
  163. case TIDSRT:
  164.           BUFUPACK(p,fpn);
  165.   lpn = tidsort (&fpn);
  166.   ans_srt (fpn, lpn);
  167.   break;
  168. case CRTRN:
  169.   crtrn ();
  170.   break;
  171. case FINIT:
  172.   finit ();
  173.   break;
  174. default:
  175.   perror ("SRT.main: No such operation");
  176.   break;
  177. }
  178.     }
  179. }
  180. u2_t 
  181. getext (void)
  182. {
  183.   struct msg_buf sbuf;
  184.   
  185.   t2bpack (GETEXT, sbuf.mtext);
  186.   t2bpack (TRNUM,  sbuf.mtext + size2b);
  187.       
  188.   ADM_SEND (NUM_SRT /* SORTER number in TABTR = 1*/,
  189.     size2b * 2, "SRT.msgsnd: GETEXT");
  190.       
  191.   __MSGRCV(msqid, &sbuf, size2b, CONSTTR + NUM_SRT, 0,
  192.            "SRT.msgrcv: Answer on GETEXT");
  193.   return t2bunpack (sbuf.mtext);
  194. }
  195. void
  196. ADMT_putext (u2_t * mfpn, u2_t exn)
  197. {
  198.   char *p;
  199.   u2_t i;
  200.   struct msg_buf sbuf;
  201.   if (exn == 0)
  202.     return;
  203.   
  204.   PRINT (("SRT.PUTEXT:  exn = %dn", (i4_t)exn));
  205.   
  206.   p = sbuf.mtext + + size2b ;
  207.   t2bpack(PUTEXT, sbuf.mtext);
  208.   p = sbuf.mtext + + size2b ;
  209.   BUFPACK(exn, p);
  210.   for (i = 0; i < exn; i++)
  211.     BUFPACK(mfpn[i], p);
  212.   ADM_SEND (NUM_SRT, p - sbuf.mtext, "SRT.msgsnd: PUTEXT");
  213.   return;
  214. }
  215. char *
  216. getpage(struct A *ppage, u2_t sn, u2_t pn)
  217. {
  218.   struct msg_buf sbuf;
  219.   u2_t size;
  220.   char *p;
  221.   key_t keyseg;
  222.   i4_t shmid;
  223.   char *shm;
  224.   ppage->p_sn = sn;
  225.   ppage->p_pn = pn;
  226.   p = sbuf.mtext;
  227.   t2bpack (trn, p);
  228.   p += size2b;
  229.   t2bpack (ppage->p_sn, p);
  230.   p += size2b;
  231.   t2bpack (ppage->p_pn, p);
  232.   p += size2b;
  233.   size = size2b * 3;
  234.   if (sn != NRSNUM)
  235.     {
  236.       sbuf.mtype = LOCKGET;
  237.       *(char *) p = WEAK;
  238.       size += 1;
  239.     }
  240.     else
  241.     sbuf.mtype = GETPAGE;
  242.   keyseg = BACKUP;
  243.   while (keyseg == BACKUP)
  244.     {
  245.       __MSGSND(msqidb, &sbuf, size, 0,"SRT.msgsnd: BUF GETPAGE");
  246.       __MSGRCV(msqidb, &sbuf, sizeof (key_t), trn, 0,"SRT.msgrcv: Answer on GETPAGE");
  247.       keyseg = *(key_t *) sbuf.mtext;
  248.     }
  249.   if ((shmid = shmget (keyseg, BD_PAGESIZE, DEFAULT_ACCESS_RIGHTS)) < 0)
  250.     {
  251.       perror ("SRT.shmget");
  252.       exit (1);
  253.     }
  254.   if ((shm = (char *) shmat (shmid, NULL, 0)) == (char *) -1)
  255.     {
  256.       perror ("SRT.shmat");
  257.       exit (1);
  258.     }
  259.   N_AT_SEG++;
  260.   ppage->p_shm = shm;
  261.   if (sn != NRSNUM)
  262.     cost += 2;
  263.   else
  264.     cost += 1;
  265.   return (shm);
  266. }
  267. char *
  268. getnew(struct A *ppage, u2_t sn, u2_t pn)
  269. {
  270.   struct msg_buf sbuf;
  271.   char *p;
  272.   i4_t shmid;
  273.   char *shm;
  274.   sbuf.mtype = NEWGET;
  275.   p = sbuf.mtext;
  276.   t2bpack (trn, p);
  277.   p += size2b;
  278.   t2bpack (sn, p);
  279.   p += size2b;
  280.   t2bpack (pn, p);
  281.   
  282.   __MSGSND(msqidb, &sbuf, 3 * size2b, 0,"SRT.msgsnd: NEWGET to BUF");
  283.   __MSGRCV (msqidb, &sbuf, sizeof (key_t), trn, 0,"SRT.msgrcv: NEWGET from BUF");
  284.       
  285.   if ((shmid = shmget (*(key_t *) sbuf.mtext, BD_PAGESIZE,
  286.                        DEFAULT_ACCESS_RIGHTS)) < 0)
  287.     {
  288.       perror ("SRT.shmget");
  289.       exit (1);
  290.     }
  291.   if ((shm = (char *) shmat (shmid, NULL, 0)) == (char *) -1)
  292.     {
  293.       perror ("SRT.shmat");
  294.       exit (1);
  295.     }
  296.   N_AT_SEG++;
  297.   ppage->p_shm = shm;
  298.   ppage->p_sn = sn;
  299.   ppage->p_pn = pn;
  300.   cost += 1;
  301.   return (shm);
  302. }
  303. void
  304. putpage (struct A *ppage, char type)
  305. {
  306.   struct msg_buf sbuf;
  307.   u2_t sn;
  308.   char *p;
  309.   sn = ppage->p_sn;
  310.   if (sn == NRSNUM)
  311.     sbuf.mtype = PUTPAGE;
  312.   else
  313.     sbuf.mtype = PUTUNL;
  314.   p = sbuf.mtext;
  315.   t2bpack (trn, p);
  316.   p += size2b;
  317.   t2bpack (sn, p);
  318.   p += size2b;
  319.   t2bpack (ppage->p_pn, p);
  320.   p += size2b;
  321.   t4bpack (0, p);
  322.   p += size4b;
  323.   *p = ((type == 'm')? PRMOD:PRNMOD);
  324.   __MSGSND(msqidb, &sbuf, 5 * size2b + 1, 0,"SRT.msgsnd: PUTPAGE to BUF");
  325.   __MSGRCV(msqidb, &sbuf, sizeof (i4_t), trn, 0,"SRT.msgrcv: PUTPAGE from BUF");
  326.   shmdt (ppage->p_shm);
  327.   N_AT_SEG--;
  328. }
  329. void
  330. crtrn (void)
  331. {
  332. }
  333. void
  334. ans_srt (u2_t fpn, u2_t lpn)
  335. {
  336.   struct msg_buf sbuf;
  337.   char *p;
  338.   sbuf.mtype = trn;
  339.   p = sbuf.mtext;
  340.   BUFPACK(fpn,p);
  341.   BUFPACK(lpn,p);
  342.   BUFPACK(cost,p);
  343.   __MSGSND(msqid, &sbuf, 2 * size2b + sizeof (COST), 0,"SRT.msgsnd");
  344.   PRINT (("SRT.ans_srt.e: fpn = %d, lpn = %dn", fpn, lpn));
  345. }
  346. void
  347. finit (void)
  348. {
  349.   PRINTF (("SRT.finit: before exitn"));
  350.   exit (0);
  351. }