// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/shared_impl/vpn_provider_util.h"
#include "base/check.h"
#include "base/notreached.h"
namespace ppapi {
VpnProviderSharedBuffer::VpnProviderSharedBuffer(
uint32_t capacity,
uint32_t packet_size,
base::UnsafeSharedMemoryRegion shm,
base::WritableSharedMemoryMapping mapping)
: capacity_(capacity),
max_packet_size_(packet_size),
shm_(std::move(shm)),
shm_mapping_(std::move(mapping)),
available_(capacity, true) {
DCHECK(shm_.IsValid() && shm_mapping_.IsValid());
}
VpnProviderSharedBuffer::~VpnProviderSharedBuffer() {}
bool VpnProviderSharedBuffer::GetAvailable(uint32_t* id) {
for (uint32_t i = 0; i < capacity_; i++) {
if (available_[i]) {
if (id) {
*id = i;
}
return true;
}
}
return false;
}
void VpnProviderSharedBuffer::SetAvailable(uint32_t id, bool value) {
if (id >= capacity_) {
NOTREACHED();
}
available_[id] = value;
}
void* VpnProviderSharedBuffer::GetBuffer(uint32_t id) {
if (id >= capacity_) {
NOTREACHED();
}
return shm_mapping_.GetMemoryAsSpan<char>()
.subspan(max_packet_size_ * id)
.data();
}
base::UnsafeSharedMemoryRegion VpnProviderSharedBuffer::DuplicateRegion()
const {
return shm_.Duplicate();
}
} // namespace ppapi