[Lldb-commits] [lldb] r219145 - Create a ConnectionGenericFile class for Windows.
Zachary Turner
zturner at google.com
Wed Oct 22 11:02:22 PDT 2014
Looks fine, thanks for the fix.
On Wed, Oct 22, 2014 at 9:30 AM, Abid, Hafiz <Hafiz_Abid at mentor.com> wrote:
> Hi Zachary,
> Some 'goto' jumps over local variable with initialization in
> ConnectionGenericFileWindows.cpp.
> I think this makes the code ill-formed as per C++ standard 6.7.3. I have
> attached a simple
> fix for it. Please let me know if you see a problem with it. Otherwise I
> will apply it later today.
>
> Thanks,
> Abid
>
> > -----Original Message-----
> > From: lldb-commits-bounces at cs.uiuc.edu [mailto:lldb-commits-
> > bounces at cs.uiuc.edu] On Behalf Of Zachary Turner
> > Sent: 06 October 2014 22:23
> > To: lldb-commits at cs.uiuc.edu
> > Subject: [Lldb-commits] [lldb] r219145 - Create a ConnectionGenericFile
> class
> > for Windows.
> >
> > Author: zturner
> > Date: Mon Oct 6 16:23:09 2014
> > New Revision: 219145
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=219145&view=rev
> > Log:
> > Create a ConnectionGenericFile class for Windows.
> >
> > This is the first step in getting ConnectionFileDescriptor ported to
> Windows.
> > It implements a connection against a disk file for windows. This supports
> > connection strings of the form file://PATH which are currently supported
> > only on posix platforms in ConnectionFileDescriptor.
> >
> > Reviewed by: Greg Clayton
> > Differential Revision: http://reviews.llvm.org/D5608
> >
> > Added:
> > lldb/trunk/include/lldb/Host/windows/ConnectionGenericFileWindows.h
> > lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp
> > Modified:
> > lldb/trunk/include/lldb/Core/Connection.h
> > lldb/trunk/include/lldb/lldb-types.h
> > lldb/trunk/source/API/SBCommunication.cpp
> > lldb/trunk/source/Core/Connection.cpp
> > lldb/trunk/source/Host/CMakeLists.txt
> >
> > Modified: lldb/trunk/include/lldb/Core/Connection.h
> > URL: http://llvm.org/viewvc/llvm-
> > project/lldb/trunk/include/lldb/Core/Connection.h?rev=219145&r1=219144
> > &r2=219145&view=diff
> > ================================================================
> > ==============
> > --- lldb/trunk/include/lldb/Core/Connection.h (original)
> > +++ lldb/trunk/include/lldb/Core/Connection.h Mon Oct 6 16:23:09 2014
> > @@ -46,6 +46,8 @@ public:
> > virtual
> > ~Connection ();
> >
> > + static Connection *CreateDefaultConnection(const char *url);
> > +
> > //------------------------------------------------------------------
> > /// Connect using the connect string \a url.
> > ///
> >
> > Added:
> > lldb/trunk/include/lldb/Host/windows/ConnectionGenericFileWindows.h
> > URL: http://llvm.org/viewvc/llvm-
> > project/lldb/trunk/include/lldb/Host/windows/ConnectionGenericFileWindo
> > ws.h?rev=219145&view=auto
> > ================================================================
> > ==============
> > --- lldb/trunk/include/lldb/Host/windows/ConnectionGenericFileWindows.h
> > (added)
> > +++
> > lldb/trunk/include/lldb/Host/windows/ConnectionGenericFileWindows.h
> > +++ Mon Oct 6 16:23:09 2014
> > @@ -0,0 +1,64 @@
> > +//===-- ConnectionGenericFileWindows.h --------------------------*- C++
> > +-*-===// //
> > +// The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open
> > +Source // License. See LICENSE.TXT for details.
> > +//
> > +//===------------------------------------------------------------------
> > +----===//
> > +
> > +#ifndef liblldb_Host_windows_ConnectionGenericFileWindows_h_
> > +#define liblldb_Host_windows_ConnectionGenericFileWindows_h_
> > +
> > +#include "lldb/Core/Connection.h"
> > +#include "lldb/Host/windows/windows.h"
> > +#include "lldb/lldb-types.h"
> > +
> > +namespace lldb_private
> > +{
> > +
> > +class Error;
> > +
> > +class ConnectionGenericFile : public lldb_private::Connection {
> > + public:
> > + ConnectionGenericFile();
> > +
> > + ConnectionGenericFile(lldb::file_t file, bool owns_file);
> > +
> > + virtual ~ConnectionGenericFile();
> > +
> > + virtual bool IsConnected() const;
> > +
> > + virtual lldb::ConnectionStatus Connect(const char *s, Error
> > + *error_ptr);
> > +
> > + virtual lldb::ConnectionStatus Disconnect(Error *error_ptr);
> > +
> > + virtual size_t Read(void *dst, size_t dst_len, uint32_t
> > + timeout_usec, lldb::ConnectionStatus &status, Error *error_ptr);
> > +
> > + virtual size_t Write(const void *src, size_t src_len,
> > + lldb::ConnectionStatus &status, Error *error_ptr);
> > +
> > + bool InterruptRead();
> > +
> > + protected:
> > + OVERLAPPED m_overlapped;
> > + HANDLE m_file;
> > + HANDLE m_event_handles[2];
> > + bool m_owns_file;
> > + LARGE_INTEGER m_file_position;
> > +
> > + enum
> > + {
> > + kBytesAvailableEvent,
> > + kInterruptEvent
> > + };
> > +
> > + private:
> > + void InitializeEventHandles();
> > + void IncrementFilePointer(DWORD amount);
> > +
> > + DISALLOW_COPY_AND_ASSIGN(ConnectionGenericFile);
> > +};
> > +}
> > +
> > +#endif
> >
> > Modified: lldb/trunk/include/lldb/lldb-types.h
> > URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-
> > types.h?rev=219145&r1=219144&r2=219145&view=diff
> > ================================================================
> > ==============
> > --- lldb/trunk/include/lldb/lldb-types.h (original)
> > +++ lldb/trunk/include/lldb/lldb-types.h Mon Oct 6 16:23:09 2014
> > @@ -51,6 +51,9 @@ namespace lldb
> > typedef void* rwlock_t;
> > typedef void* process_t; // Process
> type is HANDLE
> > typedef void* thread_t; // Host
> thread type
> > + typedef void* file_t; // Host
> file type
> > + typedef void* pipe_t; // Host
> pipe type
> > + typedef unsigned int __w64 socket_t; // Host
> socket type
> > typedef uint32_t thread_key_t;
> > typedef void* thread_arg_t; // Host
> thread argument
> > type
> > typedef unsigned thread_result_t; // Host
> thread result type
> > @@ -71,6 +74,9 @@ namespace lldb
> > typedef pthread_rwlock_t rwlock_t;
> > typedef uint64_t process_t; // Process
> type is just a pid.
> > typedef pthread_t thread_t; // Host
> thread type
> > + typedef int file_t; // Host
> file type
> > + typedef int pipe_t; // Host
> pipe type
> > + typedef int socket_t; // Host
> socket type
> > typedef pthread_key_t thread_key_t;
> > typedef void * thread_arg_t; // Host
> thread argument
> > type
> > typedef void * thread_result_t; // Host
> thread result type
> >
> > Modified: lldb/trunk/source/API/SBCommunication.cpp
> > URL: http://llvm.org/viewvc/llvm-
> > project/lldb/trunk/source/API/SBCommunication.cpp?rev=219145&r1=21914
> > 4&r2=219145&view=diff
> > ================================================================
> > ==============
> > --- lldb/trunk/source/API/SBCommunication.cpp (original)
> > +++ lldb/trunk/source/API/SBCommunication.cpp Mon Oct 6 16:23:09 2014
> > @@ -71,7 +71,7 @@ SBCommunication::Connect (const char *ur
> > if (m_opaque)
> > {
> > if (!m_opaque->HasConnection ())
> > - m_opaque->SetConnection (new ConnectionFileDescriptor());
> > +
> > + m_opaque->SetConnection(Connection::CreateDefaultConnection(url));
> > return m_opaque->Connect (url, NULL);
> > }
> > return eConnectionStatusNoConnection;
> >
> > Modified: lldb/trunk/source/Core/Connection.cpp
> > URL: http://llvm.org/viewvc/llvm-
> > project/lldb/trunk/source/Core/Connection.cpp?rev=219145&r1=219144&r2
> > =219145&view=diff
> > ================================================================
> > ==============
> > --- lldb/trunk/source/Core/Connection.cpp (original)
> > +++ lldb/trunk/source/Core/Connection.cpp Mon Oct 6 16:23:09 2014
> > @@ -13,6 +13,12 @@
> > // Project includes
> > #include "lldb/Core/Connection.h"
> >
> > +#if defined(_WIN32)
> > +#include "lldb/Host/windows/ConnectionGenericFileWindows.h"
> > +#endif
> > +
> > +#include "lldb/Host/ConnectionFileDescriptor.h"
> > +
> > using namespace lldb_private;
> >
> > Connection::Connection ()
> > @@ -22,3 +28,13 @@ Connection::Connection () Connection::~Connection ()
> > { }
> > +
> > +Connection *
> > +Connection::CreateDefaultConnection(const char *url) { #if
> > +defined(_WIN32)
> > + if (strstr(url, "file://") == url)
> > + return new ConnectionGenericFile(); #endif
> > + return new ConnectionFileDescriptor(); }
> >
> > Modified: lldb/trunk/source/Host/CMakeLists.txt
> > URL: http://llvm.org/viewvc/llvm-
> > project/lldb/trunk/source/Host/CMakeLists.txt?rev=219145&r1=219144&r2=
> > 219145&view=diff
> > ================================================================
> > ==============
> > --- lldb/trunk/source/Host/CMakeLists.txt (original)
> > +++ lldb/trunk/source/Host/CMakeLists.txt Mon Oct 6 16:23:09 2014
> > @@ -40,6 +40,7 @@ add_host_subdirectory(posix if
> > (CMAKE_SYSTEM_NAME MATCHES "Windows")
> > add_host_subdirectory(windows
> > windows/Condition.cpp
> > + windows/ConnectionGenericFileWindows.cpp
> > windows/EditLineWin.cpp
> > windows/FileSystem.cpp
> > windows/Host.cpp
> >
> > Added:
> > lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp
> > URL: http://llvm.org/viewvc/llvm-
> > project/lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cp
> > p?rev=219145&view=auto
> > ================================================================
> > ==============
> > --- lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp
> > (added)
> > +++ lldb/trunk/source/Host/windows/ConnectionGenericFileWindows.cpp
> > Mon
> > +++ Oct 6 16:23:09 2014
> > @@ -0,0 +1,337 @@
> > +//===-- ConnectionGenericFileWindows.cpp ------------------------*- C++
> > +-*-===// //
> > +// The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open
> > +Source // License. See LICENSE.TXT for details.
> > +//
> > +//===------------------------------------------------------------------
> > +----===//
> > +
> > +#include "lldb/Core/Error.h"
> > +#include "lldb/Core/Log.h"
> > +#include "lldb/Host/TimeValue.h"
> > +#include "lldb/Host/windows/ConnectionGenericFileWindows.h"
> > +
> > +#include "llvm/ADT/STLExtras.h"
> > +#include "llvm/ADT/StringRef.h"
> > +
> > +using namespace lldb;
> > +using namespace lldb_private;
> > +
> > +namespace
> > +{
> > +// This is a simple helper class to package up the information needed
> > +to return from a Read/Write // operation function. Since there is alot
> > +of code to be run before exit regardless of whether the // operation
> > +succeeded or failed, combined with many possible return paths, this is
> the
> > cleanest // way to represent it.
> > +class ReturnInfo
> > +{
> > + public:
> > + void
> > + Set(size_t bytes, ConnectionStatus status, DWORD error_code)
> > + {
> > + m_error.SetError(error_code, eErrorTypeWin32);
> > + m_bytes = bytes;
> > + m_status = status;
> > + }
> > +
> > + void
> > + Set(size_t bytes, ConnectionStatus status, llvm::StringRef
> error_msg)
> > + {
> > + m_error.SetErrorString(error_msg.data());
> > + m_bytes = bytes;
> > + m_status = status;
> > + }
> > +
> > + size_t
> > + GetBytes() const
> > + {
> > + return m_bytes;
> > + }
> > + ConnectionStatus
> > + GetStatus() const
> > + {
> > + return m_status;
> > + }
> > + const Error &
> > + GetError() const
> > + {
> > + return m_error;
> > + }
> > +
> > + private:
> > + Error m_error;
> > + size_t m_bytes;
> > + ConnectionStatus m_status;
> > +};
> > +}
> > +
> > +ConnectionGenericFile::ConnectionGenericFile()
> > + : m_file(INVALID_HANDLE_VALUE)
> > + , m_owns_file(false)
> > +{
> > + ::ZeroMemory(&m_overlapped, sizeof(m_overlapped));
> > + ::ZeroMemory(&m_file_position, sizeof(m_file_position));
> > + InitializeEventHandles();
> > +}
> > +
> > +ConnectionGenericFile::ConnectionGenericFile(lldb::file_t file, bool
> > owns_file)
> > + : m_file(file)
> > + , m_owns_file(owns_file)
> > +{
> > + ::ZeroMemory(&m_overlapped, sizeof(m_overlapped));
> > + ::ZeroMemory(&m_file_position, sizeof(m_file_position));
> > + InitializeEventHandles();
> > +}
> > +
> > +ConnectionGenericFile::~ConnectionGenericFile()
> > +{
> > + if (m_owns_file && IsConnected())
> > + ::CloseHandle(m_file);
> > +
> > + ::CloseHandle(m_event_handles[kBytesAvailableEvent]);
> > + ::CloseHandle(m_event_handles[kInterruptEvent]);
> > +}
> > +
> > +void
> > +ConnectionGenericFile::InitializeEventHandles()
> > +{
> > + m_event_handles[kInterruptEvent] = CreateEvent(NULL, FALSE, FALSE,
> > +NULL);
> > +
> > + // Note, we should use a manual reset event for the hEvent argument
> of
> > the OVERLAPPED. This
> > + // is because both WaitForMultipleObjects and GetOverlappedResult
> (if
> > you set the bWait
> > + // argument to TRUE) will wait for the event to be signalled. If
> we use an
> > auto-reset event,
> > + // WaitForMultipleObjects will reset the event, return
> successfully, and
> > then
> > + // GetOverlappedResult will block since the event is no longer
> signalled.
> > + m_event_handles[kBytesAvailableEvent] = ::CreateEvent(NULL, TRUE,
> > +FALSE, NULL); }
> > +
> > +bool
> > +ConnectionGenericFile::IsConnected() const {
> > + return m_file && (m_file != INVALID_HANDLE_VALUE); }
> > +
> > +lldb::ConnectionStatus
> > +ConnectionGenericFile::Connect(const char *s, Error *error_ptr) {
> > + Log
> > *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION));
> > + if (log)
> > + log->Printf("%p ConnectionGenericFile::Connect (url = '%s')",
> > +static_cast<void *>(this), s);
> > +
> > + if (strstr(s, "file://") != s)
> > + {
> > + if (error_ptr)
> > + error_ptr->SetErrorStringWithFormat("unsupported connection
> URL:
> > '%s'", s);
> > + return eConnectionStatusError;
> > + }
> > +
> > + if (IsConnected())
> > + {
> > + ConnectionStatus status = Disconnect(error_ptr);
> > + if (status != eConnectionStatusSuccess)
> > + return status;
> > + }
> > +
> > + // file://PATH
> > + const char *path = s + strlen("file://");
> > + // Open the file for overlapped access. If it does not exist,
> create it. We
> > open it overlapped
> > + // so that we can issue asynchronous reads and then use
> > WaitForMultipleObjects to allow the read
> > + // to be interrupted by an event object.
> > + m_file = ::CreateFile(path, GENERIC_READ | GENERIC_WRITE,
> > FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
> > + if (m_file == INVALID_HANDLE_VALUE)
> > + {
> > + if (error_ptr)
> > + error_ptr->SetError(::GetLastError(), eErrorTypeWin32);
> > + return eConnectionStatusError;
> > + }
> > +
> > + m_owns_file = true;
> > + return eConnectionStatusSuccess;
> > +}
> > +
> > +lldb::ConnectionStatus
> > +ConnectionGenericFile::Disconnect(Error *error_ptr) {
> > + Log
> > *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION));
> > + if (log)
> > + log->Printf("%p ConnectionGenericFile::Disconnect (url =
> > +'%s')", static_cast<void *>(this), s);
> > +
> > + if (!IsConnected())
> > + return eConnectionStatusSuccess;
> > +
> > + // Reset the handle so that after we unblock any pending reads,
> > subsequent calls to Read() will
> > + // see a disconnected state.
> > + HANDLE old_file = m_file;
> > + m_file = INVALID_HANDLE_VALUE;
> > +
> > + // Set the disconnect event so that any blocking reads unblock, then
> > cancel any pending IO operations.
> > + ::CancelIoEx(old_file, &m_overlapped);
> > +
> > + // Close the file handle if we owned it, but don't close the event
> handles.
> > We could always
> > + // reconnect with the same Connection instance.
> > + if (m_owns_file)
> > + ::CloseHandle(old_file);
> > +
> > + ::ZeroMemory(&m_file_position, sizeof(m_file_position));
> > + m_owns_file = false;
> > + return eConnectionStatusSuccess;
> > +}
> > +
> > +size_t
> > +ConnectionGenericFile::Read(void *dst, size_t dst_len, uint32_t
> > +timeout_usec, lldb::ConnectionStatus &status, Error *error_ptr) {
> > + ReturnInfo return_info;
> > +
> > + if (error_ptr)
> > + error_ptr->Clear();
> > +
> > + if (!IsConnected())
> > + {
> > + return_info.Set(0, eConnectionStatusNoConnection,
> > ERROR_INVALID_HANDLE);
> > + goto finish;
> > + }
> > +
> > + m_overlapped.hEvent = m_event_handles[kBytesAvailableEvent];
> > +
> > + BOOL result = ::ReadFile(m_file, dst, dst_len, NULL, &m_overlapped);
> > + if (result || ::GetLastError() == ERROR_IO_PENDING)
> > + {
> > + if (!result)
> > + {
> > + // The expected return path. The operation is pending.
> Wait for
> > the operation to complete
> > + // or be interrupted.
> > + TimeValue time_value;
> > + time_value.OffsetWithMicroSeconds(timeout_usec);
> > + DWORD milliseconds = time_value.milliseconds();
> > + result =
> > ::WaitForMultipleObjects(llvm::array_lengthof(m_event_handles),
> > m_event_handles, FALSE, milliseconds);
> > + // All of the events are manual reset events, so make sure
> we reset
> > them to non-signalled.
> > + switch (result)
> > + {
> > + case WAIT_OBJECT_0 + kBytesAvailableEvent:
> > + break;
> > + case WAIT_OBJECT_0 + kInterruptEvent:
> > + return_info.Set(0, eConnectionStatusInterrupted, 0);
> > + goto finish;
> > + case WAIT_TIMEOUT:
> > + return_info.Set(0, eConnectionStatusTimedOut, 0);
> > + goto finish;
> > + case WAIT_FAILED:
> > + return_info.Set(0, eConnectionStatusError,
> ::GetLastError());
> > + goto finish;
> > + }
> > + }
> > + // The data is ready. Figure out how much was read and return;
> > + DWORD bytes_read = 0;
> > + if (!::GetOverlappedResult(m_file, &m_overlapped, &bytes_read,
> > FALSE))
> > + {
> > + DWORD result_error = ::GetLastError();
> > + // ERROR_OPERATION_ABORTED occurs when someone calls
> > Disconnect() during a blocking read.
> > + // This triggers a call to CancelIoEx, which causes the
> operation to
> > complete and the
> > + // result to be ERROR_OPERATION_ABORTED.
> > + if (result_error == ERROR_HANDLE_EOF || result_error ==
> > ERROR_OPERATION_ABORTED)
> > + return_info.Set(bytes_read, eConnectionStatusEndOfFile,
> 0);
> > + else
> > + return_info.Set(bytes_read, eConnectionStatusError,
> > result_error);
> > + }
> > + else if (bytes_read == 0)
> > + return_info.Set(bytes_read, eConnectionStatusEndOfFile, 0);
> > + else
> > + return_info.Set(bytes_read, eConnectionStatusSuccess, 0);
> > +
> > + goto finish;
> > + }
> > +
> > + // An unknown error occured. Fail out.
> > + return_info.Set(0, eConnectionStatusError, ::GetLastError());
> > + goto finish;
> > +
> > +finish:
> > + status = return_info.GetStatus();
> > + if (error_ptr)
> > + *error_ptr = return_info.GetError();
> > +
> > + // kBytesAvailableEvent is a manual reset event. Make sure it gets
> reset
> > here so that any
> > + // subsequent operations don't immediately see bytes available.
> > + ResetEvent(m_event_handles[kBytesAvailableEvent]);
> > +
> > + IncrementFilePointer(return_info.GetBytes());
> > + Log
> > *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION));
> > + if (log)
> > + {
> > + log->Printf("%" PRIxPTR " ConnectionGenericFile::Read() handle
> = %"
> > PRIxPTR ", dst = %" PRIxPTR ", dst_len = %" PRIu64
> > + ") => %" PRIu64 ", error = %s",
> > + this, m_file, dst, static_cast<uint64_t>(dst_len),
> > static_cast<uint64_t>(return_info.GetBytes()),
> > + return_info.GetError().AsCString());
> > + }
> > +
> > + return return_info.GetBytes();
> > +}
> > +
> > +size_t
> > +ConnectionGenericFile::Write(const void *src, size_t src_len,
> > +lldb::ConnectionStatus &status, Error *error_ptr) {
> > + ReturnInfo return_info;
> > +
> > + if (error_ptr)
> > + error_ptr->Clear();
> > +
> > + if (!IsConnected())
> > + {
> > + return_info.Set(0, eConnectionStatusNoConnection,
> > ERROR_INVALID_HANDLE);
> > + goto finish;
> > + }
> > +
> > + m_overlapped.hEvent = NULL;
> > +
> > + // Writes are not interruptible like reads are, so just block until
> it's done.
> > + BOOL result = ::WriteFile(m_file, src, src_len, NULL,
> &m_overlapped);
> > + if (!result && ::GetLastError() != ERROR_IO_PENDING)
> > + {
> > + return_info.Set(0, eConnectionStatusError, ::GetLastError());
> > + goto finish;
> > + }
> > +
> > + DWORD bytes_written = 0;
> > + if (!::GetOverlappedResult(m_file, &m_overlapped, &bytes_written,
> > TRUE))
> > + {
> > + return_info.Set(bytes_written, eConnectionStatusError,
> > ::GetLastError());
> > + goto finish;
> > + }
> > +
> > + return_info.Set(bytes_written, eConnectionStatusSuccess, 0);
> > + goto finish;
> > +
> > +finish:
> > + status = return_info.GetStatus();
> > + if (error_ptr)
> > + *error_ptr = return_info.GetError();
> > +
> > + IncrementFilePointer(return_info.GetBytes());
> > + Log
> > *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION));
> > + if (log)
> > + {
> > + log->Printf("%" PRIxPTR " ConnectionGenericFile::Write()
> handle = %"
> > PRIxPTR ", src = %" PRIxPTR ", src_len = %" PRIu64
> > + ") => %" PRIu64 ", error = %s",
> > + this, m_file, src, static_cast<uint64_t>(src_len),
> > static_cast<uint64_t>(return_info.GetBytes()),
> > + return_info.GetError().AsCString());
> > + }
> > + return return_info.GetBytes();
> > +}
> > +
> > +bool
> > +ConnectionGenericFile::InterruptRead()
> > +{
> > + return ::SetEvent(m_event_handles[kInterruptEvent]);
> > +}
> > +
> > +void
> > +ConnectionGenericFile::IncrementFilePointer(DWORD amount) {
> > + LARGE_INTEGER old_pos;
> > + old_pos.HighPart = m_overlapped.OffsetHigh;
> > + old_pos.LowPart = m_overlapped.Offset;
> > + old_pos.QuadPart += amount;
> > + m_overlapped.Offset = old_pos.LowPart;
> > + m_overlapped.OffsetHigh = old_pos.HighPart; }
> > \ No newline at end of file
> >
> >
> > _______________________________________________
> > lldb-commits mailing list
> > lldb-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20141022/c174339b/attachment.html>
More information about the lldb-commits
mailing list