unsigned int TransferData(sci_map_t remoteMap, volatile unsigned int *remoteSegmentAddr1, volatile unsigned int *remoteSegmentAddr2, unsigned int segmentSize) { volatile unsigned int *remoteBuffer1; volatile unsigned int *remoteBuffer; volatile unsigned int *remoteBuffer2; static int times = 0; sci_sequence_t sequence; sci_error_t error; unsigned int nostores; unsigned int j; sci_sequence_status_t sequenceStatus; remoteBuffer1 = (volatile unsigned int *)remoteSegmentAddr1; remoteBuffer2 = (volatile unsigned int *)remoteSegmentAddr2; remoteBuffer=remoteBuffer1; /* 4-byte test only */ nostores = (segmentSize) / sizeof(unsigned int); /* Create a sequence for data error checking */ SCICreateMapSequence(remoteMapOne,&sequence,NO_FLAGS,&error); if (error != SCI_ERR_OK) { fprintf(stderr,"SCICreateMapSequence failed - Error code 0x%x\n",error); return error; } /* Fill in the data into a local buffer */ error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY); error = FillSegmentWithData(segmentSize, 0); tryagain: PrintServerData(localbufferPtr); fprintf(stderr,"After recover \n"); while(1){ //data=0; if (error != SCI_ERR_OK) { /* * Unable to create local buffer - Insufficient memory available */ printf( "Unable to create local buffer - Insufficient memory available\n" ); return error; } do { /* Start data error checking */ sequenceStatus = SCIStartSequence(sequence,NO_FLAGS,&error); } while (sequenceStatus != SCI_SEQ_OK) ; /* Transfer data to remote node */ for (j=0;j<nostores;j++) { remoteBuffer[j] = localbufferPtr[j]; } /* Check for error after data transfer */ sequenceStatus = SCICheckSequence(sequence,NO_FLAGS,&error); if (sequenceStatus != SCI_SEQ_OK) { fprintf(stderr,"Data transfer failed\n"); if(times==0) { error = FillSegmentWithData(segmentSize, 1); SCICreateMapSequence(remoteMapTwo,&sequence,NO_FLAGS,&error); if (error != SCI_ERR_OK) { fprintf(stderr,"SCICreateMapSequence failed - Error code 0x%x\n",error); return error; return SCI_ERR_TRANSFER_FAILED; } } else { error = FillSegmentWithData(segmentSize, 0); /* Create a sequence for data error checking */ SCICreateMapSequence(remoteMapOne,&sequence,NO_FLAGS,&error); if (error != SCI_ERR_OK) { fprintf(stderr,"SCICreateMapSequence failed - Error code 0x%x\n",error); return error; return SCI_ERR_TRANSFER_FAILED; } } fprintf(stderr,"Recovery \n"); if(times==0) remoteBuffer=remoteBuffer2; else remoteBuffer=remoteBuffer1; times++; printf("remotebuffer %p times %d\n", remoteBuffer, times); goto tryagain; } int timeout=0; // error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY); // NdbSleep_MilliSleep(100); //error = ReceiveInterrupt(sdOne,localAdapterNo,localNodeId1,DATA_TRANSFER_READY, timeout); } /* Remove the Sequence */ SCIRemoveSequence(sequence,NO_FLAGS, &error); if (error != SCI_ERR_OK) { fprintf(stderr,"SCIRemoveSequence failed - Error code 0x%x\n",error); return error; } return SCI_ERR_OK; }
unsigned int ShmemClientNode(void) { volatile unsigned int *remoteMapAddr1; volatile unsigned int *remoteMapAddr2; printf("here?\n"); /* Create a segmentId */ remoteSegmentId1 = 1;//(remoteNodeId1 << 16) | localNodeId1; /* Connect to remote segment */ printf("Connect to remote segment .... \n"); printf("segid = %d node %d \n",remoteSegmentId1, remoteNodeId1 ); do { SCIConnectSegment(sdOne, &remoteSegmentOne, remoteNodeId1, remoteSegmentId1, localAdapterNo, NO_CALLBACK, NULL, SCI_INFINITE_TIMEOUT, NO_FLAGS, &error); } while (error != SCI_ERR_OK); printf("connected\n"); // remoteSegmentId2 = (remoteNodeId2 << 16) | localNodeId2; // printf("segid = %d\n",remoteSegmentId2 ); printf("segid = %d node %d \n",remoteSegmentId1, remoteNodeId1 ); do { SCIConnectSegment(sdTwo, &remoteSegmentTwo, remoteNodeId2, remoteSegmentId1, standbyAdapterNo, NO_CALLBACK, NULL, SCI_INFINITE_TIMEOUT, NO_FLAGS, &error); } while (error != SCI_ERR_OK); printf("connected 3\n"); printf("Remote segment (id=0x%x) is connected.\n", remoteSegmentId2); /* Map remote segment to user space */ remoteMapAddr1 = (unsigned int*)SCIMapRemoteSegment(remoteSegmentOne,&remoteMapOne,offset,segmentSize,NULL,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Remote segment (id=0x%x) is mapped to user space @ 0x%x. \n", remoteSegmentId1, remoteMapAddr1); } else { fprintf(stderr,"SCIMapRemoteSegment failed - Error code 0x%x\n",error); return 0; } remoteMapAddr2 = (unsigned int *)SCIMapRemoteSegment(remoteSegmentTwo,&remoteMapTwo,offset,segmentSize,NULL,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Remote segment (id=0x%x) is mapped to user space @ 0x%x. \n", remoteSegmentId2, remoteMapAddr2); } else { fprintf(stderr,"SCIMapRemoteSegment failed - Error code 0x%x\n",error); return 0; } /* Start data transfer and error checking */ error = (sci_error_t)TransferData(remoteMapOne,remoteMapAddr1, remoteMapAddr2,segmentSize); if (error == SCI_ERR_OK) { printf("Data transfer done!\n\n"); } else { fprintf(stderr,"Data transfer failed - Error code 0x%x\n\n",error); return 0; } /* Send an interrupt to remote node telling that the data transfer is ready */ error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY); if (error == SCI_ERR_OK) { printf("\nInterrupt message sent to remote node\n"); } else { printf("\nInterrupt synchronization failed\n"); return 0; } PrintClientData(); /* Unmap remote segment */ SCIUnmapSegment(remoteMapOne,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The remote segment is unmapped\n"); } else { fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%x\n",error); return 0; } SCIUnmapSegment(remoteMapTwo,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The remote segment is unmapped\n"); } else { fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%x\n",error); return 0; } /* Disconnect segment */ SCIDisconnectSegment(remoteSegmentOne,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The segment is disconnected\n"); } else { fprintf(stderr,"SCIDisconnectSegment failed - Error code 0x%x\n",error); return 0; } SCIDisconnectSegment(remoteSegmentTwo,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The segment is disconnected\n"); } else { fprintf(stderr,"SCIDisconnectSegment failed - Error code 0x%x\n",error); return 0; } return 1; }