diff --git a/brion/plugin/spikeReportFile.cpp b/brion/plugin/spikeReportFile.cpp index 8d8308e..e581c28 100644 --- a/brion/plugin/spikeReportFile.cpp +++ b/brion/plugin/spikeReportFile.cpp @@ -80,9 +80,8 @@ void writeNESTLine( std::fstream& file, SpikeReportFile::SpikeReportFile( const std::string& filename, const SpikeReportType rt, const int accessMode ) - : _filename( filename ), - _reportType( rt ), - _file( 0 ) + : _filename( filename ) + , _reportType( rt ) { if( filename.empty( )) { @@ -130,13 +129,11 @@ SpikeReportFile::SpikeReportFile( const std::string& filename, } } - _file = new std::fstream( _filename.c_str(), fileMode ); + _file.reset( new std::fstream( _filename.c_str(), fileMode )); } SpikeReportFile::~SpikeReportFile() { - if( _file ) - delete _file; } bool SpikeReportFile::fillReportMap( Spikes& spikes, const size_t maxLines ) @@ -232,7 +229,7 @@ bool SpikeReportFile::fillReportMap( Spikes& spikes, const size_t maxLines ) return _file->eof(); } -void SpikeReportFile::writeReportMap( const Spikes &spikes ) +void SpikeReportFile::writeReportMap( const Spikes& spikes ) { if( !_spikeWriteFunction ) LBTHROW( std::runtime_error( "File is not opened for writing " + @@ -244,7 +241,8 @@ void SpikeReportFile::writeReportMap( const Spikes &spikes ) void SpikeReportFile::close() { - _file->close(); + if( _file ) + _file->close(); } } diff --git a/brion/plugin/spikeReportFile.h b/brion/plugin/spikeReportFile.h index 127ef48..42b6c68 100644 --- a/brion/plugin/spikeReportFile.h +++ b/brion/plugin/spikeReportFile.h @@ -23,6 +23,8 @@ #include #include "spikeReportTypes.h" +#include + namespace brion { namespace plugin @@ -110,7 +112,7 @@ class SpikeReportFile : public boost::noncopyable std::string _filename; SpikeReportType _reportType; - std::fstream *_file; + boost::scoped_ptr< std::fstream > _file; SpikeParseFunc _spikeParseFunction; SpikeWriteFunc _spikeWriteFunction; }; diff --git a/brion/plugin/spikeReportNEST.cpp b/brion/plugin/spikeReportNEST.cpp index 59819f5..2129ea1 100644 --- a/brion/plugin/spikeReportNEST.cpp +++ b/brion/plugin/spikeReportNEST.cpp @@ -47,9 +47,9 @@ boost::regex convertToRegex( const std::string& stringWithShellLikeWildcard ) return boost::regex( "^" + wildcard + "$" ); } -lunchbox::Strings expandShellWildcard( const std::string& filename ) +Strings expandShellWildcard( const std::string& filename ) { - lunchbox::Strings expandedFilenames; + Strings expandedFilenames; namespace fs = boost::filesystem; @@ -75,39 +75,29 @@ lunchbox::Strings expandShellWildcard( const std::string& filename ) SpikeReportNEST::SpikeReportNEST( const SpikeReportInitData& initData ) : _uri( initData.getURI( )) + , _spikeReportFile( _uri.getPath(), NEST_SPIKE_REPORT, + initData.getAccessMode( )) { const int accessMode = initData.getAccessMode(); if( accessMode == MODE_READ ) - _reportFiles = expandShellWildcard( _uri.getPath( )); - - if( accessMode & MODE_WRITE ) - _reportFiles.push_back( _uri.getPath( )); - - _spikeReportFiles.resize( _reportFiles.size( )); - - bool emptyReport = true; - size_t reportIndex = 0; - BOOST_FOREACH( const std::string& reportFile, _reportFiles ) { - _spikeReportFiles[ reportIndex ] = - new SpikeReportFile( reportFile, - NEST_SPIKE_REPORT, - accessMode ); - if( accessMode == MODE_READ ) - _spikeReportFiles[ reportIndex ]->fillReportMap( _spikes ); - emptyReport = false; - ++reportIndex; + const Strings& reportFiles = expandShellWildcard( _uri.getPath( )); + if( reportFiles.empty( )) + LBTHROW( std::runtime_error( "No file(s) to read found in " + + _uri.getPath( ))); + + BOOST_FOREACH( const std::string& reportFile, reportFiles ) + { + SpikeReportFile reader( reportFile, NEST_SPIKE_REPORT, MODE_READ ); + reader.fillReportMap( _spikes ); + } + return; } - - if( emptyReport ) - LBTHROW( std::runtime_error( "Empty source" )); } SpikeReportNEST::~SpikeReportNEST() { - BOOST_FOREACH( SpikeReportFile* writer, _spikeReportFiles ) - delete writer; } const URI& SpikeReportNEST::getURI() const @@ -117,7 +107,7 @@ const URI& SpikeReportNEST::getURI() const bool SpikeReportNEST::handles( const SpikeReportInitData& initData ) { - const lunchbox::URI& uri = initData.getURI(); + const URI& uri = initData.getURI(); if( !uri.getScheme().empty() && uri.getScheme() != "file" ) return false; @@ -129,7 +119,7 @@ bool SpikeReportNEST::handles( const SpikeReportInitData& initData ) float SpikeReportNEST::getStartTime() const { - if ( _spikes.empty( )) + if( _spikes.empty( )) return std::numeric_limits< float >::max(); return _spikes.begin()->first; @@ -137,7 +127,7 @@ float SpikeReportNEST::getStartTime() const float SpikeReportNEST::getEndTime() const { - if ( _spikes.empty( )) + if( _spikes.empty( )) return std::numeric_limits< float >::max(); return _spikes.rbegin()->first; @@ -148,18 +138,14 @@ const Spikes& SpikeReportNEST::getSpikes() const return _spikes; } -void SpikeReportNEST::writeSpikes( const Spikes &spikes ) +void SpikeReportNEST::writeSpikes( const Spikes& spikes ) { - BOOST_FOREACH( SpikeReportFile* writer, - _spikeReportFiles ) - writer->writeReportMap( spikes ); + _spikeReportFile.writeReportMap( spikes ); } void SpikeReportNEST::close() { - BOOST_FOREACH( SpikeReportFile* writer, - _spikeReportFiles ) - writer->close(); + _spikeReportFile.close(); } } diff --git a/brion/plugin/spikeReportNEST.h b/brion/plugin/spikeReportNEST.h index 60e9039..0afe74a 100644 --- a/brion/plugin/spikeReportNEST.h +++ b/brion/plugin/spikeReportNEST.h @@ -61,9 +61,7 @@ class SpikeReportNEST : public SpikeReportPlugin private: const URI _uri; Spikes _spikes; - Strings _reportFiles; - typedef std::vector< SpikeReportFile* > SpikeReportFiles; - SpikeReportFiles _spikeReportFiles; + SpikeReportFile _spikeReportFile; }; } diff --git a/doc/Changelog.md b/doc/Changelog.md index d0106bf..a28e92e 100644 --- a/doc/Changelog.md +++ b/doc/Changelog.md @@ -3,6 +3,8 @@ Changelog {#Changelog} # git master {#master) +* [31](https://github.com/BlueBrain/Brion/pull/31): + Fix crash while reading more than `ulimit -Sn` (1024 default) NEST gdf files * [29](https://github.com/BlueBrain/Brion/pull/29): New member functions in brion::BlueConfig to provide a semantic API. * [28](https://github.com/BlueBrain/Brion/pull/28):