jni_result jni_participantFree( jni_participant p) { jni_result r; jni_partition partition; r = JNI_RESULT_OK; if(p != NULL){ if((p->publishers != NULL) && (c_iterLength(p->publishers) != 0)){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else if((p->subscribers != NULL) && (c_iterLength(p->subscribers) != 0)){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else if((p->topics != NULL) && (c_iterLength(p->topics) != 0)){ r = JNI_RESULT_PRECONDITION_NOT_MET; } else if((p->partitions != NULL) && (c_iterLength(p->partitions) != 0)){ partition = jni_partition(c_iterTakeFirst(p->partitions)); while((partition != NULL) && (r == JNI_RESULT_OK)){ r = jni_partitionFree(partition); partition = jni_partition(c_iterTakeFirst(p->partitions)); } } else{ /*DO NOTHING.*/ } if(r == JNI_RESULT_OK){ if(p->publishers != NULL){ c_iterFree(p->publishers); } if(p->subscribers != NULL){ c_iterFree(p->subscribers); } if(p->topics != NULL){ c_iterFree(p->topics); } if(p->partitions != NULL){ c_iterFree(p->partitions); } if(p->uparticipant != NULL){ r = jni_convertResult(u_participantFree(p->uparticipant)); } else{ r = JNI_RESULT_OK; } os_free(p); } } else{ r = JNI_RESULT_BAD_PARAMETER; } return r; }
int main (int argc, char *argv[]) { int opt; int interval = 3000; int sampleCount = 0; c_bool extended = FALSE; c_bool raw = FALSE; c_bool delta = FALSE; c_bool preallocated = FALSE; char *uri = ""; u_result ur; u_participant participant; v_participantQos pqos; int no_break = TRUE; char c; int lost; const char* sddsURI = NULL; monitorMode selectedAction = memoryStats; monitor_ms msData = NULL; monitor_trc trcData = NULL; monitor_orc orcData = NULL; int delay = 0; int trigger = 0; int sample = 0; c_long objectCountLimit = 0; char *filterExpression = NULL; HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); INPUT_RECORD buffer[1]; DWORD events; orderKind selectedOrdering = NO_ORDERING; int orderCount = INT_MAX; while (((opt = getopt (argc, argv, optflags)) != -1) && !errno) { switch (opt) { case 'i': if (!(sscanf (optarg, "%d", &interval)) > 0) { fprintf(stderr, "mmstat: Not a valid interval.\n"); print_usage(); exit(-1); } break; case 's': if (!(sscanf (optarg, "%d", &sampleCount)) > 0) { fprintf(stderr, "mmstat: Not a valid sample count.\n"); print_usage(); exit(-1); } break; case 'l': if (!(sscanf (optarg, "%d", &objectCountLimit)) > 0) { fprintf(stderr, "mmstat: Not a valid limit.\n"); print_usage(); exit(-1); } break; case 'f': filterExpression = optarg; break; case 'e': extended = TRUE; break; case 'r': raw = TRUE; break; case 'a': preallocated = TRUE; break; case 'm': selectedAction = memoryStats; break; case 'M': selectedAction = memoryStats; delta = TRUE; break; case 't': selectedAction = typeRefCount; break; case 'T': selectedAction = typeRefCount; delta = TRUE; break; case 'o': if (selectedOrdering == NO_ORDERING && strlen(optarg) == 1) { switch (optarg[0]) { case 'C': selectedOrdering = ORDER_BY_COUNT; break; case 'S': selectedOrdering = ORDER_BY_SIZE; break; case 'T': selectedOrdering = ORDER_BY_TOTAL; break; default: fprintf(stderr, "mmstat: Unknown ordering kind.\n"); print_usage(); exit(-1); } } else { fprintf(stderr, "mmstat: Cannot specify multiple orderings at the same time.\n"); print_usage(); exit(-1); } break; case 'n': if (!(sscanf (optarg, "%d", &orderCount)) > 0) { fprintf(stderr, "mmstat: Not a valid ordering nrEntries.\n"); print_usage(); exit(-1); } break; #ifdef OBJECT_WALK case 'r': selectedAction = objectRefCount; break; case 'R': selectedAction = objectRefCount; delta = TRUE; break; #endif case 'h': case '?': default: print_usage (); exit(0); break; } } if (errno) { fprintf(stderr, strerror(errno)); fprintf(stderr, "\n"); print_usage(); exit (-1); } if ((argc - optind) > 1) { fprintf(stderr, "Too many arguments"); print_usage (); exit (-1); } if (selectedAction == memoryStats) { if (objectCountLimit > 0) { fprintf(stderr, "Can't use object limit in memory stats mode.\n"); print_usage(); exit(-1); } if (filterExpression != NULL) { fprintf(stderr, "Can't use filter expression in memory stats mode.\n"); print_usage(); exit(-1); } } else { if (extended) { fprintf(stderr, "Extended mode can only be used in memory stats mode.\n"); print_usage(); exit(-1); } if (preallocated) { fprintf(stderr, "Preallocated memory can only be shown in memory stats mode.\n"); print_usage(); exit(-1); } } if ((argc - optind) == 1) { uri = argv[optind]; } if( !raw) { if(strlen(uri) > 0) { sddsURI = uri; } else { sddsURI = os_getenv ("OSPL_URI"); if(!sddsURI) { sddsURI = DOMAIN_NAME; } } printf("Trying to open connection with the OpenSplice system using URI:\n" \ "'%s'...\n", sddsURI); } else { sddsURI = uri; } ur = u_userInitialise(); if(ur == U_RESULT_OK) { pqos = u_participantQosNew(NULL); participant = u_participantNew(sddsURI, 30, "mmstat", (v_qos)pqos, TRUE); u_participantQosFree(pqos); if(participant) { if( !raw ) { printf("Connection established.\n\n"); } lost = 0; switch (selectedAction) { case memoryStats: msData = monitor_msNew (extended, raw, delta, preallocated); break; case typeRefCount: trcData = monitor_trcNew (objectCountLimit, filterExpression, selectedOrdering, orderCount, delta); break; case objectRefCount: orcData = monitor_orcNew (objectCountLimit, filterExpression, delta); break; } while (no_break && !lost) { if (delay <= 0 || trigger) { switch (selectedAction) { case memoryStats: ur = u_entityAction(u_entity(participant), monitor_msAction, msData); break; case typeRefCount: ur = u_entityAction(u_entity(participant), monitor_trcAction, trcData); break; case objectRefCount: ur = u_entityAction(u_entity(participant), monitor_orcAction, orcData); break; } fflush (stdout); sample++; if (trigger) { trigger = 0; } else { delay = interval; } } if(ur == U_RESULT_OK) { if (_isatty(_fileno(stdin)) && !raw) { c = '\0'; PeekConsoleInput( handle, buffer, 1, &events ); if(events > 0) { ReadConsoleInput(handle, buffer, 1, &events); if(buffer[0].EventType == KEY_EVENT && buffer[0].Event.KeyEvent.bKeyDown) { c = buffer[0].Event.KeyEvent.uChar.AsciiChar; } } if (c == 'q' || c == '\03' /* ^C */) { no_break = FALSE; } else if (c == 't') { trigger = 1; } PeekConsoleInput( handle, buffer, 1, &events ); if(events > 0) { ReadConsoleInput(handle, buffer, 1, &events); if(buffer[0].EventType == KEY_EVENT && buffer[0].Event.KeyEvent.bKeyDown) { c = buffer[0].Event.KeyEvent.uChar.AsciiChar; } } } if (no_break && interval) { delay -= 100; os_nanoSleep (SLEEP_INTERVAL); } } else { /* Participant is no longer accessible, terminate now... */ no_break = 0; lost = TRUE; } if (sampleCount && (sample == sampleCount)) { printf ("\nsample_count limit reached\n"); no_break = 0; } } PeekConsoleInput( handle, buffer, 1, &events ); if(events > 0) { ReadConsoleInput(handle, buffer, 1, &events); if(buffer[0].EventType == KEY_EVENT && buffer[0].Event.KeyEvent.bKeyDown) { c = buffer[0].Event.KeyEvent.uChar.AsciiChar; } } if(lost) { printf("\nConnection with domain lost. The OpenSplice system has\n" \ "probably been shut down.\n"); } u_participantFree(participant); } else { printf("Connection could NOT be established (creation of participant failed).\n"); printf("Is the OpenSplice system running?\n"); OS_REPORT(OS_ERROR,"mmstat", 0, "Creation of participant failed."); } u_userDetach(); switch (selectedAction) { case memoryStats: monitor_msFree (msData); break; case typeRefCount: monitor_trcFree (trcData); break; case objectRefCount: monitor_orcFree (orcData); break; } } else { printf("Connection could NOT be established (could not initialise).\n"); printf("Is the OpenSplice system running?\n"); OS_REPORT(OS_ERROR,"mmstat", 0, "Failed to initialise."); } printf("\nExiting now...\n"); return 0; }