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;
        }
Exemple #2
0
 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;
        }