AppendHelper.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Log / System / IO / Log / AppendHelper.cs / 1305376 / AppendHelper.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic; 
using System.Runtime.InteropServices;
 
namespace System.IO.Log 
{
    class AppendHelper : IDisposable 
    {
        SequenceNumber prev;
        SequenceNumber next;
        FileLogRecordHeader header; 
        UnmanagedBlob[] blobs;
        GCHandle[] handles; 
 
        public AppendHelper(IList> data,
                                SequenceNumber prev, 
                                SequenceNumber next,
                                bool restartArea)
        {
            this.prev = prev; 
            this.next = next;
 
            this.header = new FileLogRecordHeader(null); 
            this.header.IsRestartArea = restartArea;
            this.header.PreviousLsn = prev; 
            this.header.NextUndoLsn = next;

            this.blobs = new UnmanagedBlob[data.Count + 1];
            this.handles = new GCHandle[data.Count + 1]; 

            try 
            { 
                this.handles[0] = GCHandle.Alloc(header.Bits, GCHandleType.Pinned);
                this.blobs[0].cbSize = (uint)FileLogRecordHeader.Size; 
                this.blobs[0].pBlobData = Marshal.UnsafeAddrOfPinnedArrayElement(header.Bits, 0);

                for (int i = 0; i < data.Count; i++)
                { 
                    handles[i + 1] = GCHandle.Alloc(data[i].Array, GCHandleType.Pinned);
                    blobs[i + 1].cbSize = (uint)data[i].Count; 
                    blobs[i + 1].pBlobData = Marshal.UnsafeAddrOfPinnedArrayElement(data[i].Array, data[i].Offset); 
                }
            } 
            catch
            {
                Dispose();
                throw; 
            }
        } 
 
        public UnmanagedBlob[] Blobs
        { 
            get { return this.blobs; }
        }

        // Caller should always call Dispose.  Finalizer not implemented. 
        public void Dispose()
        { 
            try 
            {
                lock(this) 
                {
                    for (int i = 0; i < handles.Length; i++)
                    {
                        if (handles[i].IsAllocated) 
                            handles[i].Free();
                    } 
                } 
            }
            catch(InvalidOperationException exception) 
            {
                // This indicates something is broken in IO.Log's memory management,
                // so it's not safe to continue executing
                DiagnosticUtility.InvokeFinalHandler(exception); 
            }
        } 
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic; 
using System.Runtime.InteropServices;
 
namespace System.IO.Log 
{
    class AppendHelper : IDisposable 
    {
        SequenceNumber prev;
        SequenceNumber next;
        FileLogRecordHeader header; 
        UnmanagedBlob[] blobs;
        GCHandle[] handles; 
 
        public AppendHelper(IList> data,
                                SequenceNumber prev, 
                                SequenceNumber next,
                                bool restartArea)
        {
            this.prev = prev; 
            this.next = next;
 
            this.header = new FileLogRecordHeader(null); 
            this.header.IsRestartArea = restartArea;
            this.header.PreviousLsn = prev; 
            this.header.NextUndoLsn = next;

            this.blobs = new UnmanagedBlob[data.Count + 1];
            this.handles = new GCHandle[data.Count + 1]; 

            try 
            { 
                this.handles[0] = GCHandle.Alloc(header.Bits, GCHandleType.Pinned);
                this.blobs[0].cbSize = (uint)FileLogRecordHeader.Size; 
                this.blobs[0].pBlobData = Marshal.UnsafeAddrOfPinnedArrayElement(header.Bits, 0);

                for (int i = 0; i < data.Count; i++)
                { 
                    handles[i + 1] = GCHandle.Alloc(data[i].Array, GCHandleType.Pinned);
                    blobs[i + 1].cbSize = (uint)data[i].Count; 
                    blobs[i + 1].pBlobData = Marshal.UnsafeAddrOfPinnedArrayElement(data[i].Array, data[i].Offset); 
                }
            } 
            catch
            {
                Dispose();
                throw; 
            }
        } 
 
        public UnmanagedBlob[] Blobs
        { 
            get { return this.blobs; }
        }

        // Caller should always call Dispose.  Finalizer not implemented. 
        public void Dispose()
        { 
            try 
            {
                lock(this) 
                {
                    for (int i = 0; i < handles.Length; i++)
                    {
                        if (handles[i].IsAllocated) 
                            handles[i].Free();
                    } 
                } 
            }
            catch(InvalidOperationException exception) 
            {
                // This indicates something is broken in IO.Log's memory management,
                // so it's not safe to continue executing
                DiagnosticUtility.InvokeFinalHandler(exception); 
            }
        } 
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK