1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     os_SharedMemory.h
4   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law. They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10   $Rev: 24156 $
11  *---------------------------------------------------------------------------
12 
13 
14 */
15 
16 #ifndef NN_OS_OS_SHAREDMEMORY_H_
17 #define NN_OS_OS_SHAREDMEMORY_H_
18 
19 #include <nn/config.h>
20 #if NN_PLATFORM_HAS_MMU
21 
22 #include <nn/os/os_MemoryBlockBase.h>
23 #include <nn/os/os_HandleObject.h>
24 
25 #ifdef __cplusplus
26 
27 namespace nn{ namespace os{
28 
29     namespace detail
30     {
31         void InitializeSharedMemory();
32         uptr AllocateFromSharedMemorySpace(MemoryBlockBase* p, size_t s);
33         void FreeToSharedMemorySpace(MemoryBlockBase* p);
34     }
35 
36 class SharedMemoryBlock : public MemoryBlockBase, public HandleObject
37 {
38 public:
SharedMemoryBlock()39     SharedMemoryBlock() : m_SpaceAllocated(false) {}
40     explicit SharedMemoryBlock(size_t size, bool readOnly = false, bool otherReadOnly = false, bool noMap = false) { Initialize(size, otherReadOnly, readOnly, noMap); }
41 
42     void Initialize(size_t size, bool readOnly = false, bool otherReadOnly = false, bool noMap = false);
43 
44     Result TryInitialize(size_t size, bool readOnly = false, bool otherReadOnly = false, bool noMap = false);
45 
~SharedMemoryBlock()46     ~SharedMemoryBlock() { Finalize(); }
47 
48     void Finalize();
49 
50 
51 private:
52 
53     friend class HandleManager;
54 
55     void AttachAndMap(Handle handle, size_t size, bool readOnly);
56     void Map(size_t size, bool readOnly);
57     void Unmap(void);
58 
59 private:
60     bool    m_SpaceAllocated;
61     NN_PADDING3;
62     NN_PADDING4;
63 };
64 
65 }} // namespace nn::os
66 
67 #endif
68 
69 // C declarations follow
70 
71 #include <nn/util/detail/util_CLibImpl.h>
72 
73 NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(nnosSharedMemoryBlock, nn::os::SharedMemoryBlock, 32, u32);
74 NN_EXTERN_C void nnosSharedMemoryBlockAllocate(nnosSharedMemoryBlock* this_, size_t size, bool readOnly, bool otherReadOnly, bool noMap);
75 NN_EXTERN_C void nnosSharedMemoryBlockInitializeNoAllocate(nnosSharedMemoryBlock* this_);
76 NN_EXTERN_C void nnosSharedMemoryBlockFree(nnosSharedMemoryBlock* this_);
77 NN_EXTERN_C uptr nnosSharedMemoryBlockGetAddress(nnosSharedMemoryBlock* this_);
78 NN_EXTERN_C size_t nnosSharedMemoryBlockGetSize(nnosSharedMemoryBlock* this_);
79 NN_EXTERN_C bool nnosSharedMemoryBlockIsReadOnly(nnosSharedMemoryBlock* this_);
80 
81 #endif  // if NN_PLATFORM_HAS_MMU
82 #endif /* NN_OS_OS_SHAREDMEMORY_H_ */
83