Blame samples/mt-test.cpp

Packit 01d647
// ***************************************************************** -*- C++ -*-
Packit 01d647
// mt-test.cpp
Packit 01d647
// Sample multi-threading program
Packit 01d647
Packit 01d647
// Discussion:          http://dev.exiv2.org/issues/1207
Packit 01d647
// Caution:             This code isn't currently exercised by any bash script in the test suite
Packit 01d647
// This code is here for use in development when multi-threading issues
Packit 01d647
// are being discussed.  For example #1207 and #1187
Packit 01d647
// It may be brought into use when Exiv2 support C++11 (#1188)
Packit 01d647
//
Packit 01d647
Packit 01d647
// WARNING:             Only builds with clang and gcc < 4.9.  I've never tried to build with Visual Studio
Packit 01d647
// requires C++11
Packit 01d647
// On Mac               #define  __cplusplus 201103L
Packit 01d647
// Older compilers      #define __cplusplus  199711
Packit 01d647
// Compiler switches:   -std=c++11 (set in samples/Makefile)
Packit 01d647
Packit 01d647
// WARNING:             auto_ptr is not supported in C++11 implemented by gcc 4.9/C++11 and later
Packit 01d647
Packit 01d647
#include <exiv2/exiv2.hpp>
Packit 01d647
#include <iostream>
Packit 01d647
#include <iomanip>
Packit 01d647
#include <cassert>
Packit 01d647
#include <string>
Packit 01d647
#include <thread>
Packit 01d647
#include <mutex>
Packit 01d647
Packit 01d647
// mutex to for exclusive reporting
Packit 01d647
std::mutex m;
Packit 01d647
Packit 01d647
void reportExifMetadataCount(int n,const char* argv[])
Packit 01d647
{
Packit 01d647
	int count = 0 ;
Packit 01d647
	std::string what;
Packit 01d647
Packit 01d647
	// count the exif metadata in the file
Packit 01d647
	try {
Packit 01d647
		Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(argv[n]);
Packit 01d647
		assert(image.get() != 0);
Packit 01d647
		image->readMetadata();
Packit 01d647
Packit 01d647
		Exiv2::ExifData &exifData = image->exifData();
Packit 01d647
		if (!exifData.empty()) {
Packit 01d647
			Exiv2::ExifData::const_iterator end = exifData.end();
Packit 01d647
			for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i)
Packit 01d647
				count++;
Packit 01d647
		}
Packit 01d647
	} catch (Exiv2::Error& e) {
Packit 01d647
		what = e.what() ;
Packit 01d647
		count = -1;
Packit 01d647
	}
Packit 01d647
Packit 01d647
	// report to the user
Packit 01d647
	m.lock();
Packit 01d647
	std::cout << "file: "  << argv[n] << " "
Packit 01d647
	          << "n: "     << n       << " "
Packit 01d647
	          << "count: " << count   << " "
Packit 01d647
	          << (count < 0 ? "exception: " : what)
Packit 01d647
	          << what                 << std::endl;
Packit 01d647
	m.unlock();
Packit 01d647
}
Packit 01d647
Packit 01d647
int main(int argc,const char* argv[])
Packit 01d647
{
Packit 01d647
	int result = 0;
Packit 01d647
Packit 01d647
	if ( argc < 2 ) {
Packit 01d647
		std::cerr << "syntax: " << argv[0] << " [path]+" << std::endl;
Packit 01d647
		result = 1 ;
Packit 01d647
	} else {
Packit 01d647
		// Initialize XmpParser before starting threads
Packit 01d647
		Exiv2::XmpParser::initialize();
Packit 01d647
Packit 01d647
		// bucket of threads
Packit 01d647
		std::thread* threads = new std::thread[argc+1];
Packit 01d647
Packit 01d647
		// spin up the treads
Packit 01d647
		for ( int arg = 1 ; arg < argc ; arg++ ) {
Packit 01d647
			threads[arg] = std::thread(reportExifMetadataCount,arg,argv);
Packit 01d647
		}
Packit 01d647
Packit 01d647
		// wait for them to finish
Packit 01d647
		for ( int arg = 1 ; arg < argc ; arg++ ) {
Packit 01d647
			if ( threads[arg].joinable() )
Packit 01d647
				threads[arg].join();
Packit 01d647
		}
Packit 01d647
		delete [] threads;
Packit 01d647
	}
Packit 01d647
Packit 01d647
	return result;
Packit 01d647
}
Packit 01d647
Packit 01d647
// That's all Folks!
Packit 01d647
////