00001 /* 00002 * Copyright (C) 2009, Edmundo Albuquerque de Souza e Silva. 00003 * 00004 * This file may be distributed under the terms of the Q Public License 00005 * as defined by Trolltech AS of Norway and appearing in the file 00006 * LICENSE.QPL included in the packaging of this file. 00007 * 00008 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING 00009 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00010 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00012 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00013 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00014 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 00015 * 00016 */ 00017 00018 /////////////////////////////////////////////////////////////////////////////// 00019 // buffer.cpp : Implementation of buffer manager 00020 /////////////////////////////////////////////////////////////////////////////// 00021 00022 #include <buffer.h> 00023 #include <sserror.h> 00024 #include <new> 00025 00026 #include <fstream> 00027 #include <iostream> 00028 00029 #include "../interface/RioError.h" 00030 00031 using namespace std; 00032 00033 //////////////////////////// CBufferManager ////////////////////////////////// 00034 00035 /////////////////////////////////////////////////////////////////////////////// 00036 CBufferManager::CBufferManager() 00037 { 00038 m_Buffer = 0; 00039 m_Data = NULL; 00040 } 00041 00042 CBufferManager::~CBufferManager() 00043 { 00044 if(m_Buffer != 0) 00045 { 00046 delete[] m_Buffer; 00047 } 00048 if(m_Data != 0) 00049 { 00050 delete[] m_Data; 00051 } 00052 } 00053 00054 /////////////////////////////////////////////////////////////////////////////// 00055 int CBufferManager::Initialize( const unsigned int nBuffer, 00056 const unsigned int BufferSize) 00057 { 00058 // In case was initialized before 00059 if(m_Buffer != 0) 00060 { 00061 delete[] m_Buffer; 00062 m_Buffer = 0; 00063 } 00064 if(m_Data != 0) 00065 { 00066 delete[] m_Data; 00067 m_Data = 0; 00068 } 00069 00070 m_Buffer = new StrBuffer[nBuffer]; 00071 if(m_Buffer == 0) 00072 return ERROR_SS_MEMORY; 00073 00074 //m_Data = new char[nBuffer*BufferSize]; 00075 char *Data; 00076 try { 00077 Data = new char[nBuffer*BufferSize]; 00078 }catch( bad_alloc Data) 00079 { 00080 RioErr << "Could not allocate memory ( " 00081 << nBuffer*BufferSize << " bytes )!" <<endl; 00082 return ERROR_SS_MEMORY; 00083 }; 00084 00085 m_Data = Data; 00086 // ------------------------------------------------------------------------ 00087 00088 if(m_Data == 0) 00089 { 00090 delete[] m_Buffer; 00091 return ERROR_SS_MEMORY; 00092 } 00093 00094 for(int i= ((int)(nBuffer))-1; i>=0; i--) 00095 { 00096 m_Buffer[i].Data = &m_Data[i*BufferSize]; 00097 m_FreeList.Free((RioQueueEle*)&m_Buffer[i]); 00098 } 00099 00100 return (0); 00101 } 00102 00103 /////////////////////////////////////////////////////////////////////////////// 00104 // Free --Return Buffer to free list 00105 void CBufferManager::Free(StrBuffer* Buffer) 00106 { 00107 m_FreeList.Free( (RioQueueEle*)Buffer); 00108 } 00109 00110 /////////////////////////////////////////////////////////////////////////////// 00111 // New -- Get new buffer structure from free list if available, otherwise 00112 // return null 00113 StrBuffer* CBufferManager::New() 00114 { 00115 return (StrBuffer*) m_FreeList.GetNB(); 00116 } 00117