Fix sparse page segfault. (#4040)

* Remove usage of raw pointers in SparsePageSource.
This commit is contained in:
Jiaming Yuan 2019-01-03 23:40:40 +08:00 committed by GitHub
parent 431c850c03
commit 55bc149efb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -59,19 +59,19 @@ SparsePageSource::SparsePageSource(const std::string& cache_info,
for (size_t i = 0; i < cache_shards.size(); ++i) { for (size_t i = 0; i < cache_shards.size(); ++i) {
std::string name_row = cache_shards[i] + page_type; std::string name_row = cache_shards[i] + page_type;
files_[i].reset(dmlc::SeekStream::CreateForRead(name_row.c_str())); files_[i].reset(dmlc::SeekStream::CreateForRead(name_row.c_str()));
dmlc::SeekStream* fi = files_[i].get(); std::unique_ptr<dmlc::SeekStream>& fi = files_[i];
std::string format; std::string format;
CHECK(fi->Read(&format)) << "Invalid page format"; CHECK(fi->Read(&format)) << "Invalid page format";
formats_[i].reset(SparsePageFormat::Create(format)); formats_[i].reset(SparsePageFormat::Create(format));
SparsePageFormat* fmt = formats_[i].get(); std::unique_ptr<SparsePageFormat>& fmt = formats_[i];
size_t fbegin = fi->Tell(); size_t fbegin = fi->Tell();
prefetchers_[i].reset(new dmlc::ThreadedIter<SparsePage>(4)); prefetchers_[i].reset(new dmlc::ThreadedIter<SparsePage>(4));
prefetchers_[i]->Init([fi, fmt] (SparsePage** dptr) { prefetchers_[i]->Init([&fi, &fmt] (SparsePage** dptr) {
if (*dptr == nullptr) { if (*dptr == nullptr) {
*dptr = new SparsePage(); *dptr = new SparsePage();
} }
return fmt->Read(*dptr, fi); return fmt->Read(*dptr, fi.get());
}, [fi, fbegin] () { fi->Seek(fbegin); }); }, [&fi, fbegin] () { fi->Seek(fbegin); });
} }
} }