failoverSCI.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:26k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include "sisci_types.h"
  15. #include "sisci_api.h"
  16. #include "sisci_error.h"
  17. //#include "sisci_demolib.h"
  18. #include <NdbTick.h>
  19. #include <NdbSleep.h>
  20. #define NO_CALLBACK         NULL
  21. #define NO_FLAGS            0
  22. #define DATA_TRANSFER_READY 8
  23. sci_error_t             error;
  24. sci_desc_t              sdOne;
  25. sci_desc_t              sdTwo;
  26. sci_local_segment_t     localSegmentOne;
  27. sci_local_segment_t     localSegmentTwo;
  28. sci_remote_segment_t    remoteSegmentOne;
  29. sci_remote_segment_t    remoteSegmentTwo;
  30. sci_map_t               localMapOne;
  31. sci_map_t               localMapTwo;
  32. sci_map_t               remoteMapOne;
  33. sci_map_t               remoteMapTwo;
  34. unsigned int            localAdapterNo = 0;
  35. unsigned int            standbyAdapterNo = 1;
  36. unsigned int            localNodeId1;
  37. unsigned int            localNodeId2;
  38. unsigned int            remoteNodeId1 = 0;
  39. unsigned int            remoteNodeId2 = 0;
  40. unsigned int            localSegmentId;
  41. unsigned int            remoteSegmentId1;
  42. unsigned int            remoteSegmentId2;
  43. unsigned int            segmentSize = 8192;
  44. unsigned int            offset = 0;
  45. unsigned int            client = 0;
  46. unsigned int            server = 0;
  47. unsigned int            *localbufferPtr;
  48. static int data;
  49. static int interruptConnected=0;
  50. /*********************************************************************************/
  51. /*                                U S A G E                                      */
  52. /*                                                                               */
  53. /*********************************************************************************/
  54. void Usage()
  55. {
  56.     printf("Usage of shmemn");
  57.     printf("shmem -rn <remote node-id> -client/server [ -adapterno <adapter no> -size <segment size> ] nn");
  58.     printf(" -rn               : Remote node-idn");
  59.     printf(" -client           : The local node is clientn");
  60.     printf(" -server           : The local node is servern");
  61.     printf(" -adapterno        : Local adapter number (default %d)n", localAdapterNo);
  62.     printf(" -size             : Segment block size   (default %d)n", segmentSize);
  63.     printf(" -help             : This helpscreenn");
  64.     printf("n");
  65. }
  66. /*********************************************************************************/
  67. /*                   P R I N T   P A R A M E T E R S                             */
  68. /*                                                                               */
  69. /*********************************************************************************/
  70. void PrintParameters(void)
  71. {
  72.     printf("Test parameters for %s n",(client) ?  "client" : "server" );
  73.     printf("----------------------------nn");
  74.     printf("Local node-id1      : %dn",localNodeId1);
  75.     printf("Local node-id2      : %dn",localNodeId2);
  76.     //    printf("Remote node-id     : %dn",remoteNodeId);
  77.     printf("Local adapter no.  : %dn",localAdapterNo);
  78.     printf("Segment size       : %dn",segmentSize);
  79.     printf("----------------------------nn");
  80. }
  81. /*********************************************************************************/
  82. /*                F I L L   S E G M E N T   W I T H   D A T A                    */
  83. /*                                                                               */
  84. /*********************************************************************************/
  85. sci_error_t GetLocalNodeId(Uint32 localAdapterNo, Uint32* localNodeId)
  86. {
  87.   sci_query_adapter_t queryAdapter;
  88.   sci_error_t  error;
  89.   unsigned int _localNodeId;
  90.   
  91.   queryAdapter.subcommand = SCI_Q_ADAPTER_NODEID;
  92.   queryAdapter.localAdapterNo = localAdapterNo;
  93.   queryAdapter.data = &_localNodeId;
  94.   SCIQuery(SCI_Q_ADAPTER,&queryAdapter,NO_FLAGS,&error);
  95.   
  96.   *localNodeId=_localNodeId;
  97.   
  98.   return error;
  99. }
  100. sci_error_t SendInterrupt(sci_desc_t   sd,
  101.       Uint32 localAdapterNo, 
  102.       Uint32 localSciNodeId, 
  103.       Uint32 remoteSciNodeId,
  104.       Uint32 interruptNo){
  105.   
  106.   sci_error_t             error;
  107.   sci_remote_interrupt_t  remoteInterrupt;
  108.   Uint32 timeOut = SCI_INFINITE_TIMEOUT;
  109.     // Now connect to the other sides interrupt flag 
  110.     do {
  111.       SCIConnectInterrupt(sd, &remoteInterrupt, remoteSciNodeId, localAdapterNo,
  112.   interruptNo, timeOut, NO_FLAGS, &error);
  113.     } while (error != SCI_ERR_OK);
  114.     
  115.     if (error != SCI_ERR_OK) {
  116.       fprintf(stderr, "SCIConnectInterrupt failed - Error code 0x%xn", error);
  117.       return error;
  118.     } 
  119.   // Trigger interrupt
  120.   printf("nNode %u sent interrupt (0x%x) to node %dn",localSciNodeId, interruptNo, remoteSciNodeId);
  121.   SCITriggerInterrupt(remoteInterrupt, NO_FLAGS, &error);
  122.   if (error != SCI_ERR_OK) {
  123.     fprintf(stderr, "SCITriggerInterrupt failed - Error code 0x%xn", error);
  124.     return error;
  125.   } 
  126.    
  127.     // Disconnect and remove interrupts 
  128.     SCIDisconnectInterrupt(remoteInterrupt, NO_FLAGS, &error);
  129.     if (error != SCI_ERR_OK) {
  130.       fprintf(stderr, "SCIDisconnectInterrupt failed - Error code 0x%xn", error);
  131.       return error; 
  132.     }    
  133.   return error;
  134. }
  135. sci_error_t ReceiveInterrupt(sci_desc_t sd,
  136.  Uint32 localAdapterNo,
  137.  Uint32 localSciNodeId, 
  138.  Uint32 interruptNo,
  139.  Uint32 timeout) {
  140.   
  141.   sci_error_t             error;
  142.   sci_local_interrupt_t   localInterrupt;
  143.   Uint32 timeOut = SCI_INFINITE_TIMEOUT;
  144.   // Create an interrupt 
  145.   SCICreateInterrupt(sd, &localInterrupt, localAdapterNo,
  146.        &interruptNo, 0, NULL, SCI_FLAG_FIXED_INTNO, &error);
  147.   if (error != SCI_ERR_OK) {
  148.     fprintf(stderr, "SCICreateInterrupt failed - Error code 0x%xn", error);
  149.     return error; 
  150.   }  
  151.   
  152.   
  153.   // Wait for an interrupt 
  154.   SCIWaitForInterrupt(localInterrupt, timeOut, NO_FLAGS, &error);
  155.   printf("nNode %u received interrupt (0x%x)n", localSciNodeId, interruptNo); 
  156.  
  157.   // Remove interrupt 
  158.   
  159.   SCIRemoveInterrupt(localInterrupt, NO_FLAGS, &error);
  160.   if (error != SCI_ERR_OK) {
  161.     fprintf(stderr, "SCIRemoveInterrupt failed - Error code 0x%xn", error);
  162.     return error; 
  163.   }
  164.   return error;
  165. }
  166. sci_error_t FillSegmentWithData(unsigned int segmentSize, int reverse)
  167. {
  168.     unsigned int i;
  169.     unsigned int nostores;
  170.     
  171.     nostores = (segmentSize) / sizeof(unsigned int);
  172.     
  173.     /* Allocate buffer */
  174.     
  175.     localbufferPtr = (unsigned int*)malloc( segmentSize );
  176.     if ( localbufferPtr == NULL ) {
  177.         /*
  178.          * Unable to create local buffer - Insufficient memory available
  179.          */
  180.         return SCI_ERR_NOSPC;
  181.     }
  182.     if(reverse) {
  183.       /* Fill in the data into a local buffer */
  184.       printf("Filling forward order n");
  185.       for (i=0;i<nostores;i++) {
  186. localbufferPtr[i] = i;
  187.       }
  188.     }
  189.     else {
  190.       int temp=nostores;
  191.       printf("Filling reverse order n");
  192.       for (i=0;i<nostores;i++) {
  193. localbufferPtr[i] = temp-- ;
  194.       }
  195.      
  196.     }
  197.     
  198.     return SCI_ERR_OK;
  199. }
  200. /*********************************************************************************/
  201. /*                    P R I N T   C L I E N T   D A T A                          */
  202. /*                                                                               */
  203. /*********************************************************************************/
  204. void PrintClientData(void)
  205. {
  206.     unsigned int i;
  207.     printf("nClient data: ");
  208.     /* Print the first 20 entries in the segment */
  209.     for (i=0;i<20;i++) {
  210.         printf("%d ",localbufferPtr[i]);
  211.     }
  212.     printf("n");
  213. }
  214. /*********************************************************************************/
  215. /*                    P R I N T   S E R V E R   D A T A                          */
  216. /*                                                                               */
  217. /*********************************************************************************/
  218. void PrintServerData(volatile unsigned int *localMapAddr)
  219. {
  220.  
  221.     unsigned int *buffer; 
  222.     int i;
  223.     //    printf("nServer data: ");
  224.     buffer = (unsigned int *)localMapAddr;
  225.     /* Print the first 20 entries in the segment */
  226.     for (i=0; i< 20; i++) {
  227.         
  228.         printf("%d ",buffer[i]);
  229.     }
  230.     printf("n");
  231. }
  232. /*********************************************************************************/
  233. /*                       T R A N S F E R   D A T A                               */
  234. /*                                                                               */
  235. /*********************************************************************************/
  236. unsigned int TransferData(sci_map_t             remoteMap,
  237.                           volatile unsigned int *remoteSegmentAddr1, 
  238.   volatile unsigned int *remoteSegmentAddr2, 
  239.                           unsigned int          segmentSize)
  240. {
  241.   
  242.   volatile unsigned int   *remoteBuffer1;
  243.   volatile unsigned int   *remoteBuffer;
  244.   volatile unsigned int   *remoteBuffer2;
  245.   static int times = 0;
  246.     sci_sequence_t          sequence;
  247.     sci_error_t             error;
  248.     unsigned int            nostores;
  249.     unsigned int            j;
  250.     sci_sequence_status_t   sequenceStatus;
  251.     remoteBuffer1 = (volatile unsigned int *)remoteSegmentAddr1;
  252.     remoteBuffer2 = (volatile unsigned int *)remoteSegmentAddr2;
  253.     remoteBuffer=remoteBuffer1;
  254. /* 4-byte test only */ 
  255. nostores = (segmentSize) / sizeof(unsigned int);
  256.     /* Create a sequence for data error checking */    
  257.     SCICreateMapSequence(remoteMapOne,&sequence,NO_FLAGS,&error);
  258.     if (error != SCI_ERR_OK) {
  259.         fprintf(stderr,"SCICreateMapSequence failed - Error code 0x%xn",error);
  260.         return error;
  261.     }
  262.     /* Fill in the data into a local buffer */
  263.     error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY);
  264.     error = FillSegmentWithData(segmentSize, 0);
  265.  tryagain:
  266.     PrintServerData(localbufferPtr);
  267.     fprintf(stderr,"After recover n");
  268.     while(1){
  269.       //data=0;
  270.     
  271.       if (error != SCI_ERR_OK) {
  272.         /*
  273.          * Unable to create local buffer - Insufficient memory available
  274.          */
  275.         printf( "Unable to create local buffer - Insufficient memory availablen" );
  276.         return error;
  277.       }
  278.       do {
  279.         /* Start data error checking */
  280.         sequenceStatus = SCIStartSequence(sequence,NO_FLAGS,&error);
  281.       } while (sequenceStatus != SCI_SEQ_OK) ;
  282.       
  283.             
  284.     /* Transfer data to remote node */
  285.       for (j=0;j<nostores;j++) {
  286. remoteBuffer[j] = localbufferPtr[j];
  287.       }
  288.       
  289.       /* Check for error after data transfer */
  290.       sequenceStatus = SCICheckSequence(sequence,NO_FLAGS,&error);
  291.       if (sequenceStatus != SCI_SEQ_OK) {
  292.         fprintf(stderr,"Data transfer failedn");
  293. if(times==0) {
  294.   error = FillSegmentWithData(segmentSize, 1);
  295.   
  296.   SCICreateMapSequence(remoteMapTwo,&sequence,NO_FLAGS,&error);
  297.   if (error != SCI_ERR_OK) {
  298.     fprintf(stderr,"SCICreateMapSequence failed - Error code 0x%xn",error);
  299.     return error;
  300.     return SCI_ERR_TRANSFER_FAILED;
  301.   }
  302. }
  303. else 
  304.   {
  305.     error = FillSegmentWithData(segmentSize, 0);
  306.     /* Create a sequence for data error checking */    
  307.     SCICreateMapSequence(remoteMapOne,&sequence,NO_FLAGS,&error);
  308.     if (error != SCI_ERR_OK) {
  309.       fprintf(stderr,"SCICreateMapSequence failed - Error code 0x%xn",error);
  310.       return error;
  311.       return SCI_ERR_TRANSFER_FAILED;
  312. }
  313.     
  314.   }
  315. fprintf(stderr,"Recovery n");
  316. if(times==0)
  317.   remoteBuffer=remoteBuffer2;
  318. else
  319.   remoteBuffer=remoteBuffer1;
  320. times++;
  321. printf("remotebuffer %p   times %dn", remoteBuffer, times);
  322. goto tryagain;
  323.       }    
  324.       int timeout=0;
  325.       //      error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY);
  326.       //      NdbSleep_MilliSleep(100);
  327.       //error = ReceiveInterrupt(sdOne,localAdapterNo,localNodeId1,DATA_TRANSFER_READY, timeout);
  328.     }
  329.     /* Remove the Sequence */
  330.     SCIRemoveSequence(sequence,NO_FLAGS, &error);
  331.     if (error != SCI_ERR_OK) {
  332.       fprintf(stderr,"SCIRemoveSequence failed - Error code 0x%xn",error);
  333.       return error;
  334.     }
  335.     
  336.     return SCI_ERR_OK;
  337. }
  338. /*********************************************************************************/
  339. /*                    S H M E M   C L I E N T   N O D E                          */
  340. /*                                                                               */
  341. /*********************************************************************************/
  342. unsigned int ShmemClientNode(void)
  343. {
  344.     volatile unsigned int *remoteMapAddr1;
  345.     volatile unsigned int *remoteMapAddr2;
  346.     printf("here?n");
  347.     
  348.     /* Create a segmentId */
  349.     remoteSegmentId1 = 1;//(remoteNodeId1 << 16) | localNodeId1;
  350.     /* Connect to remote segment */
  351.     printf("Connect to remote segment ....  n");
  352.     printf("segid = %d  node %d n",remoteSegmentId1, remoteNodeId1 );
  353.      do { 
  354.       SCIConnectSegment(sdOne,
  355. &remoteSegmentOne,
  356. remoteNodeId1,
  357. remoteSegmentId1,
  358. localAdapterNo,
  359. NO_CALLBACK,
  360. NULL,
  361. SCI_INFINITE_TIMEOUT,
  362. NO_FLAGS,
  363. &error);
  364.       
  365.         } while (error != SCI_ERR_OK);
  366.     printf("connectedn");
  367.     
  368.     // remoteSegmentId2 = (remoteNodeId2 << 16) | localNodeId2;
  369.     //  printf("segid = %dn",remoteSegmentId2 );
  370.     printf("segid = %d  node %d n",remoteSegmentId1, remoteNodeId1 );
  371.     do { 
  372.       SCIConnectSegment(sdTwo,
  373. &remoteSegmentTwo,
  374. remoteNodeId2,
  375. remoteSegmentId1,
  376. standbyAdapterNo,
  377. NO_CALLBACK,
  378. NULL,
  379. SCI_INFINITE_TIMEOUT,
  380. NO_FLAGS,
  381. &error);
  382.       
  383.     } while (error != SCI_ERR_OK);
  384.     
  385.    
  386.     printf("connected 3n");
  387.     printf("Remote segment (id=0x%x) is connected.n", remoteSegmentId2);
  388. /* Map remote segment to user space */
  389.     remoteMapAddr1 = (unsigned int*)SCIMapRemoteSegment(remoteSegmentOne,&remoteMapOne,offset,segmentSize,NULL,NO_FLAGS,&error);
  390.     if (error == SCI_ERR_OK) {
  391.         printf("Remote segment (id=0x%x) is mapped to user space @ 0x%x. n", remoteSegmentId1, remoteMapAddr1);         
  392.     } else {
  393.         fprintf(stderr,"SCIMapRemoteSegment failed - Error code 0x%xn",error);
  394.         return 0;
  395.     } 
  396.     remoteMapAddr2 = (unsigned int *)SCIMapRemoteSegment(remoteSegmentTwo,&remoteMapTwo,offset,segmentSize,NULL,NO_FLAGS,&error);
  397.     if (error == SCI_ERR_OK) {
  398.       printf("Remote segment (id=0x%x) is mapped to user space @ 0x%x. n", remoteSegmentId2, remoteMapAddr2);         
  399.     } else {
  400.         fprintf(stderr,"SCIMapRemoteSegment failed - Error code 0x%xn",error);
  401.         return 0;
  402.     } 
  403.         
  404.     /* Start data transfer and error checking */
  405.     error = (sci_error_t)TransferData(remoteMapOne,remoteMapAddr1, remoteMapAddr2,segmentSize);
  406.     if (error == SCI_ERR_OK) {
  407.         printf("Data transfer done!nn");
  408.     } else {
  409.         fprintf(stderr,"Data transfer failed - Error code 0x%xnn",error);
  410.         return 0;
  411.     }
  412.     /* Send an interrupt to remote node telling that the data transfer is ready */
  413.     error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY);
  414.     if (error == SCI_ERR_OK) {
  415.         printf("nInterrupt message sent to remote noden");
  416.     } else {
  417.         printf("nInterrupt synchronization failedn");
  418.         return 0;
  419.     }
  420.     
  421.     PrintClientData();
  422.     /* Unmap remote segment */
  423.     SCIUnmapSegment(remoteMapOne,NO_FLAGS,&error);
  424.     if (error == SCI_ERR_OK) {
  425.         printf("The remote segment is unmappedn"); 
  426.     } else {
  427.         fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%xn",error);
  428.         return 0;
  429.     }
  430.     
  431.     SCIUnmapSegment(remoteMapTwo,NO_FLAGS,&error);
  432.     if (error == SCI_ERR_OK) {
  433.       printf("The remote segment is unmappedn"); 
  434.     } else {
  435.       fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%xn",error);
  436.       return 0;
  437.     }
  438.     /* Disconnect segment */
  439.     SCIDisconnectSegment(remoteSegmentOne,NO_FLAGS,&error);
  440.     if (error == SCI_ERR_OK) {
  441.         printf("The segment is disconnectedn"); 
  442.     } else {
  443.         fprintf(stderr,"SCIDisconnectSegment failed - Error code 0x%xn",error);
  444.         return 0;
  445.     } 
  446.     
  447.     SCIDisconnectSegment(remoteSegmentTwo,NO_FLAGS,&error);
  448.     if (error == SCI_ERR_OK) {
  449.         printf("The segment is disconnectedn"); 
  450.     } else {
  451.         fprintf(stderr,"SCIDisconnectSegment failed - Error code 0x%xn",error);
  452.         return 0;
  453.     } 
  454.     return 1;
  455. }
  456. /*********************************************************************************/
  457. /*                    S H M E M   S E R V E R   N O D E                          */
  458. /*                                                                               */
  459. /*********************************************************************************/
  460. unsigned int ShmemServerNode(void)
  461. {
  462.   unsigned int *localMapAddr;
  463.     
  464.     /* Create a segmentId */
  465.   localSegmentId  =1;// (localNodeId1 << 16)  | remoteNodeId1;
  466.     /* Create local segment */    
  467.         SCICreateSegment(sdOne,&localSegmentOne,localSegmentId, segmentSize, NO_CALLBACK, NULL, NO_FLAGS,&error);
  468.     if (error == SCI_ERR_OK) {
  469.         printf("Local segment (id=%d, size=%d) is created. n", localSegmentId, segmentSize);  
  470.     } else {
  471.         fprintf(stderr,"SCICreateSegment failed - Error code 0x%xn",error);
  472.         return 0;
  473.     }
  474.     //localSegmentId  = (localNodeId2 << 16)  | remoteNodeId2;
  475.     /*
  476.     SCICreateSegment(sdTwo,&localSegmentTwo,localSegmentId+1, segmentSize, NO_CALLBACK, NULL, NO_FLAGS,&error);
  477.     if (error == SCI_ERR_OK) {
  478.       printf("Local segment (id=%d, size=%d) is created (2). n", localSegmentId, segmentSize);  
  479.     } else {
  480.       fprintf(stderr,"SCICreateSegment failed - Error code 0x%xn",error);
  481.       return 0;
  482.     }
  483.     
  484.     printf("segment one %p segment 2 %pn", localSegmentOne, localSegmentTwo);
  485.     */
  486.     /* Prepare the segment */
  487.     SCIPrepareSegment(localSegmentOne,localAdapterNo,NO_FLAGS,&error);
  488.     if (error == SCI_ERR_OK) {
  489.         printf("Local segment (id=%d, size=%d) is prepared. n", localSegmentId, segmentSize);  
  490.     } else {
  491.         fprintf(stderr,"SCIPrepareSegment failed - Error code 0x%xn",error);
  492.         return 0;
  493.     }
  494.     
  495.     
  496.     /* Prepare the segment */
  497.    
  498.     SCIPrepareSegment(localSegmentOne,standbyAdapterNo,NO_FLAGS,&error);
  499.     if (error == SCI_ERR_OK) {
  500.         printf("Local segment (id=%d, size=%d) is created. n", localSegmentId, segmentSize);  
  501.     } else {
  502.         fprintf(stderr,"SCIPrepareSegment failed - Error code 0x%xn",error);
  503.         return 0;
  504.     }
  505.    
  506.     /* Map local segment to user space */
  507.     localMapAddr = (unsigned int *)SCIMapLocalSegment(localSegmentOne,&localMapOne, offset,segmentSize, NULL,NO_FLAGS,&error);
  508.     if (error == SCI_ERR_OK) {
  509.         printf("Local segment (id=0x%x) is mapped to user space @ 0x%x.n", localSegmentId, localMapAddr); 
  510.     } else {
  511.         fprintf(stderr,"SCIMapLocalSegment failed - Error code 0x%xn",error);
  512.         return 0;
  513.     } 
  514.     
  515.     /* Map local segment to user space */
  516.     /*
  517.     localMapAddr = (unsigned int *)SCIMapLocalSegment(localSegmentTwo,&localMapTwo, offset,segmentSize, NULL,NO_FLAGS,&error);
  518.     if (error == SCI_ERR_OK) {
  519.       printf("Local segment (id=0x%x) is mapped to user space @ 0x%x.n", localSegmentId, localMapAddr); 
  520.       printf("Local segment (id=%d) is mapped to user space.n", localSegmentId); 
  521.     } else {
  522.       fprintf(stderr,"SCIMapLocalSegment failed - Error code 0x%xn",error);
  523.       return 0;
  524.     } 
  525.     */
  526.     /* Set the segment available */
  527.     SCISetSegmentAvailable(localSegmentOne, localAdapterNo, NO_FLAGS, &error);
  528.     if (error == SCI_ERR_OK) {
  529.         printf("Local segment (id=0x%x) is available for remote connections. n", localSegmentId); 
  530.     } else {
  531.         fprintf(stderr,"SCISetSegmentAvailable failed - Error code 0x%xn",error);
  532.         return 0;
  533.     } 
  534.     
  535.     SCISetSegmentAvailable(localSegmentOne, standbyAdapterNo, NO_FLAGS, &error);
  536.     if (error == SCI_ERR_OK) {
  537.         printf("Local segment (id=0x%x) is available for remote connections. n", localSegmentId); 
  538.     } else {
  539.         fprintf(stderr,"SCISetSegmentAvailable failed - Error code 0x%xn",error);
  540.         return 0;
  541.     } 
  542.     int timeout=0;
  543.     error = ReceiveInterrupt(sdOne,localAdapterNo,localNodeId1,DATA_TRANSFER_READY, timeout);    
  544.     if (error == SCI_ERR_OK) {
  545.       printf("nThe data transfer is readyn");
  546.     } else {
  547.       printf("nInterrupt synchronization failedn");
  548.       return 0;
  549.     }
  550.     
  551.  again:
  552.     //    printf("Wait for the shared memory data transfer .....");
  553.     /* Wait for interrupt signal telling that block transfer is ready */
  554.     //printf("nData transfer done!n");
  555.     //PrintClientData()
  556.     PrintServerData(localMapAddr);
  557.     /*Uint32 micros;
  558.     Uint32 micros2;
  559.     NDB_TICKS secs;
  560.     NdbTick_CurrentMicrosecond(&secs, &micros);
  561.     error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY);
  562.     NdbTick_CurrentMicrosecond(&secs, &micros2);
  563.     printf("TIME ELAPSED %d n", micros2-micros);
  564. //    NdbSleep_MilliSleep(100);
  565.     */
  566.     goto again;
  567.     /* Unmap local segment */
  568.     SCIUnmapSegment(localMapTwo,NO_FLAGS,&error);
  569.     if (error == SCI_ERR_OK) {
  570.       printf("The local segment is unmappedn"); 
  571.     } else {
  572.       fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%xn",error);
  573.       return 0;
  574.     }
  575.     
  576.     /* Unmap local segment */
  577.     SCIUnmapSegment(localMapOne,NO_FLAGS,&error);
  578.     if (error == SCI_ERR_OK) {
  579.       printf("The local segment is unmappedn"); 
  580.     } else {
  581.       fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%xn",error);
  582.         return 0;
  583.     }
  584.     /* Remove local segment */
  585.     SCIRemoveSegment(localSegmentOne,NO_FLAGS,&error);
  586.     if (error == SCI_ERR_OK) {
  587.         printf("The local segment is removedn"); 
  588.     } else {
  589.         fprintf(stderr,"SCIRemoveSegment failed - Error code 0x%xn",error);
  590.         return 0;
  591.     }  
  592.     /* Remove local segment */
  593.     SCIRemoveSegment(localSegmentTwo,NO_FLAGS,&error);
  594.     if (error == SCI_ERR_OK) {
  595.         printf("The local segment is removedn"); 
  596.     } else {
  597.         fprintf(stderr,"SCIRemoveSegment failed - Error code 0x%xn",error);
  598.         return 0;
  599.     } 
  600.     return 1;
  601. }
  602. /*********************************************************************************/
  603. /*                                M A I N                                        */
  604. /*                                                                               */
  605. /*********************************************************************************/
  606. int main(int argc,char *argv[])
  607. {
  608.     int counter; 
  609.     printf("n %s compiled %s : %snn",argv[0],__DATE__,__TIME__);
  610.     
  611.     if (argc<3) {
  612.         Usage();
  613.         exit(-1);
  614.     }
  615.     /* Get the parameters */
  616.     for (counter=1; counter<argc; counter++) {
  617.         if (!strcmp("-rn",argv[counter])) {
  618.   //            remoteNodeId = strtol(argv[counter+1],(char **) NULL,10);
  619.             continue;
  620.         } 
  621.         if (!strcmp("-size",argv[counter])) {
  622.             segmentSize = strtol(argv[counter+1],(char **) NULL,10);
  623.             continue;
  624.         } 
  625.         if (!strcmp("-adapterno",argv[counter])) {
  626.             localAdapterNo = strtol(argv[counter+1],(char **) NULL,10);
  627.             continue;
  628.         }
  629.         if (!strcmp("-client",argv[counter])) {
  630.             client = 1;
  631.             continue;
  632.         }
  633.         if (!strcmp("-server",argv[counter])) {
  634.             server = 1;
  635.             continue;
  636.         }
  637.         if (!strcmp("-help",argv[counter])) {
  638.             Usage();
  639.             exit(0);
  640.         }
  641.     }
  642.     //    if (remoteNodeId == 0) {
  643.     //   fprintf(stderr,"Remote node-id is not specified. Use -rn <remote node-id>n");
  644.     //  exit(-1);
  645.     //}
  646.     if (server == 0 && client == 0) {
  647.         fprintf(stderr,"You must specify a client node or a server noden");
  648.         exit(-1);
  649.     }
  650.     if (server == 1 && client == 1) {
  651.         fprintf(stderr,"Both server node and client node is selected.n"); 
  652.         fprintf(stderr,"You must specify either a client or a server noden");
  653.         exit(-1);
  654.     }
  655.     /* Initialize the SISCI library */
  656.     SCIInitialize(NO_FLAGS, &error);
  657.     if (error != SCI_ERR_OK) {
  658.         fprintf(stderr,"SCIInitialize failed - Error code: 0x%xn",error);
  659.         exit(error);
  660.     }
  661.     /* Open a file descriptor */
  662.     SCIOpen(&sdOne,NO_FLAGS,&error);
  663.     if (error != SCI_ERR_OK) {
  664.         if (error == SCI_ERR_INCONSISTENT_VERSIONS) {
  665.             fprintf(stderr,"Version mismatch between SISCI user library and SISCI drivern");
  666.         }
  667.         fprintf(stderr,"SCIOpen failed - Error code 0x%xn",error);
  668.         exit(error); 
  669.     }
  670.     /* Open a file descriptor */
  671.     SCIOpen(&sdTwo,NO_FLAGS,&error);
  672.     if (error != SCI_ERR_OK) {
  673.         if (error == SCI_ERR_INCONSISTENT_VERSIONS) {
  674.             fprintf(stderr,"Version mismatch between SISCI user library and SISCI drivern");
  675.         }
  676.         fprintf(stderr,"SCIOpen failed - Error code 0x%xn",error);
  677.         exit(error); 
  678.     }
  679.     /* Get local node-id */
  680.     error = GetLocalNodeId(localAdapterNo, &localNodeId1);
  681.     error = GetLocalNodeId(standbyAdapterNo, &localNodeId2);
  682.     if (error != SCI_ERR_OK) {
  683.       fprintf(stderr,"Could not find the local adapter %dn", localAdapterNo);
  684.       SCIClose(sdOne,NO_FLAGS,&error);
  685.       SCIClose(sdTwo,NO_FLAGS,&error);
  686.       exit(-1);
  687.     }
  688.     
  689.     /* Print parameters */
  690.     PrintParameters();
  691.     if (client) {
  692.       remoteNodeId1=324;
  693.       remoteNodeId2=328;
  694.         ShmemClientNode();
  695.     } else {
  696.          remoteNodeId1=452;
  697.  remoteNodeId2=456;
  698.         ShmemServerNode();
  699.     }
  700.     /* Close the file descriptor */
  701.     SCIClose(sdOne,NO_FLAGS,&error);
  702.     SCIClose(sdTwo,NO_FLAGS,&error);
  703.     if (error != SCI_ERR_OK) {
  704.         fprintf(stderr,"SCIClose failed - Error code: 0x%xn",error);
  705.     }
  706.     /* Free allocated resources */
  707.     SCITerminate();
  708.     return SCI_ERR_OK;
  709. }