blob: e196ebde151479ee63db1356425d0d4305aa632b [file] [log] [blame]
// 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.
#include "content/child/quota_message_filter.h"
#include "content/child/quota_dispatcher.h"
#include "content/common/quota_messages.h"
namespace content {
QuotaMessageFilter::QuotaMessageFilter(ThreadSafeSender* thread_safe_sender)
: WorkerThreadMessageFilter(thread_safe_sender), next_request_id_(0) {
}
QuotaMessageFilter::~QuotaMessageFilter() {}
int QuotaMessageFilter::GenerateRequestID(int thread_id) {
base::AutoLock lock(request_id_map_lock_);
request_id_map_[next_request_id_] = thread_id;
return next_request_id_++;
}
void QuotaMessageFilter::ClearThreadRequests(int thread_id) {
base::AutoLock lock(request_id_map_lock_);
for (RequestIdToThreadId::iterator iter = request_id_map_.begin();
iter != request_id_map_.end();) {
if (iter->second == thread_id)
request_id_map_.erase(iter++);
else
iter++;
}
}
bool QuotaMessageFilter::ShouldHandleMessage(const IPC::Message& msg) const {
return IPC_MESSAGE_CLASS(msg) == QuotaMsgStart;
}
void QuotaMessageFilter::OnFilteredMessageReceived(const IPC::Message& msg) {
QuotaDispatcher::ThreadSpecificInstance(thread_safe_sender(), this)
->OnMessageReceived(msg);
}
bool QuotaMessageFilter::GetWorkerThreadIdForMessage(const IPC::Message& msg,
int* ipc_thread_id) {
int request_id = -1;
const bool success = base::PickleIterator(msg).ReadInt(&request_id);
DCHECK(success);
base::AutoLock lock(request_id_map_lock_);
RequestIdToThreadId::iterator found = request_id_map_.find(request_id);
if (found != request_id_map_.end()) {
*ipc_thread_id = found->second;
request_id_map_.erase(found);
return true;
}
return false;
}
} // namespace content