Home | History | Annotate | Download | only in embedder
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/edk/embedder/platform_handle.h"
      6 
      7 #include "build/build_config.h"
      8 #if defined(OS_POSIX)
      9 #include <unistd.h>
     10 #elif defined(OS_WIN)
     11 #include <windows.h>
     12 #else
     13 #error "Platform not yet supported."
     14 #endif
     15 
     16 #include "base/logging.h"
     17 
     18 namespace mojo {
     19 namespace edk {
     20 
     21 void PlatformHandle::CloseIfNecessary() {
     22   if (!is_valid())
     23     return;
     24 
     25 #if defined(OS_POSIX)
     26   if (type == Type::POSIX) {
     27     bool success = (close(handle) == 0);
     28     DPCHECK(success);
     29     handle = -1;
     30   }
     31 #if defined(OS_MACOSX) && !defined(OS_IOS)
     32   else if (type == Type::MACH) {
     33     kern_return_t rv = mach_port_deallocate(mach_task_self(), port);
     34     DPCHECK(rv == KERN_SUCCESS);
     35     port = MACH_PORT_NULL;
     36   }
     37 #endif  // defined(OS_MACOSX) && !defined(OS_IOS)
     38 #elif defined(OS_WIN)
     39   if (owning_process != base::GetCurrentProcessHandle()) {
     40     // This handle may have been duplicated to a new target process but not yet
     41     // sent there. In this case CloseHandle should NOT be called. From MSDN
     42     // documentation for DuplicateHandle[1]:
     43     //
     44     //    Normally the target process closes a duplicated handle when that
     45     //    process is finished using the handle. To close a duplicated handle
     46     //    from the source process, call DuplicateHandle with the following
     47     //    parameters:
     48     //
     49     //    * Set hSourceProcessHandle to the target process from the
     50     //      call that created the handle.
     51     //    * Set hSourceHandle to the duplicated handle to close.
     52     //    * Set lpTargetHandle to NULL.
     53     //    * Set dwOptions to DUPLICATE_CLOSE_SOURCE.
     54     //
     55     // [1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms724251
     56     //
     57     // NOTE: It's possible for this operation to fail if the owning process
     58     // was terminated or is in the process of being terminated. Either way,
     59     // there is nothing we can reasonably do about failure, so we ignore it.
     60     DuplicateHandle(owning_process, handle, NULL, &handle, 0, FALSE,
     61                     DUPLICATE_CLOSE_SOURCE);
     62     return;
     63   }
     64 
     65   bool success = !!CloseHandle(handle);
     66   DPCHECK(success);
     67   handle = INVALID_HANDLE_VALUE;
     68 #else
     69 #error "Platform not yet supported."
     70 #endif
     71 }
     72 
     73 }  // namespace edk
     74 }  // namespace mojo
     75