1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
/****************************************************************************
* *
* PrimeSense Sensor 5.x Alpha *
* Copyright (C) 2011 PrimeSense Ltd. *
* *
* This file is part of PrimeSense Sensor. *
* *
* PrimeSense Sensor is free software: you can redistribute it and/or modify*
* it under the terms of the GNU Lesser General Public License as published *
* by the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* PrimeSense Sensor is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with PrimeSense Sensor. If not, see <http://www.gnu.org/licenses/>.*
* *
****************************************************************************/
//---------------------------------------------------------------------------
// Includes
//---------------------------------------------------------------------------
#include "XnSharedMemoryBufferPool.h"
//---------------------------------------------------------------------------
// Code
//---------------------------------------------------------------------------
XnSharedMemoryBufferPool::XnSharedMemoryBufferPool(XnUInt32 nBufferCount, const XnChar* strDeviceName, const XnChar* strStreamName, XnUInt32 nMaxBufferSize, XnBool bAllowOtherUsers) :
XnBufferPool(nBufferCount),
m_nMaxBufferSize(nMaxBufferSize),
m_bAllowOtherUsers(bAllowOtherUsers),
m_hSharedMemory(NULL),
m_pSharedMemoryAddress(NULL)
{
// to make the name unique, we'll add process ID
XN_PROCESS_ID procID;
xnOSGetCurrentProcessID(&procID);
sprintf(m_strName, "%u_%s_%s", (XnUInt32)procID, strDeviceName, strStreamName);
}
XnSharedMemoryBufferPool::~XnSharedMemoryBufferPool()
{
XnSharedMemoryBufferPool::Free();
}
XnStatus XnSharedMemoryBufferPool::AllocateBuffers()
{
XnStatus nRetVal = XN_STATUS_OK;
if (m_nBufferSize > m_nMaxBufferSize)
{
return XN_STATUS_ALLOC_FAILED;
}
if (m_pSharedMemoryAddress != NULL)
{
// already allocated. nothing to do here
return (XN_STATUS_OK);
}
// first time. allocate shared memory
XnUInt32 nTotalSize = m_nMaxBufferSize * m_nBufferCount;
nRetVal = xnOSCreateSharedMemoryEx(m_strName, nTotalSize, XN_OS_FILE_READ | XN_OS_FILE_WRITE, m_bAllowOtherUsers, &m_hSharedMemory);
XN_IS_STATUS_OK(nRetVal);
void* pAddress;
nRetVal = xnOSSharedMemoryGetAddress(m_hSharedMemory, &pAddress);
if (nRetVal != XN_STATUS_OK)
{
xnOSCloseSharedMemory(m_hSharedMemory);
m_hSharedMemory = NULL;
return (nRetVal);
}
m_pSharedMemoryAddress = (XnUChar*)pAddress;
// now allocate buffers
for (XnUInt32 i = 0; i < m_nBufferCount; ++i)
{
XnBufferInPool* pBuffer = XN_NEW(XnBufferInPool);
if (pBuffer == NULL)
{
Free();
return (XN_STATUS_ALLOC_FAILED);
}
pBuffer->m_nID = i;
pBuffer->SetExternalBuffer(m_pSharedMemoryAddress + i*m_nMaxBufferSize, m_nMaxBufferSize);
xnDumpFileWriteString(Dump(), "Allocated buffer %u with size %u\n", i, m_nMaxBufferSize);
// add it to free list
m_AllBuffers.AddLast(pBuffer);
m_FreeBuffers.AddLast(pBuffer);
}
return (XN_STATUS_OK);
}
void XnSharedMemoryBufferPool::DestroyBuffer(XnBufferInPool* pBuffer)
{
// simply add it back to free list
m_FreeBuffers.AddLast(pBuffer);
}
void XnSharedMemoryBufferPool::Free()
{
if (m_hSharedMemory != NULL)
{
xnOSCloseSharedMemory(m_hSharedMemory);
m_hSharedMemory = NULL;
}
for (XnBuffersList::Iterator it = m_AllBuffers.begin(); it != m_AllBuffers.end(); ++it)
{
XnBufferInPool* pBuffer = *it;
XN_DELETE(pBuffer);
}
m_AllBuffers.Clear();
m_FreeBuffers.Clear();
XnBufferPool::Free();
}
|