#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/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;
class PPAPI_PROXY_EXPORT ResourceReplyThreadRegistrar
: public base::RefCountedThreadSafe<ResourceReplyThreadRegistrar> {
public:
explicit ResourceReplyThreadRegistrar(
scoped_refptr<base::SingleThreadTaskRunner> main_thread);
ResourceReplyThreadRegistrar(const ResourceReplyThreadRegistrar&) = delete;
ResourceReplyThreadRegistrar& operator=(const ResourceReplyThreadRegistrar&) =
delete;
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();
base::Lock lock_;
ResourceMap map_;
scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
};
}
}
#endif