task_ptr read( dsn_handle_t hFile, char* buffer, int count, uint64_t offset, dsn_task_code_t callback_code, servicelet* owner, aio_handler callback, int hash /*= 0*/ ) { task_ptr tsk = new safe_task<aio_handler>(callback); if (callback != nullptr) tsk->add_ref(); // released in exec_aio dsn_task_t t = dsn_file_create_aio_task(callback_code, callback != nullptr ? safe_task<aio_handler>::exec_aio : nullptr, tsk, hash ); tsk->set_task_info(t); dsn_file_read(hFile, buffer, count, offset, t, owner ? owner->tracker() : nullptr); return tsk; }
task_ptr create_aio_task(dsn_task_code_t callback_code, clientlet* svc, empty_callback_t, int hash) { task_ptr tsk = new safe_task_handle; //do not add_ref here dsn_task_t t = dsn_file_create_aio_task(callback_code, nullptr, nullptr, hash, svc ? svc->tracker() : nullptr ); tsk->set_task_info(t); return tsk; }
task_ptr copy_remote_files( const dsn_address_t& remote, const std::string& source_dir, std::vector<std::string>& files, // empty for all const std::string& dest_dir, bool overwrite, dsn_task_code_t callback_code, servicelet* owner, aio_handler callback, int hash /*= 0*/ ) { task_ptr tsk = new safe_task<aio_handler>(callback); if (callback != nullptr) tsk->add_ref(); // released in exec_aio dsn_task_t t = dsn_file_create_aio_task(callback_code, callback != nullptr ? safe_task<aio_handler>::exec_aio : nullptr, tsk, hash ); tsk->set_task_info(t); if (files.empty()) { dsn_file_copy_remote_directory(remote, source_dir.c_str(), dest_dir.c_str(), overwrite, t, owner ? owner->tracker() : nullptr); } else { const char** ptr = (const char**)alloca(sizeof(const char*) * (files.size() + 1)); for (auto& f : files) { *ptr++ = f.c_str(); } *ptr = nullptr; dsn_file_copy_remote_files(remote, source_dir.c_str(), ptr, dest_dir.c_str(), overwrite, t, owner ? owner->tracker() : nullptr); } return tsk; }