int main (int argc, char **argv) { /* * Setup the Scheme library by calling "___setup" with appropriate * parameters. The call to "___setup_params_reset" sets all parameters * to their default setting. */ ___setup_params_struct setup_params; ___setup_params_reset (&setup_params); setup_params.version = ___VERSION; setup_params.linker = SCHEME_LIBRARY_LINKER; ___setup (&setup_params); /* Main part of program: start N threads that increment a counter */ counter = new_counter (); /* create a new counter */ pthread_mutex_init (&mut, NULL); /* initialize mutex */ { int i; pthread_t tid[N]; void* results[N]; for (i = 0; i<N; i++) pthread_create (&tid[i], NULL, thread_main, NULL); for (i = 0; i<N; i++) pthread_join (tid[i], &results[i]); } { int got_throw = 0; int count = 0; ___ON_THROW(count = get_counter (counter), got_throw=1); if (got_throw) printf ("Scheme threw an exception\n"); else printf ("final count = %d\n", count); } /* we don't need the counter anymore */ ___ON_THROW(release_counter (counter),); /* Cleanup the Scheme library */ ___cleanup (); return 0; }
// Tests a pair of classifiers, debugging errors of the new against the old. // See errorcounter.h for description of arguments. // Iterates over the samples, calling the classifiers in normal/silent mode. // If the new_classifier makes a boosting_mode error that the old_classifier // does not, it will then call the new_classifier again with a debug flag // and a keep_this argument to find out what is going on. void ErrorCounter::DebugNewErrors( ShapeClassifier* new_classifier, ShapeClassifier* old_classifier, CountTypes boosting_mode, const FontInfoTable& fontinfo_table, const GenericVector<Pix*>& page_images, SampleIterator* it) { int fontsize = it->sample_set()->NumFonts(); ErrorCounter old_counter(old_classifier->GetUnicharset(), fontsize); ErrorCounter new_counter(new_classifier->GetUnicharset(), fontsize); GenericVector<UnicharRating> results; int total_samples = 0; int error_samples = 25; int total_new_errors = 0; // Iterate over all the samples, accumulating errors. for (it->Begin(); !it->AtEnd(); it->Next()) { TrainingSample* mutable_sample = it->MutableSample(); int page_index = mutable_sample->page_num(); Pix* page_pix = 0 <= page_index && page_index < page_images.size() ? page_images[page_index] : NULL; // No debug, no keep this. old_classifier->UnicharClassifySample(*mutable_sample, page_pix, 0, INVALID_UNICHAR_ID, &results); int correct_id = mutable_sample->class_id(); if (correct_id != 0 && !old_counter.AccumulateErrors(true, boosting_mode, fontinfo_table, results, mutable_sample)) { // old classifier was correct, check the new one. new_classifier->UnicharClassifySample(*mutable_sample, page_pix, 0, INVALID_UNICHAR_ID, &results); if (correct_id != 0 && new_counter.AccumulateErrors(true, boosting_mode, fontinfo_table, results, mutable_sample)) { tprintf("New Error on sample %d: Classifier debug output:\n", it->GlobalSampleIndex()); ++total_new_errors; new_classifier->UnicharClassifySample(*mutable_sample, page_pix, 1, correct_id, &results); if (results.size() > 0 && error_samples > 0) { new_classifier->DebugDisplay(*mutable_sample, page_pix, correct_id); --error_samples; } } } ++total_samples; } tprintf("Total new errors = %d\n", total_new_errors); }
perf_counter_ptr perf_counters::get_global_counter(const char *app, const char *section, const char *name, dsn_perf_counter_type_t flags, const char *dsptr, bool create_if_not_exist) { std::string full_name; perf_counter::build_full_name(app, section, name, full_name); utils::auto_write_lock l(_lock); if (create_if_not_exist) { auto it = _counters.find(full_name); if (it == _counters.end()) { perf_counter_ptr counter = new_counter(app, section, name, flags, dsptr); _counters.emplace(full_name, counter_object{counter, 1}); return counter; } else { dassert(it->second.counter->type() == flags, "counters with the same name %s with differnt types, (%d) vs (%d)", full_name.c_str(), it->second.counter->type(), flags); ++it->second.user_reference; return it->second.counter; } } else { auto it = _counters.find(full_name); if (it == _counters.end()) return nullptr; else { ++it->second.user_reference; return it->second.counter; } } }
void MetricsRecordBuilder::addCounter(const BasicItemReadOnly& info, long val) { MetricSnapshotPtr new_counter(new MetricCounterLong(info, val)); add(new_counter); }