[Spice-devel] [vdagent-win PATCH 09/13] file_xfer: Use shared_ptr to simplify memory management

Christophe Fergeau cfergeau at redhat.com
Mon May 28 13:23:16 UTC 2018


On Mon, May 28, 2018 at 09:58:02AM +0100, Frediano Ziglio wrote:
> Clear automatically tasks items.
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  vdagent/file_xfer.cpp | 25 ++++---------------------
>  vdagent/file_xfer.h   |  3 ++-
>  2 files changed, 6 insertions(+), 22 deletions(-)
> 
> diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp
> index e96065b..71b56ed 100644
> --- a/vdagent/file_xfer.cpp
> +++ b/vdagent/file_xfer.cpp
> @@ -41,19 +41,11 @@
>  
>  void FileXfer::reset()
>  {
> -    FileXferTasks::iterator iter;
> -    FileXferTask* task;
> -
> -    for (iter = _tasks.begin(); iter != _tasks.end(); iter++) {
> -        task = iter->second;
> -        delete task;
> -    }
>      _tasks.clear();
>  }
>  
>  FileXfer::~FileXfer()
>  {
> -    reset();
>  }
>  
>  void FileXfer::handle_start(VDAgentFileXferStartMessage* start,
> @@ -63,7 +55,6 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start,
>      TCHAR file_path[MAX_PATH];
>      char file_name[MAX_PATH];
>      ULARGE_INTEGER free_bytes;
> -    FileXferTask* task;
>      uint64_t file_size;
>      HANDLE handle;
>      AsUser as_user;
> @@ -146,7 +137,7 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage* start,
>          vd_printf("Failed creating %ls. More than 63 copies exist?", file_path);
>          return;
>      }
> -    task = new FileXferTask(handle, file_size, file_path);
> +    auto task = std::make_shared<FileXferTask>(handle, file_size, file_path);

For what it's worth, I'd stick to FileXferTask * here, and below where
you add another 'auto'

>      _tasks[start->id] = task;
>      status->result = VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA;
>  }
> @@ -155,7 +146,6 @@ bool FileXfer::handle_data(VDAgentFileXferDataMessage* data,
>                             VDAgentFileXferStatusMessage* status)
>  {
>      FileXferTasks::iterator iter;
> -    FileXferTask* task = NULL;
>      DWORD written;
>  
>      status->id = data->id;
> @@ -163,9 +153,9 @@ bool FileXfer::handle_data(VDAgentFileXferDataMessage* data,
>      iter = _tasks.find(data->id);
>      if (iter == _tasks.end()) {
>          vd_printf("file id %u not found", data->id);
> -        goto fin;
> +        return true;
>      }
> -    task = iter->second;
> +    auto task = iter->second;
>      task->pos += data->size;
>      if (task->pos > task->size) {
>          vd_printf("file xfer is longer than expected");
> @@ -184,11 +174,7 @@ bool FileXfer::handle_data(VDAgentFileXferDataMessage* data,
>      status->result = VD_AGENT_FILE_XFER_STATUS_SUCCESS;
>  
>  fin:
> -    if (task) {
> -        _tasks.erase(iter);
> -        delete task;
> -    }
> -
> +    _tasks.erase(iter);
>      return true;
>  }
>  
> @@ -211,7 +197,6 @@ void FileXferTask::success()
>  void FileXfer::handle_status(VDAgentFileXferStatusMessage* status)
>  {
>      FileXferTasks::iterator iter;
> -    FileXferTask* task;
>  
>      vd_printf("id %u result %u", status->id, status->result);
>      if (status->result != VD_AGENT_FILE_XFER_STATUS_CANCELLED) {
> @@ -223,9 +208,7 @@ void FileXfer::handle_status(VDAgentFileXferStatusMessage* status)
>          vd_printf("file id %u not found", status->id);
>          return;
>      }
> -    task = iter->second;
>      _tasks.erase(iter);
> -    delete task;
>  }
>  
>  bool FileXfer::dispatch(VDAgentMessage* msg, VDAgentFileXferStatusMessage* status)
> diff --git a/vdagent/file_xfer.h b/vdagent/file_xfer.h
> index 41f677a..b138019 100644
> --- a/vdagent/file_xfer.h
> +++ b/vdagent/file_xfer.h
> @@ -19,6 +19,7 @@
>  #define _H_FILE_XFER
>  
>  #include <map>
> +#include <memory>
>  #include "vdcommon.h"
>  
>  struct FileXferTask {
> @@ -40,7 +41,7 @@ struct FileXferTask {
>      void success();
>  };
>  
> -typedef std::map<uint32_t, FileXferTask*> FileXferTasks;
> +typedef std::map<uint32_t, std::shared_ptr<FileXferTask> > FileXferTasks;
>  
>  class FileXfer {
>  public:
> -- 
> 2.17.0
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20180528/f7964991/attachment.sig>


More information about the Spice-devel mailing list