#pragma once /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "common/vsoc/lib/typed_region_view.h" namespace vsoc { /** * Adds methods to create file descriptor scoped permissions. Just like * TypedRegionView it can be directly constructed or subclassed. * * The Layout type must (in addition to requirements for TypedRegionView) also * provide a nested type for the layout of the managed region. */ template <typename View, typename Layout> class ManagerRegionView : public TypedRegionView<View, Layout> { public: ManagerRegionView() = default; /** * Creates a fd scoped permission on the managed region. * * The managed_region_fd is in/out parameter that can be a not yet open file * descriptor. If the fd is not open yet it will open the managed region * device and then create the permission. If the function returns EBUSY * (meaning that we lost the race to acquire the memory) the same fd can (and * is expected to) be used in a subsequent call to create a permission on * another memory location. * * On success returns an open fd with the requested permission asociated to * it. If another thread/process acquired ownership of *owner_ptr before this * one returns -EBUSY, returns a different negative number otherwise. */ int CreateFdScopedPermission(uint32_t* owner_ptr, uint32_t owned_val, uint32_t begin_offset, uint32_t end_offset) { return this->control_->CreateFdScopedPermission( Layout::ManagedRegion::region_name, this->pointer_to_region_offset(owner_ptr), owned_val, begin_offset, end_offset); } }; } // namespace vsoc