// Copyright 2013 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.

#ifndef PPAPI_PROXY_RESOURCE_REPLY_THREAD_REGISTRAR_H_
#define PPAPI_PROXY_RESOURCE_REPLY_THREAD_REGISTRAR_H_

#include <stdint.h>

#include <map>
#include <set>

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/proxy/ppapi_proxy_export.h"


namespace base {
class SingleThreadTaskRunner;
}

namespace IPC {
class Message;
}

namespace ppapi {

class TrackedCallback;

namespace proxy {

class ResourceMessageReplyParams;

// ResourceReplyThreadRegistrar records the handling thread for
// PpapiPluginMsg_ResourceReply messages.
// This class is thread safe.
class PPAPI_PROXY_EXPORT ResourceReplyThreadRegistrar
    : public base::RefCountedThreadSafe<ResourceReplyThreadRegistrar> {
 public:
  explicit ResourceReplyThreadRegistrar(
      scoped_refptr<base::SingleThreadTaskRunner> main_thread);

  // This method can only be called while holding the Pepper proxy lock; the
  // other methods can be called with/without the Pepper proxy lock.
  void Register(PP_Resource resource,
                int32_t sequence_number,
                scoped_refptr<TrackedCallback> reply_thread_hint);
  void Unregister(PP_Resource resource);

  scoped_refptr<base::SingleThreadTaskRunner> GetTargetThread(
      const ResourceMessageReplyParams& reply_params,
      const IPC::Message& nested_msg);

 private:
  friend class base::RefCountedThreadSafe<ResourceReplyThreadRegistrar>;

  typedef std::map<int32_t, scoped_refptr<base::SingleThreadTaskRunner>>
      SequenceThreadMap;
  typedef std::map<PP_Resource, SequenceThreadMap> ResourceMap;

  ~ResourceReplyThreadRegistrar();

  // The lock that protects the data members below.
  // Please note that we should never try to acquire the Pepper proxy lock while
  // holding |lock_|, otherwise we will cause deadlock.
  base::Lock lock_;
  ResourceMap map_;
  scoped_refptr<base::SingleThreadTaskRunner> main_thread_;

  DISALLOW_COPY_AND_ASSIGN(ResourceReplyThreadRegistrar);
};

}  // namespace proxy
}  // namespace ppapi

#endif   // PPAPI_PROXY_RESOURCE_REPLY_THREAD_REGISTRAR_H_
