Boost logo

Boost :

Subject: Re: [boost] [rfc] rcpp
From: Ivan Sorokin (sorokin_at_[hidden])
Date: 2010-02-28 15:25:28


Daniel Trebbien wrote:
>> What kind of HANDLE that can be returned from DuplicateHandle should
>> not be disposed by CloseHandle?
> The only time I should call `CloseHandle` on the `HANDLE` result from
> `DuplicateHandle` is if the `DuplicateHandle` call succeeded. This is
> because the MSDN documentation does not assert that the `HANDLE`
> resulting from `DuplicateHandle` will never be `NULL` or
> `INVALID_HANDLE_VALUE`.
>
What do you think about the following functions?

rcpp::win::file_handle clone(rcpp::win::file_handle const & f)
{
   HANDLE h;
   BOOL r = ::DuplicateHandle(GetCurrentProcess(),
                              f.get(),
                              GetCurrentProcess(),
                              &h,
                              0,
                              FALSE,
                              DUPLICATE_SAME_ACCESS);

   if (r == FALSE)
      return rcpp::win::file_handle(); // or throw an exception

   return rcpp::win::file_handle(h);
}

rcpp::win::kernel_handle clone(rcpp::win::kernel_handle const & f)
{
   HANDLE h;
   BOOL r = ::DuplicateHandle(GetCurrentProcess(),
                              f.get(),
                              GetCurrentProcess(),
                              &h,
                              0,
                              FALSE,
                              DUPLICATE_SAME_ACCESS);

   if (r == FALSE)
      return rcpp::win::kernel_handle(); // or throw an exception

   return rcpp::win::kernel_handle(h);
}

>
>>> Also, I think that it would be nice to have a `shared_resource`
>>> template. I have an application in mind where I would like to create a
>>> shared `HANDLE` that is only closed if it is invalid and all
>>> references to it have been destroyed (a shared reference count reaches
>>> 0).
>> I thought about that. I don't think it has wide application. Moreover
>> it can be emulated with boost::shared_ptr<rcpp::resource>. Is it
>> worth while?
>
> I think so because `boost::shared_ptr` adds a level of indirection
> that is unnecessary.
I think that I can implement shared_resource if I is asked for that.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk