summaryrefslogtreecommitdiffstats
path: root/chromeos/binder/remote_object.cc
blob: c00ba3fb46e5f80db1d7ea0501c77a1897fe55e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 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 "chromeos/binder/remote_object.h"

#include "base/location.h"
#include "base/thread_task_runner_handle.h"
#include "chromeos/binder/command_broker.h"

namespace binder {

RemoteObject::RemoteObject(CommandBroker* command_broker, int32_t handle)
    : release_closure_(command_broker->GetReleaseReferenceClosure(handle)),
      release_task_runner_(base::ThreadTaskRunnerHandle::Get()),
      handle_(handle) {
  command_broker->AddReference(handle_);
}

RemoteObject::~RemoteObject() {
  if (release_task_runner_->BelongsToCurrentThread()) {
    release_closure_.Run();
  } else {
    release_task_runner_->PostTask(FROM_HERE, release_closure_);
  }
}

Object::Type RemoteObject::GetType() const {
  return TYPE_REMOTE;
}

bool RemoteObject::Transact(CommandBroker* command_broker,
                            const TransactionData& data,
                            scoped_ptr<TransactionData>* reply) {
  return command_broker->Transact(handle_, data, reply);
}

}  // namespace binder