2012-07-02 13:09:13 -04:00
|
|
|
/*
|
2013-10-14 07:42:28 -04:00
|
|
|
|
|
|
|
Copyright (c) 2013, Project OSRM, Dennis Luxen, others
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without modification,
|
|
|
|
are permitted provided that the following conditions are met:
|
|
|
|
|
|
|
|
Redistributions of source code must retain the above copyright notice, this list
|
|
|
|
of conditions and the following disclaimer.
|
|
|
|
Redistributions in binary form must reproduce the above copyright notice, this
|
|
|
|
list of conditions and the following disclaimer in the documentation and/or
|
|
|
|
other materials provided with the distribution.
|
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
|
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
|
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
|
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
|
|
*/
|
2012-07-02 13:09:13 -04:00
|
|
|
|
|
|
|
#include "TemporaryStorage.h"
|
|
|
|
|
|
|
|
TemporaryStorage::TemporaryStorage() {
|
2013-08-05 11:28:57 -04:00
|
|
|
tempDirectory = boost::filesystem::temp_directory_path();
|
2012-07-02 13:09:13 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
TemporaryStorage & TemporaryStorage::GetInstance(){
|
|
|
|
static TemporaryStorage runningInstance;
|
|
|
|
return runningInstance;
|
|
|
|
}
|
|
|
|
|
|
|
|
TemporaryStorage::~TemporaryStorage() {
|
|
|
|
removeAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
void TemporaryStorage::removeAll() {
|
|
|
|
boost::mutex::scoped_lock lock(mutex);
|
2013-08-05 11:28:57 -04:00
|
|
|
for(unsigned slot_id = 0; slot_id < vectorOfStreamDatas.size(); ++slot_id) {
|
|
|
|
deallocateSlot(slot_id);
|
2012-07-02 13:09:13 -04:00
|
|
|
}
|
|
|
|
vectorOfStreamDatas.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
int TemporaryStorage::allocateSlot() {
|
|
|
|
boost::mutex::scoped_lock lock(mutex);
|
|
|
|
try {
|
|
|
|
vectorOfStreamDatas.push_back(StreamData());
|
2013-08-08 08:17:01 -04:00
|
|
|
//SimpleLogger().Write() << "created new temporary file: " << vectorOfStreamDatas.back().pathToTemporaryFile;
|
2012-07-09 15:56:27 -04:00
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
return vectorOfStreamDatas.size() - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TemporaryStorage::deallocateSlot(int slotID) {
|
|
|
|
try {
|
|
|
|
StreamData & data = vectorOfStreamDatas[slotID];
|
|
|
|
boost::mutex::scoped_lock lock(*data.readWriteMutex);
|
2013-08-05 11:28:57 -04:00
|
|
|
if(!boost::filesystem::exists(data.pathToTemporaryFile)) {
|
2012-07-02 13:09:13 -04:00
|
|
|
return;
|
|
|
|
}
|
2013-08-05 11:28:57 -04:00
|
|
|
if(data.streamToTemporaryFile->is_open()) {
|
2012-07-02 13:09:13 -04:00
|
|
|
data.streamToTemporaryFile->close();
|
2013-08-05 11:28:57 -04:00
|
|
|
}
|
2012-07-02 13:09:13 -04:00
|
|
|
|
2012-07-09 15:56:27 -04:00
|
|
|
boost::filesystem::remove(data.pathToTemporaryFile);
|
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TemporaryStorage::writeToSlot(int slotID, char * pointer, std::streamsize size) {
|
|
|
|
try {
|
|
|
|
StreamData & data = vectorOfStreamDatas[slotID];
|
|
|
|
boost::mutex::scoped_lock lock(*data.readWriteMutex);
|
2013-08-05 11:28:57 -04:00
|
|
|
BOOST_ASSERT_MSG(
|
|
|
|
data.writeMode,
|
|
|
|
"Writing after first read is not allowed"
|
|
|
|
);
|
2012-07-02 13:09:13 -04:00
|
|
|
data.streamToTemporaryFile->write(pointer, size);
|
2012-07-09 15:56:27 -04:00
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void TemporaryStorage::readFromSlot(int slotID, char * pointer, std::streamsize size) {
|
|
|
|
try {
|
|
|
|
StreamData & data = vectorOfStreamDatas[slotID];
|
|
|
|
boost::mutex::scoped_lock lock(*data.readWriteMutex);
|
|
|
|
if(data.writeMode) {
|
|
|
|
data.writeMode = false;
|
|
|
|
data.streamToTemporaryFile->seekg(0, data.streamToTemporaryFile->beg);
|
|
|
|
}
|
|
|
|
data.streamToTemporaryFile->read(pointer, size);
|
2012-07-09 15:56:27 -04:00
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned TemporaryStorage::getFreeBytesOnTemporaryDevice() {
|
2012-07-09 15:56:27 -04:00
|
|
|
boost::filesystem::space_info tempSpaceInfo;
|
2012-07-02 13:09:13 -04:00
|
|
|
try {
|
2012-07-09 15:56:27 -04:00
|
|
|
tempSpaceInfo = boost::filesystem::space(tempDirectory);
|
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
return tempSpaceInfo.available;
|
|
|
|
}
|
|
|
|
|
2012-07-09 15:56:27 -04:00
|
|
|
boost::filesystem::fstream::pos_type TemporaryStorage::tell(int slotID) {
|
|
|
|
boost::filesystem::fstream::pos_type position;
|
2012-07-02 13:09:13 -04:00
|
|
|
try {
|
|
|
|
StreamData & data = vectorOfStreamDatas[slotID];
|
|
|
|
boost::mutex::scoped_lock lock(*data.readWriteMutex);
|
|
|
|
position = data.streamToTemporaryFile->tellp();
|
2012-07-09 15:56:27 -04:00
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
return position;
|
|
|
|
}
|
|
|
|
|
2012-09-19 07:28:37 -04:00
|
|
|
void TemporaryStorage::abort(boost::filesystem::filesystem_error& ) {
|
2012-07-02 13:09:13 -04:00
|
|
|
removeAll();
|
|
|
|
}
|
|
|
|
|
2012-07-09 15:56:27 -04:00
|
|
|
void TemporaryStorage::seek(int slotID, boost::filesystem::fstream::pos_type position) {
|
2012-07-02 13:09:13 -04:00
|
|
|
try {
|
|
|
|
StreamData & data = vectorOfStreamDatas[slotID];
|
|
|
|
boost::mutex::scoped_lock lock(*data.readWriteMutex);
|
|
|
|
data.streamToTemporaryFile->seekg(position);
|
2012-07-09 15:56:27 -04:00
|
|
|
} catch(boost::filesystem::filesystem_error & e) {
|
2012-07-02 13:09:13 -04:00
|
|
|
abort(e);
|
|
|
|
}
|
|
|
|
}
|