#include <df.h>


Definition at line 328 of file df.h.
Public Member Functions | |
| blk_DiskBufferWriter (df_BlockManager &a_mgr, const string &a_fName, const string &a_diskBufferFS, const ivd_FileSize_t a_diskBufferSize, bool a_append=false) | |
| virtual | ~blk_DiskBufferWriter () |
Private Member Functions | |
| virtual void | Seek (const UInt32_t a_offset) |
| Seek forward for the specified number of bytes. | |
| virtual void | Write (const UInt8_t *a_data, const UInt32_t a_size) |
| Write one block of data to disk buffer. | |
Private Attributes | |
| log_CLASSID_m | |
| cmn_File | m_diskBuffer |
| UInt32_t | m_seqNumber |
Static Private Attributes | |
| static UInt32_t | m_numActive = 0 |
| static cmn_Mutex | m_numActive_x |
| blk_DiskBufferWriter::blk_DiskBufferWriter | ( | df_BlockManager & | a_mgr, | |
| const string & | a_fName, | |||
| const string & | a_diskBufferFS, | |||
| const ivd_FileSize_t | a_diskBufferSize, | |||
| bool | a_append = false | |||
| ) |
Definition at line 40 of file blk_diskbufferwriter.cpp.
References fom_CREATE_NEW, fom_OPEN_ALWAYS, fom_WRITE, log_FUNC_A_m, m_diskBuffer, m_numActive, m_numActive_x, m_seqNumber, cmn_File::OpenF(), cmn_File::SeekEndF(), cmn_File::SeekF(), and cmn_File::TruncF().
00046 : blk_BufferWriter(a_mgr), 00047 m_diskBuffer(g_cmn.dirs.diskbuf + a_diskBufferFS + a_fName, a_diskBufferSize), 00048 m_seqNumber(0) { 00049 00050 log_FUNC_A_m(blk_DiskBufferWriter, 00051 "a_fName=" << a_fName << 00052 ", a_append=" << boolalpha << a_append << 00053 ", a_diskBufferSize=" << a_diskBufferSize); 00054 00055 if (a_append) { 00056 m_diskBuffer.OpenF(fom_WRITE | fom_OPEN_ALWAYS); 00057 m_diskBuffer.SeekEndF(); 00058 } 00059 else { 00060 m_diskBuffer.OpenF(fom_WRITE | fom_CREATE_NEW); 00061 if (a_diskBufferSize > 0) { 00062 // Bug 8451: when a new file is created and the m_fileSize is given, the fileSize 00063 // is set upfront and a seek is done to the end of the file. 00064 // This procedure improved performance on Windows 2003 00065 m_diskBuffer.TruncF(a_diskBufferSize); 00066 m_diskBuffer.SeekF(0); 00067 } 00068 } 00069 00070 cmn_MutexLock l(m_numActive_x); 00071 m_numActive++; 00072 m_seqNumber = m_numActive; 00073 }

| blk_DiskBufferWriter::~blk_DiskBufferWriter | ( | ) | [virtual] |
Definition at line 75 of file blk_diskbufferwriter.cpp.
References log_FUNC_m, m_numActive, and m_numActive_x.
00075 { 00076 log_FUNC_m(~blk_DiskBufferWriter); 00077 00078 cmn_MutexLock l(m_numActive_x); 00079 m_numActive--; 00080 }
| void blk_DiskBufferWriter::Seek | ( | const UInt32_t | a_offset | ) | [private, virtual] |
Seek forward for the specified number of bytes.
Used mainly to create sparse file if migration of a file is aborted.
Reimplemented from blk_BufferWriter.
Definition at line 86 of file blk_diskbufferwriter.cpp.
References dbg_DETAIL, log_DBG_m, log_FUNC_m, m_diskBuffer, and cmn_File::SeekRelF().
00086 { 00087 log_FUNC_m(Seek); 00088 00089 log_DBG_m(dbg_DETAIL, 00090 "Seek forward for " << (a_offset/1024) << " kiB."); 00091 00092 m_diskBuffer.SeekRelF(a_offset); 00093 }

| void blk_DiskBufferWriter::Write | ( | const UInt8_t * | a_data, | |
| const UInt32_t | a_size | |||
| ) | [private, virtual] |
Write one block of data to disk buffer.
Implements blk_BufferWriter.
Definition at line 98 of file blk_diskbufferwriter.cpp.
References cmn_ListDir(), dbg_DETAIL, cmn_File::GetCurrentPosF(), cmn_File::GetFullPathRef(), ie_NO_DISK_SPACE, ivd_Error, log_DBG_m, log_FUNC_m, log_WRN_m, m_diskBuffer, cmn_File::TruncF(), cmn_Path::UpPath(), and cmn_File::WriteF().
00098 { 00099 log_FUNC_m(Write); 00100 00101 // 00102 // Atomic append to the file. 00103 // TODO: Shall this functionality be moved to cmn_File? 00104 // 00105 00106 ivd_FileRetSize_t wrote; 00107 try { 00108 wrote = m_diskBuffer.WriteF(a_data, a_size); 00109 } 00110 catch (ivd_SysError) { 00111 cmn_FileInfo_t_v fileList_v; 00112 00113 cmn_Path dbPath = m_diskBuffer.GetFullPathRef().UpPath(); 00114 cmn_ListDir(dbPath, fileList_v); 00115 log_DBG_m(dbg_DETAIL, "Content of disk buffer: " << 00116 dbPath << 00117 fileList_v); 00118 throw; 00119 } 00120 00121 if (static_cast<UInt32_t>(wrote) < a_size) { 00122 log_WRN_m( 00123 "Writing failed. Truncating file to last full block: " << 00124 m_diskBuffer.GetFullPathRef() ); 00125 00126 ivd_FilePosition_t filePos = m_diskBuffer.GetCurrentPosF(); 00127 m_diskBuffer.TruncF(filePos - wrote); 00128 00129 throw ivd_Error(ie_NO_DISK_SPACE, "Disk buffer out of space."); 00130 } 00131 }

blk_DiskBufferWriter::log_CLASSID_m [private] |
cmn_File blk_DiskBufferWriter::m_diskBuffer [private] |
UInt32_t blk_DiskBufferWriter::m_numActive = 0 [static, private] |
Definition at line 346 of file df.h.
Referenced by blk_DiskBufferWriter(), and ~blk_DiskBufferWriter().
cmn_Mutex blk_DiskBufferWriter::m_numActive_x [static, private] |
Definition at line 347 of file df.h.
Referenced by blk_DiskBufferWriter(), and ~blk_DiskBufferWriter().
UInt32_t blk_DiskBufferWriter::m_seqNumber [private] |
1.5.6