blk_DiskBufferWriter Class Reference
[IVD Data format.]

#include <df.h>

Inheritance diagram for blk_DiskBufferWriter:

Inheritance graph
[legend]
Collaboration diagram for blk_DiskBufferWriter:

Collaboration graph
[legend]

List of all members.


Detailed Description

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

Constructor & Destructor Documentation

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 }

Here is the call graph for this function:

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 }


Member Function Documentation

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:


Member Data Documentation

Reimplemented from blk_BufferWriter.

Definition at line 343 of file df.h.

Definition at line 345 of file df.h.

Referenced by blk_DiskBufferWriter(), Seek(), and Write().

Definition at line 346 of file df.h.

Referenced by blk_DiskBufferWriter(), and ~blk_DiskBufferWriter().

Definition at line 347 of file df.h.

Referenced by blk_DiskBufferWriter(), and ~blk_DiskBufferWriter().

Definition at line 349 of file df.h.

Referenced by blk_DiskBufferWriter().


The documentation for this class was generated from the following files:

Generated on Mon Feb 27 19:02:03 2012 for OPENARCHIVE by  doxygen 1.5.6