From 54d99a0cbc25e14144710ebd5f5754ec498dd1f6 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sun, 12 Jan 2014 15:56:47 +0800 Subject: [PATCH] Fix test_data_layer segfault by adding destructor to join pthread --- include/caffe/vision_layers.hpp | 1 + src/caffe/layers/data_layer.cpp | 10 ++++++++++ src/caffe/test/test_data_layer.cpp | 4 ++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 2c23b45..fd84866 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -294,6 +294,7 @@ class DataLayer : public Layer { public: explicit DataLayer(const LayerParameter& param) : Layer(param) {} + virtual ~DataLayer(); virtual void SetUp(const vector*>& bottom, vector*>* top); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 078d497..d1262d0 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -17,8 +17,11 @@ namespace caffe { template void* DataLayerPrefetch(void* layer_pointer) { + CHECK(layer_pointer); DataLayer* layer = reinterpret_cast*>(layer_pointer); + CHECK(layer); Datum datum; + CHECK(layer->prefetch_data_); Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); Dtype* top_label = layer->prefetch_label_->mutable_cpu_data(); const Dtype scale = layer->layer_param_.scale(); @@ -38,6 +41,8 @@ void* DataLayerPrefetch(void* layer_pointer) { const Dtype* mean = layer->data_mean_.cpu_data(); for (int itemid = 0; itemid < batchsize; ++itemid) { // get a blob + CHECK(layer->iter_); + CHECK(layer->iter_->Valid()); datum.ParseFromString(layer->iter_->value().ToString()); const string& data = datum.data(); if (cropsize) { @@ -109,6 +114,11 @@ void* DataLayerPrefetch(void* layer_pointer) { return (void*)NULL; } +template +DataLayer::~DataLayer() { + // Finally, join the thread + CHECK(!pthread_join(thread_, NULL)) << "Pthread joining failed."; +} template void DataLayer::SetUp(const vector*>& bottom, diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index fe3e915..66e9956 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -81,8 +81,8 @@ TYPED_TEST(DataLayerTest, TestRead) { EXPECT_EQ(this->blob_top_label_->channels(), 1); EXPECT_EQ(this->blob_top_label_->height(), 1); EXPECT_EQ(this->blob_top_label_->width(), 1); - // Go throught the data twice - for (int iter = 0; iter < 2; ++iter) { + // Go through the data 100 times + for (int iter = 0; iter < 100; ++iter) { layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); -- 2.7.4