bool SCI_Transporter::disconnectLocal() { DBUG_ENTER("SCI_Transporter::disconnectLocal"); sci_error_t err; m_ActiveAdapterId=0; /** Free resources used by a local segment */ SCIUnmapSegment(m_SourceSegm[0].lhm[0].map,0,&err); if(err!=SCI_ERR_OK) { report_error(TE_SCI_UNABLE_TO_UNMAP_SEGMENT); DBUG_PRINT("error", ("Unable to unmap segment")); DBUG_RETURN(false); } SCIRemoveSegment((m_SourceSegm[m_ActiveAdapterId].localHandle), FLAGS, &err); if(err!=SCI_ERR_OK) { report_error(TE_SCI_UNABLE_TO_REMOVE_SEGMENT); DBUG_PRINT("error", ("Unable to remove segment")); DBUG_RETURN(false); } DBUG_PRINT("info", ("Local memory segment is unmapped and removed")); DBUG_RETURN(true); } // disconnectLocal()
unsigned int ShmemServerNode(void) { unsigned int *localMapAddr; /* Create a segmentId */ localSegmentId =1;// (localNodeId1 << 16) | remoteNodeId1; /* Create local segment */ SCICreateSegment(sdOne,&localSegmentOne,localSegmentId, segmentSize, NO_CALLBACK, NULL, NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Local segment (id=%d, size=%d) is created. \n", localSegmentId, segmentSize); } else { fprintf(stderr,"SCICreateSegment failed - Error code 0x%x\n",error); return 0; } //localSegmentId = (localNodeId2 << 16) | remoteNodeId2; /* SCICreateSegment(sdTwo,&localSegmentTwo,localSegmentId+1, segmentSize, NO_CALLBACK, NULL, NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Local segment (id=%d, size=%d) is created (2). \n", localSegmentId, segmentSize); } else { fprintf(stderr,"SCICreateSegment failed - Error code 0x%x\n",error); return 0; } printf("segment one %p segment 2 %p\n", localSegmentOne, localSegmentTwo); */ /* Prepare the segment */ SCIPrepareSegment(localSegmentOne,localAdapterNo,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Local segment (id=%d, size=%d) is prepared. \n", localSegmentId, segmentSize); } else { fprintf(stderr,"SCIPrepareSegment failed - Error code 0x%x\n",error); return 0; } /* Prepare the segment */ SCIPrepareSegment(localSegmentOne,standbyAdapterNo,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Local segment (id=%d, size=%d) is created. \n", localSegmentId, segmentSize); } else { fprintf(stderr,"SCIPrepareSegment failed - Error code 0x%x\n",error); return 0; } /* Map local segment to user space */ localMapAddr = (unsigned int *)SCIMapLocalSegment(localSegmentOne,&localMapOne, offset,segmentSize, NULL,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Local segment (id=0x%x) is mapped to user space @ 0x%x.\n", localSegmentId, localMapAddr); } else { fprintf(stderr,"SCIMapLocalSegment failed - Error code 0x%x\n",error); return 0; } /* Map local segment to user space */ /* localMapAddr = (unsigned int *)SCIMapLocalSegment(localSegmentTwo,&localMapTwo, offset,segmentSize, NULL,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("Local segment (id=0x%x) is mapped to user space @ 0x%x.\n", localSegmentId, localMapAddr); printf("Local segment (id=%d) is mapped to user space.\n", localSegmentId); } else { fprintf(stderr,"SCIMapLocalSegment failed - Error code 0x%x\n",error); return 0; } */ /* Set the segment available */ SCISetSegmentAvailable(localSegmentOne, localAdapterNo, NO_FLAGS, &error); if (error == SCI_ERR_OK) { printf("Local segment (id=0x%x) is available for remote connections. \n", localSegmentId); } else { fprintf(stderr,"SCISetSegmentAvailable failed - Error code 0x%x\n",error); return 0; } SCISetSegmentAvailable(localSegmentOne, standbyAdapterNo, NO_FLAGS, &error); if (error == SCI_ERR_OK) { printf("Local segment (id=0x%x) is available for remote connections. \n", localSegmentId); } else { fprintf(stderr,"SCISetSegmentAvailable failed - Error code 0x%x\n",error); return 0; } int timeout=0; error = ReceiveInterrupt(sdOne,localAdapterNo,localNodeId1,DATA_TRANSFER_READY, timeout); if (error == SCI_ERR_OK) { printf("\nThe data transfer is ready\n"); } else { printf("\nInterrupt synchronization failed\n"); return 0; } again: // printf("Wait for the shared memory data transfer ....."); /* Wait for interrupt signal telling that block transfer is ready */ //printf("\nData transfer done!\n"); //PrintClientData() PrintServerData(localMapAddr); /*Uint32 micros; Uint32 micros2; NDB_TICKS secs; NdbTick_CurrentMicrosecond(&secs, µs); error = SendInterrupt(sdOne,localAdapterNo,localNodeId1,remoteNodeId1, DATA_TRANSFER_READY); NdbTick_CurrentMicrosecond(&secs, µs2); printf("TIME ELAPSED %d \n", micros2-micros); // NdbSleep_MilliSleep(100); */ goto again; /* Unmap local segment */ SCIUnmapSegment(localMapTwo,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The local segment is unmapped\n"); } else { fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%x\n",error); return 0; } /* Unmap local segment */ SCIUnmapSegment(localMapOne,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The local segment is unmapped\n"); } else { fprintf(stderr,"SCIUnmapSegment failed - Error code 0x%x\n",error); return 0; } /* Remove local segment */ SCIRemoveSegment(localSegmentOne,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The local segment is removed\n"); } else { fprintf(stderr,"SCIRemoveSegment failed - Error code 0x%x\n",error); return 0; } /* Remove local segment */ SCIRemoveSegment(localSegmentTwo,NO_FLAGS,&error); if (error == SCI_ERR_OK) { printf("The local segment is removed\n"); } else { fprintf(stderr,"SCIRemoveSegment failed - Error code 0x%x\n",error); return 0; } return 1; }
//! libère les structures sci associées au client. Renvoie SUCCESS/ERROR. int cleanupsci_client(client_t *cl) { sci_error_t retval; int ret; ret = SUCCESS; log_message("cleaning up SCI resources for client SCI '%d'\n", cl->no_sci); // désallocation des segments de mémoire partagée if (cl->local_ctl_segment != NULL) { SCISetSegmentUnavailable(cl->local_ctl_segment, ADAPTER_NO, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } if (cl->local_data_write_segment != NULL) { SCISetSegmentUnavailable(cl->local_data_write_segment, ADAPTER_NO, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } if (cl->local_ctl_segment != NULL) { SCIRemoveSegment(cl->local_ctl_segment, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } if (cl->local_data_write_segment != NULL) { SCIRemoveSegment(cl->local_data_write_segment, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } if (cl->local_read_temp_segment != NULL) { SCIRemoveSegment(cl->local_read_temp_segment, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } // desallocation des IT if (cl->local_deb_io_interrupt != NULL) { SCIRemoveInterrupt(cl->local_deb_io_interrupt, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } if (cl->local_clready_interrupt != NULL) { SCIRemoveInterrupt(cl->local_clready_interrupt, NO_FLAGS, &retval); if (retval != SCI_ERR_OK) ret = ERROR; } retval = deconnexion_sci_client(cl); if (retval == ERROR) { log_error("pb pour se déconnecter des ressources SCI du client " "SCI n°'%d'\n", cl->no_sci); ret = ERROR; } if ((close_vd(&cl->vd_finio) != SUCCESS) || (close_vd(&cl->vd_debio) != SUCCESS) || (close_vd(&cl->vd_clready) != SUCCESS) || (close_vd(&cl->vd_errorio) != SUCCESS) || (close_vd(&cl->vd_ready) != SUCCESS) || (close_vd(&cl->vd_dataread) != SUCCESS) || (close_vd(&cl->vd_datareadtemp) != SUCCESS) || (close_vd(&cl->vd_datawrite) != SUCCESS) || (close_vd(&cl->vd_ctl) != SUCCESS)) ret = ERROR; raz_sci_ptr(cl); return ret; }