// // Saving the access specification list to a result file. // Saves only the currently active access specs. // BOOL AccessSpecList::SaveResults( ostream& outfile ) { int i, j; int access_count, manager_count, worker_count, current_access_index; Manager *mgr; Worker *wkr; BOOL *spec_active; Test_Spec *spec; outfile << "'Access specifications" << endl; access_count = Count(); spec_active = new BOOL[ access_count ]; // Determine which access specs are active for the current test // Start by marking all access specs inactive. for ( i = 1; i < access_count; i++ ) { spec_active[i] = FALSE; } current_access_index = theApp.pView->GetCurrentAccessIndex(); // Now go through all the workers and mark each worker's current access spec // as active, IF the worker is actually doing anything in this test. manager_count = theApp.manager_list.ManagerCount(); for ( i = 0; i < manager_count; i++ ) { mgr = theApp.manager_list.GetManager( i ); worker_count = mgr->WorkerCount(); for ( j = 0; j < worker_count; j++ ) { wkr = mgr->GetWorker( j ); if ( wkr->ActiveInCurrentTest() ) { spec_active[ IndexByRef( wkr->GetAccessSpec( current_access_index ) ) ] = TRUE; } } } // Save all the active access specs except the idle spec. for ( i = 1; i < access_count; i++ ) { if ( !spec_active[i] ) continue; spec = Get( i ); outfile << "'Access specification name,default assignment" << endl; outfile << spec->name << "," << spec->default_assignment << endl; // Write access specifications to a file, data comma separated. outfile << "'size,% of size,% reads,% random,delay,burst,align,reply" << endl; for ( int line_index = 0; line_index < MAX_ACCESS_SPECS; line_index++ ) { if ( spec->access[line_index].of_size == IOERROR ) break; outfile << spec->access[line_index].size << "," << spec->access[line_index].of_size << "," << spec->access[line_index].reads << "," << spec->access[line_index].random << "," << spec->access[line_index].delay << "," << spec->access[line_index].burst << "," << spec->access[line_index].align << "," << spec->access[line_index].reply << endl; } } outfile << "'End access specifications" << endl; delete spec_active; return TRUE; }
// // This function is called whenever the selection in the WorkerView changes. // If the selection changes to a worker, it displays that worker's access // spec assignment. // void CPageAccess::ShowAssignedAccess() { int m, w, s, mgr_count, wkr_count, spec_count; Manager *mgr; Worker *wkr = NULL; Test_Spec *spec; // Clear the list of assigned access specs. m_LAssignedAccess.DeleteAllItems(); // find out who is selected: All managers, a manager, or a worker. switch ( theApp.pView->m_pWorkerView->GetSelectedType() ) { case ALL_MANAGERS: // Disable the Assigned Access Spec listbox if there are no workers. if ( !theApp.manager_list.WorkerCount() ) { SetAssignedAccess( FALSE ); return; } // Enable the Assigned Access Spec listbox. SetAssignedAccess( TRUE ); // Only display items in the listbox if all the descended workers // have the same access spec list. if ( !theApp.manager_list.AreAccessSpecsIdentical() ) return; // All access specs are the same. Show the specs stored by any worker. // Find a manager with any non-client workers. mgr_count = theApp.manager_list.ManagerCount(); for ( m = 0; m < mgr_count; m++ ) { mgr = theApp.manager_list.GetManager( m ); wkr_count = mgr->WorkerCount(); if ( wkr_count > mgr->WorkerCount( GenericClientType ) ) break; } // Find the manager's first non-client worker. for ( w = 0; w < wkr_count; w++ ) { // Find the first non-client worker. wkr = mgr->GetWorker( w ); if ( !IsType( wkr->Type(), GenericClientType ) ) break; } break; case MANAGER: mgr = theApp.pView->m_pWorkerView->GetSelectedManager(); wkr_count = mgr->WorkerCount(); // Disable the access spec list if there are no non-client workers. if ( wkr_count == mgr->WorkerCount( GenericClientType ) ) { SetAssignedAccess( FALSE ); return; } // Enable the Assigned Access Spec listbox. SetAssignedAccess( TRUE ); // Only display items in the listbox if all the descended workers // have the same access spec list. if ( !mgr->AreAccessSpecsIdentical() ) return; // All the access specs are the same. // Find the first non-client worker. for ( w = 0; w < wkr_count; w++ ) { wkr = mgr->GetWorker( w ); if ( !IsType( wkr->Type(), GenericClientType ) ) break; } break; case WORKER: wkr = theApp.pView->m_pWorkerView->GetSelectedWorker(); if ( IsType( wkr->Type(), GenericClientType ) ) { // Worker is a net client. Display it's net server's spec // assignment, but disable the view. wkr = wkr->net_partner; SetAssignedAccess( FALSE ); } else { SetAssignedAccess( TRUE ); } break; } if ( !wkr ) { ErrorMessage( "No valid worker in CPageAccess::ShowAssignedAccess()." ); return; } // Add the Access Spec to the assigned access spec list view. spec_count = wkr->AccessSpecCount(); for ( s = 0; s < spec_count; s++ ) { spec = wkr->GetAccessSpec( s ); // Set the data portion to pointer to the access spec in the // worker's access spec list. m_LAssignedAccess.InsertItem( LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE, s, spec->name, NULL, LVIS_SELECTED, BLUE, (ULONG_PTR)spec ); } }