diff --git a/src/libloom/data/index.cpp b/src/libloom/data/index.cpp index 6ece13110a5d94a853c411ea2a13c68d282bd5b7..e1a07b99f0f7abe2bab2bd65da5da0af03f80614 100644 --- a/src/libloom/data/index.cpp +++ b/src/libloom/data/index.cpp @@ -48,7 +48,7 @@ std::shared_ptr<Data> Index::get_at_index(size_t index) size_t size = indices[index + 1] - addr; auto data = std::make_shared<RawData>(); - data->init_empty_file(worker, size); + data->init_empty(worker, size); char *p2 = data->get_raw_data(worker); memcpy(p2, p1, size); return data; @@ -77,7 +77,7 @@ std::shared_ptr<Data> Index::get_slice(size_t from, size_t to) size_t size = to_addr - from_addr; auto data = std::make_shared<RawData>(); - data->init_empty_file(worker, size); + data->init_empty(worker, size); char *p2 = data->get_raw_data(worker); memcpy(p2, p1, size); return data; diff --git a/src/libloom/data/rawdata.cpp b/src/libloom/data/rawdata.cpp index 4e9405e1e1d8cfc53e0ef2c9206cee5d49ffd95a..1b89b49622bc5c602cd83cc8368de65b2bf87731 100644 --- a/src/libloom/data/rawdata.cpp +++ b/src/libloom/data/rawdata.cpp @@ -51,7 +51,7 @@ std::string RawData::get_type_name() const return data; }*/ -char* RawData::init_empty_file(Worker &worker, size_t size) +char* RawData::init_empty(Worker &worker, size_t size) { assert(data == nullptr); @@ -141,6 +141,13 @@ std::string RawData::get_info() return "RawData"; } +void RawData::init_from_string(Worker &worker, const std::string &str) +{ + auto size = str.size(); + char *mem = init_empty(worker, size); + memcpy(mem, str.c_str(), size); +} + void RawData::serialize_data(Worker &worker, SendBuffer &buffer, std::shared_ptr<Data> &data_ptr) { buffer.add(data_ptr, get_raw_data(worker), size); @@ -156,7 +163,7 @@ bool RawDataUnpacker::init(Worker &worker, Connection &connection, const loomcom this->data = std::make_shared<RawData>(); RawData &data = static_cast<RawData&>(*this->data); size_t size = msg.size(); - pointer = data.init_empty_file(worker, size); + pointer = data.init_empty(worker, size); if (size == 0) { return true; } diff --git a/src/libloom/data/rawdata.h b/src/libloom/data/rawdata.h index 94403a8727e2af7368271b4c842351e47c273b7c..6f9c29b5280fc022636759bde5a9d049f9c51f07 100644 --- a/src/libloom/data/rawdata.h +++ b/src/libloom/data/rawdata.h @@ -27,7 +27,8 @@ public: std::string get_info(); - char* init_empty_file(Worker &worker, size_t size); + char* init_empty(Worker &worker, size_t size); + void init_from_string(Worker &worker, const std::string &str); void assign_filename(Worker &worker); void init_from_file(Worker &worker); diff --git a/src/libloom/taskinstance.cpp b/src/libloom/taskinstance.cpp index 02ecca592c722a5ef30d798536ab13a1f72eb7fc..bc2e301f80382ac35086b7e1ae365df44a7f5e37 100644 --- a/src/libloom/taskinstance.cpp +++ b/src/libloom/taskinstance.cpp @@ -43,7 +43,7 @@ void TaskInstance::fail_libuv(const std::string &error_msg, int error_code) fail(s.str()); } -void TaskInstance::finish(std::shared_ptr<Data> &output) +void TaskInstance::finish(const std::shared_ptr<Data> &output) { assert(output); worker.publish_data(get_id(), output); diff --git a/src/libloom/taskinstance.h b/src/libloom/taskinstance.h index de483620a3f4d41412fe1ed2fbda2f59ca434bd9..0225ed57ee06fcd7ea70aacdd8778dffcb40f2c8 100644 --- a/src/libloom/taskinstance.h +++ b/src/libloom/taskinstance.h @@ -46,7 +46,8 @@ public: protected: void fail(const std::string &error_msg); void fail_libuv(const std::string &error_msg, int error_code); - void finish(std::shared_ptr<Data> &output); + void finish(const std::shared_ptr<Data> &output); + Worker &worker; std::unique_ptr<Task> task; diff --git a/src/libloom/tasks/basetasks.cpp b/src/libloom/tasks/basetasks.cpp index 22a213d168e06ed340e31c926b2a0f3cff350354..623c0d017be9ccd7e4d6ca2637816f7eea4c9065 100644 --- a/src/libloom/tasks/basetasks.cpp +++ b/src/libloom/tasks/basetasks.cpp @@ -34,7 +34,7 @@ void SizeTask::start(DataVector &inputs) } std::shared_ptr<Data> output = std::make_shared<RawData>(); RawData &data = static_cast<RawData&>(*output); - memcpy(data.init_empty_file(worker, sizeof(size_t)), &size, sizeof(size_t)); + memcpy(data.init_empty(worker, sizeof(size_t)), &size, sizeof(size_t)); finish(output); } @@ -46,6 +46,6 @@ void LengthTask::start(DataVector &inputs) } std::shared_ptr<Data> output = std::make_shared<RawData>(); RawData &data = static_cast<RawData&>(*output); - memcpy(data.init_empty_file(worker, sizeof(size_t)), &length, sizeof(size_t)); + memcpy(data.init_empty(worker, sizeof(size_t)), &length, sizeof(size_t)); finish(output); } diff --git a/src/libloom/tasks/rawdatatasks.cpp b/src/libloom/tasks/rawdatatasks.cpp index 957ae7ade0a800bddabf3e8ba6939768c10da991..1ccfc0842fb9d5a80dd436857bed99f39fecb9ca 100644 --- a/src/libloom/tasks/rawdatatasks.cpp +++ b/src/libloom/tasks/rawdatatasks.cpp @@ -13,11 +13,9 @@ using namespace loom; void ConstTask::start(DataVector &inputs) { - auto& config = task->get_config(); - std::shared_ptr<Data> output = std::make_shared<RawData>(); - RawData &data = static_cast<RawData&>(*output); - memcpy(data.init_empty_file(worker, config.size()), config.c_str(), config.size()); - finish(output); + auto output = std::make_shared<RawData>(); + output->init_from_string(worker, task->get_config()); + finish(std::static_pointer_cast<Data>(output)); } /** If there are more then 50 input or size is bigger then 20000, @@ -44,7 +42,7 @@ std::shared_ptr<Data> MergeTask::run() { } std::shared_ptr<Data> output = std::make_shared<RawData>(); RawData &data = static_cast<RawData&>(*output); - data.init_empty_file(worker, size); + data.init_empty(worker, size); char *dst = output->get_raw_data(worker); for (auto& data : inputs) { diff --git a/src/libloom/worker.cpp b/src/libloom/worker.cpp index b457bfe240a864cee648efa9a00f2eb0c62037fa..13414b7175e2293ae0b076dab7e2c5928b8fac97 100644 --- a/src/libloom/worker.cpp +++ b/src/libloom/worker.cpp @@ -216,7 +216,7 @@ void Worker::start_task(std::unique_ptr<Task> task) t->start(); }*/ -void Worker::publish_data(Id id, std::shared_ptr<Data> &data) +void Worker::publish_data(Id id, const std::shared_ptr<Data> &data) { llog->debug("Publishing data id={} size={}", id, data->get_size()); public_data[id] = data; diff --git a/src/libloom/worker.h b/src/libloom/worker.h index 043b36131c4cdd3e4273a558ab08c8505614331b..79098e3f9fe1be34d32da64f2ce5d1c559c12aa1 100644 --- a/src/libloom/worker.h +++ b/src/libloom/worker.h @@ -67,7 +67,7 @@ public: void task_finished(TaskInstance &task_instance, Data &data); void task_failed(TaskInstance &task_instance, const std::string &error_msg); - void publish_data(Id id, std::shared_ptr<Data> &data); + void publish_data(Id id, const std::shared_ptr<Data> &data); void remove_data(Id id); bool has_data(Id id) const