| Index: mojo/edk/system/parent_token_serializer_state_win.cc
|
| diff --git a/mojo/edk/system/parent_token_serializer_state_win.cc b/mojo/edk/system/parent_token_serializer_state_win.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ccd3cbe946f4da0e4df64358901d95534adc3551
|
| --- /dev/null
|
| +++ b/mojo/edk/system/parent_token_serializer_state_win.cc
|
| @@ -0,0 +1,75 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "mojo/edk/system/parent_token_serializer_state_win.h"
|
| +
|
| +#include "base/rand_util.h"
|
| +#include "mojo/edk/embedder/embedder_internal.h"
|
| +#include "mojo/edk/embedder/platform_channel_pair.h"
|
| +
|
| +namespace mojo {
|
| +namespace edk {
|
| +
|
| +ParentTokenSerializerState* ParentTokenSerializerState::GetInstance() {
|
| + return base::Singleton<
|
| + ParentTokenSerializerState,
|
| + base::LeakySingletonTraits<ParentTokenSerializerState>>::get();
|
| +}
|
| +
|
| +void ParentTokenSerializerState::CreatePlatformChannelPair(
|
| + ScopedPlatformHandle* server, ScopedPlatformHandle* client) {
|
| + PlatformChannelPair channel_pair;
|
| + *server = channel_pair.PassServerHandle();
|
| + *client = channel_pair.PassClientHandle();
|
| +}
|
| +
|
| +void ParentTokenSerializerState::HandleToToken(
|
| + const PlatformHandle* platform_handles,
|
| + size_t count,
|
| + uint64_t* tokens) {
|
| + base::AutoLock auto_locker(lock_);
|
| + for (size_t i = 0; i < count; ++i) {
|
| + if (platform_handles[i].is_valid()) {
|
| + uint64_t token;
|
| + do {
|
| + token = base::RandUint64();
|
| + } while (!token || token_map_.find(token) != token_map_.end());
|
| + tokens[i] = token;
|
| + token_map_[tokens[i]] = platform_handles[i].handle;
|
| + } else {
|
| + DLOG(WARNING) << "ParentTokenSerializerState got invalid handle.";
|
| + tokens[i] = 0;
|
| + }
|
| + }
|
| +}
|
| +
|
| +void ParentTokenSerializerState::TokenToHandle(
|
| + const uint64_t* tokens,
|
| + size_t count,
|
| + PlatformHandle* handles) {
|
| + base::AutoLock auto_locker(lock_);
|
| + for (size_t i = 0; i < count; ++i) {
|
| + auto it = token_map_.find(tokens[i]);
|
| + if (it == token_map_.end()) {
|
| + DLOG(WARNING) << "TokenToHandle didn't find token.";
|
| + } else {
|
| + handles[i].handle = it->second;
|
| + token_map_.erase(it);
|
| + }
|
| + }
|
| +}
|
| +
|
| +ParentTokenSerializerState::ParentTokenSerializerState()
|
| + : token_serialize_thread_("Token Serializer Watcher") {
|
| + base::Thread::Options options(base::MessageLoop::TYPE_IO, 0);
|
| + token_serialize_thread_.StartWithOptions(options);
|
| + DCHECK(!internal::g_token_serializer);
|
| + internal::g_token_serializer = this;
|
| +}
|
| +
|
| +ParentTokenSerializerState::~ParentTokenSerializerState() {
|
| +}
|
| +
|
| +} // namespace edk
|
| +} // namespace mojo
|
|
|