25 template <
class TYPE>
void DataStreamer::PushData(
const std::string &sItemName,
26 const TYPE *pData,
unsigned int nCount)
31 throw yat::Exception(
"ERROR",
"Can't write 0 item!!!",
"DataStreamer::PushData");
34 yat::AutoMutex<> _lock(m_mtxLock);
36 DataItemInfo& ItemInfo = GetDataItemInfo(sItemName);
37 NX_DBG(
"Item: " << sItemName <<
" : " << nCount);
39 bool bContinue =
true;
40 TYPE *pToPush = (TYPE *)pData;
41 std::size_t nToPush = nCount;
45 if( !PrivIsBufferOpen() )
51 if(
NX_NONE == ItemInfo.ptrDatasetWriter->DataType() )
52 ItemInfo.ptrDatasetWriter->SetDataType<TYPE>();
54 std::size_t nPush = 0;
56 if( ItemInfo.mbPendingData.is_empty() && nToPush > 0 )
59 std::size_t uiCurrentBufferPushedData = ItemInfo.uiPushCount - (m_nBufferCount * m_cfg.buffer_size);
60 if( uiCurrentBufferPushedData + nToPush <= m_cfg.buffer_size )
66 nPush = m_cfg.buffer_size - uiCurrentBufferPushedData;
71 NX_DBG(
"Push " << nPush <<
" / " << nToPush);
74 if( nPush == nCount && ItemInfo.ptrDatasetWriter->DataItemShape().size() >= 1 )
76 PrivPushDataItems(ItemInfo, pToPush, nPush,
true);
80 PrivPushDataItems(ItemInfo, pToPush, nPush,
false);
84 if( nPush < nToPush && PrivIsBufferOpen() )
87 std::size_t nPendingData = nToPush - nPush;
88 NX_DBG(
"Add pending data: " << nPendingData <<
" items.");
89 char *pToStore = (
char *)pData + (nPush * ItemInfo.ptrDatasetWriter->DataItemSize());
90 ItemInfo.mbPendingData.put_bloc(pToStore, nPendingData * ItemInfo.ptrDatasetWriter->DataItemSize());
91 ItemInfo.nPendingData += nPendingData;
95 else if( ItemInfo.mbPendingData.is_empty() )
104 if(
false == ItemInfo.mbPendingData.is_empty() && PrivIsBufferOpen() )
107 NX_DBG(
"There is pending data but buffer cannot be closed");
116 template <
class TYPE>
void DataStreamer::PushAxisData(
const std::string &sName, TYPE TValue)
118 DataStreamer::PushData(sName, &TValue);
#define NX_SCOPE_DBG(s)
Definition: nxdebug.h:77
#define NX_DBG(s)
Definition: nxdebug.h:76