Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-1753

Multiple C++ Windows, OSX, and iOS portability issues



    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 0.9
    • Fix Version/s: 0.9.1
    • Component/s: C++ - Library
    • Labels:
    • Environment:

      Windows MSVC10, MSVC11
      OSX GCC-4.2
      iOS Clang-4.0

    • Patch Info:
      Patch Available


      These are all in the C++ library. Here is a summary of what I changed.
      All of these fixes make a ~5000 line patch (though a lot of that is
      deleted lines).

      • General cleanup of the msvc project
      • Using HAVE_CONFIG_H instead of force including files
      • Getting rid of some unnecessary files (stdafx.*, TargetVersion.h)
      • Significant rework of windows portability. No longer using config.h
        and force_inc.h to make Windows look like *nix. Instead, making lots of
        Thrift specific #defines that are vaguely *nixy, and having those forward
        to *nix or Windows stuff appropriately. For example, THRIFT_CTIME_R calls
        ctime_r on *nix, and a wrapper thrift_ctime_r on Windows. The old
        approach doesn't work when multiple libraries attempt the same trick. For
        example, if openssl #defined errno to ::WSAGetLastError() as well, then
        that would cause problems.
      • Adding preprocessor flag that can optionally squelch console output.
        Default behavior is unchanged. Console output is great for home deployed
        server apps, but it looks unprofessional for consumer apps.
      • Adding THRIFT_UNUSED_VARIABLE helper macro, to aid in squelching
      • Adding redirector header for <functional> and <tr1/functional>. Since
        namespaces aren't consistent (std vs std::tr1), I have added symbols to
        the apache::thrift::stdcxx namespace. This is important for Clang / iOS
      • usleep and sleep on Windows were both sleeping in milliseconds. sleep
        now correctly sleeps for seconds, and usleep attempts to sleep for
        microseconds (after converting very coarsely to milliseconds).
      • Adding support for using C++11 std::thread (and mutex, and monitor).
        Thrift already supported boost::thread and posix threads. Clients that
        use std::thread no longer need built boost libraries. The boost headers
        are sufficient for them. Switching from boost::thread to std::thread
        resulted in a ~50k reduction in exe size in my tests. By default, msvc10
        and below will use boost::thread, msvc11 and up will use std::thread.
      • Fixing more 64-bit socket truncation issues in non-blocking server and
        ssl support. openssl itself has socket truncation issues, so I could not
        fix them all.
      • Fixed THRIFT-1692 "SO_REUSEADDR allows for socket hijacking on Windows
        ". Now using SO_EXCLUSIVEADDRUSE on windows, and SO_REUSEADDR on *nix.
      • Making TFileTransport use thrift style threads instead of redoing all
        the pthread+boost stuff itself.
      • Includes, and builds upon THRIFT-1740 (Make C++ library build on OS X
        and iOS)
      • Moved several functions out of thrift/windows/config.h, and into other
        thrift/windows headers.
      • Using built-in stdint.h on Windows if available (by checking HAVE_STDINT_H) and
        using boost typedefs otherwise.


        1. cleaner_port3.patch
          179 kB
          Ben Craig
        2. cleaner_port4.patch
          179 kB
          Ben Craig

          Issue Links



              • Assignee:
                ben.craig Ben Craig
              • Votes:
                3 Vote for this issue
                7 Start watching this issue


                • Created: