THRIFT-1031 Patch to compile Thrift for vc++ 9.0 and 10.0

Patch: James Dickson and Alexandre Parenteau

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1171777 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Roger Meier 2011-09-16 20:58:44 +00:00
parent 508b317269
commit 84e4a3c181
27 changed files with 1750 additions and 22 deletions

View File

@ -0,0 +1,42 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding cogoright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a cogo of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_CONFIG_H_
#define _THRIFT_WINDOWS_CONFIG_H_ 1
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error "This is a Windows header only"
#endif
#include <io.h>
#include <stdlib.h>
#include <direct.h>
#define strtoll(begin_ptr, end_ptr, length) strtol(begin_ptr, end_ptr, length)
#define PRIu64 "I64d"
#define PRIi64 "I64d"
#pragma warning(disable:4996)
#endif // _THRIFT_WINDOWS_CONFIG_H_

View File

@ -0,0 +1,42 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding cogoright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a cogo of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_VERSION_H_
#define _THRIFT_WINDOWS_VERSION_H_ 1
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error "This is a Windows header only"
#endif
#define PATH_MAX MAX_PATH
#define THRIFT_VERSION "0.8.0-dev"
#ifndef S_ISDIR
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
#endif
#ifndef S_ISREG
#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
#endif
#endif // _THRIFT_WINDOWS_VERSION_H_

90
lib/cpp/README_WINDOWS Normal file
View File

@ -0,0 +1,90 @@
Thrift C++ Software Library
License
=======
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
Using Thrift with C++
=====================
You need to define an enviroment variable called THIRD_PARTY. The project
assumes that you have extracted the dependancies into their default structure
into the path defined by THIRD_PARTY.
e.g. $(THIRD_PARTY)/boost/boost_1_47_0/
Thrift is divided into two libraries.
libthrift
The core Thrift library contains all the core Thrift code. It requires
boost shared pointers and pthreads_win32.
libthriftnb
This library contains the Thrift nonblocking server, which uses libevent.
To link this library you will also need to link libevent.
You MUST apply this patch to make generated code compile.
https://issues.apache.org/jira/browse/THRIFT-1139
Linking Against Thrift
======================
You need to link your project that uses thrift against all the thrift
dependancies; in the case of libthrift, pthreads_win32, boost and for
libthriftnb, libevent.
In the project properties you must also set HAVE_CONFIG_H as force include
the config header: "windows/confg.h"
Dependencies
============
boost shared pointers
http://www.boost.org/libs/smart_ptr/smart_ptr.htm
libevent (for libthriftnb only)
http://monkey.org/~provos/libevent/
pthreads win32
http://sources.redhat.com/pthreads-win32/
Known issues
============
- Endianess has not been fully tested, may not work with doubles.
- Currently does not support the non-blocking connect path.
- Only supports the creation of clients, server sockets are not yet ported.
- Does not support named pipes. (Supported in unix through unix domain sockets).
TODO
====
- Port remaining classes in libthrift:
- TFDTransport
- TFileTransport
- THttpClient
- THttpServer
- TSimpleFileTransport
- TSSLSocket
- Port test cases. (Not even started this. Run test cases in release mode?)
- Autolink libraries depending on debug\release build.
- Auto versioning.

246
lib/cpp/libthrift.vcxproj Normal file
View File

@ -0,0 +1,246 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\async\TAsyncChannel.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\concurrency\Monitor.cpp">
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">config.h</ForcedIncludeFiles>
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">config.h</ForcedIncludeFiles>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\concurrency\Mutex.cpp" />
<ClCompile Include="src\concurrency\PosixThreadFactory.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\concurrency\ThreadManager.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\concurrency\TimerManager.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\concurrency\Util.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">HAVE_GETTIMEOFDAY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">HAVE_GETTIMEOFDAY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\processor\PeekProcessor.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\protocol\TBase64Utils.cpp" />
<ClCompile Include="src\protocol\TDebugProtocol.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\protocol\TDenseProtocol.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\protocol\TJSONProtocol.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\server\TSimpleServer.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\server\TThreadPoolServer.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\TApplicationException.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\Thrift.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\transport\TBufferTransports.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\transport\TFDTransport.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\transport\TFileTransport.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\transport\THttpClient.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\transport\THttpServer.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\transport\THttpTransport.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\transport\TServerSocket.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">force_inc.h</ForcedIncludeFiles>
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">force_inc.h</ForcedIncludeFiles>
</ClCompile>
<ClCompile Include="src\transport\TSimpleFileTransport.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\transport\TSocket.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">force_inc.h</ForcedIncludeFiles>
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">force_inc.h</ForcedIncludeFiles>
</ClCompile>
<ClCompile Include="src\transport\TSSLSocket.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="src\transport\TTransportException.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\transport\TTransportUtils.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\windows\Fcntl.cpp" />
<ClCompile Include="src\windows\GetTimeOfDay.cpp" />
<ClCompile Include="src\windows\SocketPair.cpp" />
<ClCompile Include="src\windows\StdAfx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="src\windows\TWinsockSingleton.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\async\TAsyncChannel.h" />
<ClInclude Include="src\concurrency\Exception.h" />
<ClInclude Include="src\concurrency\Monitor.h" />
<ClInclude Include="src\concurrency\Mutex.h" />
<ClInclude Include="src\processor\PeekProcessor.h" />
<ClInclude Include="src\protocol\TBinaryProtocol.h" />
<ClInclude Include="src\protocol\TDebugProtocol.h" />
<ClInclude Include="src\protocol\TDenseProtocol.h" />
<ClInclude Include="src\protocol\TJSONProtocol.h" />
<ClInclude Include="src\protocol\TProtocol.h" />
<ClInclude Include="src\protocol\TVirtualProtocol.h" />
<ClInclude Include="src\server\TServer.h" />
<ClInclude Include="src\server\TSimpleServer.h" />
<ClInclude Include="src\server\TThreadPoolServer.h" />
<ClInclude Include="src\TApplicationException.h" />
<ClInclude Include="src\Thrift.h" />
<ClInclude Include="src\TProcessor.h" />
<ClInclude Include="src\transport\TBufferTransports.h" />
<ClInclude Include="src\transport\TFDTransport.h" />
<ClInclude Include="src\transport\TFileTransport.h" />
<ClInclude Include="src\transport\THttpClient.h" />
<ClInclude Include="src\transport\THttpServer.h" />
<ClInclude Include="src\transport\TServerSocket.h" />
<ClInclude Include="src\transport\TServerTransport.h" />
<ClInclude Include="src\transport\TSimpleFileTransport.h" />
<ClInclude Include="src\transport\TSocket.h" />
<ClInclude Include="src\transport\TSSLSocket.h" />
<ClInclude Include="src\transport\TTransport.h" />
<ClInclude Include="src\transport\TTransportException.h" />
<ClInclude Include="src\transport\TTransportUtils.h" />
<ClInclude Include="src\transport\TVirtualTransport.h" />
<ClInclude Include="src\windows\config.h" />
<ClInclude Include="src\windows\Fcntl.h" />
<ClInclude Include="src\windows\force_inc.h" />
<ClInclude Include="src\windows\GetTimeOfDay.h" />
<ClInclude Include="src\windows\Operators.h" />
<ClInclude Include="src\windows\SocketPair.h" />
<ClInclude Include="src\windows\StdAfx.h" />
<ClInclude Include="src\windows\TargetVersion.h" />
<ClInclude Include="src\windows\TWinsockSingleton.h" />
</ItemGroup>
<ItemGroup>
<None Include="src\protocol\TBinaryProtocol.tcc" />
<None Include="src\windows\tr1\functional" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{DD26F57E-60F2-4F37-A616-D219A9BF338F}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>thrift</RootNamespace>
<ProjectName>libthrift</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(ProjectDir)\src\;$(ProjectDir)\src\windows\;$(ProjectDir)\src\transport\;$(THIRD_PARTY)\boost\boost_1_47_0\;$(THIRD_PARTY)\pthreads\;$(THIRD_PARTY)\openssl\OpenSSL-Win32\include\;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IncludePath>$(ProjectDir)\src\;$(ProjectDir)\src\windows\;$(ProjectDir)\src\transport\;$(THIRD_PARTY)\boost\boost_1_47_0\;$(THIRD_PARTY)\pthreads\;$(THIRD_PARTY)\openssl\OpenSSL-Win32\include\;$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;HAVE_CONFIG_H;NOMINMAX;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;HAVE_CONFIG_H;NOMINMAX;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,250 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="src\transport\TBufferTransports.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\Thrift.cpp" />
<ClCompile Include="src\TApplicationException.cpp" />
<ClCompile Include="src\windows\StdAfx.cpp">
<Filter>windows</Filter>
</ClCompile>
<ClCompile Include="src\concurrency\Monitor.cpp">
<Filter>concurrency</Filter>
</ClCompile>
<ClCompile Include="src\concurrency\Mutex.cpp">
<Filter>concurrency</Filter>
</ClCompile>
<ClCompile Include="src\transport\TTransportException.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\windows\GetTimeOfDay.cpp">
<Filter>windows</Filter>
</ClCompile>
<ClCompile Include="src\concurrency\PosixThreadFactory.cpp">
<Filter>concurrency</Filter>
</ClCompile>
<ClCompile Include="src\concurrency\ThreadManager.cpp">
<Filter>concurrency</Filter>
</ClCompile>
<ClCompile Include="src\concurrency\TimerManager.cpp">
<Filter>concurrency</Filter>
</ClCompile>
<ClCompile Include="src\concurrency\Util.cpp">
<Filter>concurrency</Filter>
</ClCompile>
<ClCompile Include="src\protocol\TDebugProtocol.cpp">
<Filter>protocal</Filter>
</ClCompile>
<ClCompile Include="src\protocol\TDenseProtocol.cpp">
<Filter>protocal</Filter>
</ClCompile>
<ClCompile Include="src\protocol\TBase64Utils.cpp">
<Filter>protocal</Filter>
</ClCompile>
<ClCompile Include="src\protocol\TJSONProtocol.cpp">
<Filter>protocal</Filter>
</ClCompile>
<ClCompile Include="src\transport\TFDTransport.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\TFileTransport.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\TSimpleFileTransport.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\THttpTransport.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\THttpClient.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\THttpServer.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\TSSLSocket.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\TTransportUtils.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\server\TSimpleServer.cpp">
<Filter>server</Filter>
</ClCompile>
<ClCompile Include="src\server\TThreadPoolServer.cpp">
<Filter>server</Filter>
</ClCompile>
<ClCompile Include="src\async\TAsyncChannel.cpp">
<Filter>async</Filter>
</ClCompile>
<ClCompile Include="src\processor\PeekProcessor.cpp">
<Filter>processor</Filter>
</ClCompile>
<ClCompile Include="src\transport\TServerSocket.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\transport\TSocket.cpp">
<Filter>transport</Filter>
</ClCompile>
<ClCompile Include="src\windows\Fcntl.cpp">
<Filter>windows</Filter>
</ClCompile>
<ClCompile Include="src\windows\TWinsockSingleton.cpp">
<Filter>windows</Filter>
</ClCompile>
<ClCompile Include="src\windows\SocketPair.cpp">
<Filter>windows</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\transport\TBufferTransports.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TSocket.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\protocol\TBinaryProtocol.h">
<Filter>protocal</Filter>
</ClInclude>
<ClInclude Include="src\Thrift.h" />
<ClInclude Include="src\TProcessor.h" />
<ClInclude Include="src\TApplicationException.h" />
<ClInclude Include="src\windows\StdAfx.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\TargetVersion.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\concurrency\Monitor.h">
<Filter>concurrency</Filter>
</ClInclude>
<ClInclude Include="src\concurrency\Mutex.h">
<Filter>concurrency</Filter>
</ClInclude>
<ClInclude Include="src\concurrency\Exception.h">
<Filter>concurrency</Filter>
</ClInclude>
<ClInclude Include="src\transport\TVirtualTransport.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TTransport.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TTransportException.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\windows\GetTimeOfDay.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\transport\TServerTransport.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\windows\config.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\protocol\TProtocol.h">
<Filter>protocal</Filter>
</ClInclude>
<ClInclude Include="src\protocol\TVirtualProtocol.h">
<Filter>protocal</Filter>
</ClInclude>
<ClInclude Include="src\server\TServer.h">
<Filter>server</Filter>
</ClInclude>
<ClInclude Include="src\server\TSimpleServer.h">
<Filter>server</Filter>
</ClInclude>
<ClInclude Include="src\server\TThreadPoolServer.h">
<Filter>server</Filter>
</ClInclude>
<ClInclude Include="src\async\TAsyncChannel.h">
<Filter>async</Filter>
</ClInclude>
<ClInclude Include="src\processor\PeekProcessor.h">
<Filter>processor</Filter>
</ClInclude>
<ClInclude Include="src\transport\TFDTransport.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TFileTransport.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\THttpClient.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\THttpServer.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TSSLSocket.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TTransportUtils.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\transport\TSimpleFileTransport.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\protocol\TJSONProtocol.h">
<Filter>protocal</Filter>
</ClInclude>
<ClInclude Include="src\protocol\TDenseProtocol.h">
<Filter>protocal</Filter>
</ClInclude>
<ClInclude Include="src\protocol\TDebugProtocol.h">
<Filter>protocal</Filter>
</ClInclude>
<ClInclude Include="src\transport\TServerSocket.h">
<Filter>transport</Filter>
</ClInclude>
<ClInclude Include="src\windows\Operators.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\Fcntl.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\TWinsockSingleton.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\SocketPair.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\force_inc.h">
<Filter>windows</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="protocal">
<UniqueIdentifier>{07ced19b-b72a-4105-9ffb-6d2bcf64497e}</UniqueIdentifier>
</Filter>
<Filter Include="transport">
<UniqueIdentifier>{e9f61404-1148-4103-bd6f-e5869d37fa79}</UniqueIdentifier>
</Filter>
<Filter Include="windows">
<UniqueIdentifier>{2814002a-3c68-427e-b0eb-33acd2f406ae}</UniqueIdentifier>
</Filter>
<Filter Include="concurrency">
<UniqueIdentifier>{addd4707-dbaa-4d0c-bef6-fff8be7b495a}</UniqueIdentifier>
</Filter>
<Filter Include="server">
<UniqueIdentifier>{f55a8e9b-6959-487f-a396-c31b4d6c61d6}</UniqueIdentifier>
</Filter>
<Filter Include="async">
<UniqueIdentifier>{d526885b-1b3e-4ee3-8027-e694fe98ad63}</UniqueIdentifier>
</Filter>
<Filter Include="processor">
<UniqueIdentifier>{8f428da8-5a83-44fb-9578-de935fb415e1}</UniqueIdentifier>
</Filter>
<Filter Include="windows\tr1">
<UniqueIdentifier>{eea10406-3380-4f2d-9365-c26fa2875dae}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="src\protocol\TBinaryProtocol.tcc">
<Filter>protocal</Filter>
</None>
<None Include="src\windows\tr1\functional">
<Filter>windows\tr1</Filter>
</None>
</ItemGroup>
</Project>

109
lib/cpp/libthriftnb.vcxproj Normal file
View File

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\async\TAsyncProtocolProcessor.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\async\TEvhttpClientChannel.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\async\TEvhttpServer.cpp">
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\server\TNonblockingServer.cpp">
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">config.h</ForcedIncludeFiles>
<ForcedIncludeFiles Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">config.h</ForcedIncludeFiles>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="src\windows\StdAfx.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\async\TAsyncProtocolProcessor.h" />
<ClInclude Include="src\async\TEvhttpClientChannel.h" />
<ClInclude Include="src\async\TEvhttpServer.h" />
<ClInclude Include="src\server\TNonblockingServer.h" />
<ClInclude Include="src\windows\config.h" />
<ClInclude Include="src\windows\StdAfx.h" />
<ClInclude Include="src\windows\TargetVersion.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{D8696CCE-7D46-4659-B432-91754A41DEB0}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>libthriftnb</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<IncludePath>$(ProjectDir)\src\;$(ProjectDir)\src\windows\;$(THIRD_PARTY)\boost\boost_1_47_0\;$(THIRD_PARTY)\pthreads\;$(THIRD_PARTY)\libevent\libevent-2.0.13-stable\WIN32-Code\;$(THIRD_PARTY)\libevent\libevent-2.0.13-stable\include;$(THIRD_PARTY)\libevent\libevent-2.0.13-stable\;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IncludePath>$(ProjectDir)\src\;$(ProjectDir)\src\windows\;$(THIRD_PARTY)\boost\boost_1_47_0\;$(THIRD_PARTY)\pthreads\;$(THIRD_PARTY)\libevent\libevent-2.0.13-stable\WIN32-Code\;$(THIRD_PARTY)\libevent\libevent-2.0.13-stable\include;$(THIRD_PARTY)\libevent\libevent-2.0.13-stable\;$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;HAVE_CONFIG_H;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;HAVE_CONFIG_H;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="server">
<UniqueIdentifier>{bf449d92-4be8-4f6f-a010-c536f57c6f13}</UniqueIdentifier>
</Filter>
<Filter Include="async">
<UniqueIdentifier>{0294d0a6-ce46-4be8-a659-826d6e98ae41}</UniqueIdentifier>
</Filter>
<Filter Include="windows">
<UniqueIdentifier>{60fc9e5e-0866-4aba-8662-439bb4a461d3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\server\TNonblockingServer.cpp">
<Filter>server</Filter>
</ClCompile>
<ClCompile Include="src\async\TEvhttpClientChannel.cpp">
<Filter>async</Filter>
</ClCompile>
<ClCompile Include="src\async\TEvhttpServer.cpp">
<Filter>async</Filter>
</ClCompile>
<ClCompile Include="src\async\TAsyncProtocolProcessor.cpp">
<Filter>async</Filter>
</ClCompile>
<ClCompile Include="src\windows\StdAfx.cpp">
<Filter>windows</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\server\TNonblockingServer.h">
<Filter>server</Filter>
</ClInclude>
<ClInclude Include="src\async\TEvhttpClientChannel.h">
<Filter>async</Filter>
</ClInclude>
<ClInclude Include="src\async\TEvhttpServer.h">
<Filter>async</Filter>
</ClInclude>
<ClInclude Include="src\async\TAsyncProtocolProcessor.h">
<Filter>async</Filter>
</ClInclude>
<ClInclude Include="src\windows\config.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\StdAfx.h">
<Filter>windows</Filter>
</ClInclude>
<ClInclude Include="src\windows\TargetVersion.h">
<Filter>windows</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -68,7 +68,11 @@ class PthreadThread: public Thread {
public: public:
PthreadThread(int policy, int priority, int stackSize, bool detached, shared_ptr<Runnable> runnable) : PthreadThread(int policy, int priority, int stackSize, bool detached, shared_ptr<Runnable> runnable) :
#ifndef _WIN32
pthread_(0), pthread_(0),
#endif // _WIN32
state_(uninitialized), state_(uninitialized),
policy_(policy), policy_(policy),
priority_(priority), priority_(priority),
@ -152,7 +156,12 @@ class PthreadThread: public Thread {
} }
Thread::id_t getId() { Thread::id_t getId() {
#ifndef _WIN32
return (Thread::id_t)pthread_; return (Thread::id_t)pthread_;
#else
return (Thread::id_t)pthread_.p;
#endif // _WIN32
} }
shared_ptr<Runnable> runnable() const { return Thread::runnable(); } shared_ptr<Runnable> runnable() const { return Thread::runnable(); }
@ -286,7 +295,13 @@ class PosixThreadFactory::Impl {
void setDetached(bool value) { detached_ = value; } void setDetached(bool value) { detached_ = value; }
Thread::id_t getCurrentThreadId() const { Thread::id_t getCurrentThreadId() const {
#ifndef _WIN32
return (Thread::id_t)pthread_self(); return (Thread::id_t)pthread_self();
#else
return (Thread::id_t)pthread_self().p;
#endif // _WIN32
} }
}; };

View File

@ -60,7 +60,11 @@ using apache::thrift::concurrency::ThreadManager;
#endif #endif
#ifndef SOCKOPT_CAST_T #ifndef SOCKOPT_CAST_T
#define SOCKOPT_CAST_T void # ifndef _WIN32
# define SOCKOPT_CAST_T void
# else
# define SOCKOPT_CAST_T char
# endif // _WIN32
#endif #endif
template<class T> template<class T>

View File

@ -52,6 +52,24 @@
#define AF_LOCAL AF_UNIX #define AF_LOCAL AF_UNIX
#endif #endif
#ifndef SOCKOPT_CAST_T
# ifndef _WIN32
# define SOCKOPT_CAST_T void
# else
# define SOCKOPT_CAST_T char
# endif // _WIN32
#endif
template<class T>
inline const SOCKOPT_CAST_T* const_cast_sockopt(const T* v) {
return reinterpret_cast<const SOCKOPT_CAST_T*>(v);
}
template<class T>
inline SOCKOPT_CAST_T* cast_sockopt(T* v) {
return reinterpret_cast<SOCKOPT_CAST_T*>(v);
}
namespace apache { namespace thrift { namespace transport { namespace apache { namespace thrift { namespace transport {
using namespace std; using namespace std;
@ -182,7 +200,7 @@ void TServerSocket::listen() {
// Set reusaddress to prevent 2MSL delay on accept // Set reusaddress to prevent 2MSL delay on accept
int one = 1; int one = 1;
if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_REUSEADDR, if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_REUSEADDR,
&one, sizeof(one))) { cast_sockopt(&one), sizeof(one))) {
int errno_copy = errno; int errno_copy = errno;
GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_REUSEADDR ", errno_copy); GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_REUSEADDR ", errno_copy);
close(); close();
@ -192,7 +210,7 @@ void TServerSocket::listen() {
// Set TCP buffer sizes // Set TCP buffer sizes
if (tcpSendBuffer_ > 0) { if (tcpSendBuffer_ > 0) {
if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_SNDBUF, if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_SNDBUF,
&tcpSendBuffer_, sizeof(tcpSendBuffer_))) { cast_sockopt(&tcpSendBuffer_), sizeof(tcpSendBuffer_))) {
int errno_copy = errno; int errno_copy = errno;
GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_SNDBUF ", errno_copy); GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_SNDBUF ", errno_copy);
close(); close();
@ -202,7 +220,7 @@ void TServerSocket::listen() {
if (tcpRecvBuffer_ > 0) { if (tcpRecvBuffer_ > 0) {
if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_RCVBUF, if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_RCVBUF,
&tcpRecvBuffer_, sizeof(tcpRecvBuffer_))) { cast_sockopt(&tcpRecvBuffer_), sizeof(tcpRecvBuffer_))) {
int errno_copy = errno; int errno_copy = errno;
GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_RCVBUF ", errno_copy); GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_RCVBUF ", errno_copy);
close(); close();
@ -225,7 +243,7 @@ void TServerSocket::listen() {
if (res->ai_family == AF_INET6 && path_.empty()) { if (res->ai_family == AF_INET6 && path_.empty()) {
int zero = 0; int zero = 0;
if (-1 == setsockopt(serverSocket_, IPPROTO_IPV6, IPV6_V6ONLY, if (-1 == setsockopt(serverSocket_, IPPROTO_IPV6, IPV6_V6ONLY,
&zero, sizeof(zero))) { cast_sockopt(&zero), sizeof(zero))) {
GlobalOutput.perror("TServerSocket::listen() IPV6_V6ONLY ", errno); GlobalOutput.perror("TServerSocket::listen() IPV6_V6ONLY ", errno);
} }
} }
@ -234,7 +252,7 @@ void TServerSocket::listen() {
// Turn linger off, don't want to block on calls to close // Turn linger off, don't want to block on calls to close
struct linger ling = {0, 0}; struct linger ling = {0, 0};
if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_LINGER, if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_LINGER,
&ling, sizeof(ling))) { cast_sockopt(&ling), sizeof(ling))) {
int errno_copy = errno; int errno_copy = errno;
GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_LINGER ", errno_copy); GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_LINGER ", errno_copy);
close(); close();
@ -245,7 +263,7 @@ void TServerSocket::listen() {
if (path_.empty()) { if (path_.empty()) {
// TCP Nodelay, speed over bandwidth // TCP Nodelay, speed over bandwidth
if (-1 == setsockopt(serverSocket_, IPPROTO_TCP, TCP_NODELAY, if (-1 == setsockopt(serverSocket_, IPPROTO_TCP, TCP_NODELAY,
&one, sizeof(one))) { cast_sockopt(&one), sizeof(one))) {
int errno_copy = errno; int errno_copy = errno;
GlobalOutput.perror("TServerSocket::listen() setsockopt() TCP_NODELAY ", errno_copy); GlobalOutput.perror("TServerSocket::listen() setsockopt() TCP_NODELAY ", errno_copy);
close(); close();
@ -273,6 +291,9 @@ void TServerSocket::listen() {
int retries = 0; int retries = 0;
if (! path_.empty()) { if (! path_.empty()) {
#ifndef _WIN32
// Unix Domain Socket // Unix Domain Socket
struct sockaddr_un address; struct sockaddr_un address;
socklen_t len; socklen_t len;
@ -303,6 +324,12 @@ void TServerSocket::listen() {
// free addrinfo // free addrinfo
freeaddrinfo(res0); freeaddrinfo(res0);
#else
GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);
throw TTransportException(TTransportException::NOT_OPEN, " Unix Domain socket path not supported");
#endif
} }
// throw an error if we failed to bind properly // throw an error if we failed to bind properly
@ -368,7 +395,7 @@ shared_ptr<TTransport> TServerSocket::acceptImpl() {
// Check for an interrupt signal // Check for an interrupt signal
if (intSock2_ >= 0 && (fds[1].revents & POLLIN)) { if (intSock2_ >= 0 && (fds[1].revents & POLLIN)) {
int8_t buf; int8_t buf;
if (-1 == recv(intSock2_, &buf, sizeof(int8_t), 0)) { if (-1 == recv(intSock2_, cast_sockopt(&buf), sizeof(int8_t), 0)) {
GlobalOutput.perror("TServerSocket::acceptImpl() recv() interrupt ", errno); GlobalOutput.perror("TServerSocket::acceptImpl() recv() interrupt ", errno);
} }
throw TTransportException(TTransportException::INTERRUPTED); throw TTransportException(TTransportException::INTERRUPTED);
@ -429,7 +456,7 @@ shared_ptr<TSocket> TServerSocket::createSocket(int clientSocket) {
void TServerSocket::interrupt() { void TServerSocket::interrupt() {
if (intSock1_ >= 0) { if (intSock1_ >= 0) {
int8_t byte = 0; int8_t byte = 0;
if (-1 == send(intSock1_, &byte, sizeof(int8_t), 0)) { if (-1 == send(intSock1_, cast_sockopt(&byte), sizeof(int8_t), 0)) {
GlobalOutput.perror("TServerSocket::interrupt() send() ", errno); GlobalOutput.perror("TServerSocket::interrupt() send() ", errno);
} }
} }
@ -437,8 +464,15 @@ void TServerSocket::interrupt() {
void TServerSocket::close() { void TServerSocket::close() {
if (serverSocket_ >= 0) { if (serverSocket_ >= 0) {
#ifdef _WIN32
shutdown(serverSocket_, SD_BOTH);
::closesocket(serverSocket_);
#else
shutdown(serverSocket_, SHUT_RDWR); shutdown(serverSocket_, SHUT_RDWR);
::close(serverSocket_); ::close(serverSocket_);
#endif
} }
if (intSock1_ >= 0) { if (intSock1_ >= 0) {
::close(intSock1_); ::close(intSock1_);

View File

@ -49,6 +49,24 @@
#include "TSocket.h" #include "TSocket.h"
#include "TTransportException.h" #include "TTransportException.h"
#ifndef SOCKOPT_CAST_T
# ifndef _WIN32
# define SOCKOPT_CAST_T void
# else
# define SOCKOPT_CAST_T char
# endif // _WIN32
#endif
template<class T>
inline const SOCKOPT_CAST_T* const_cast_sockopt(const T* v) {
return reinterpret_cast<const SOCKOPT_CAST_T*>(v);
}
template<class T>
inline SOCKOPT_CAST_T* cast_sockopt(T* v) {
return reinterpret_cast<SOCKOPT_CAST_T*>(v);
}
namespace apache { namespace thrift { namespace transport { namespace apache { namespace thrift { namespace transport {
using namespace std; using namespace std;
@ -141,7 +159,7 @@ bool TSocket::peek() {
return false; return false;
} }
uint8_t buf; uint8_t buf;
int r = recv(socket_, &buf, 1, MSG_PEEK); int r = recv(socket_, cast_sockopt(&buf), 1, MSG_PEEK);
if (r == -1) { if (r == -1) {
int errno_copy = errno; int errno_copy = errno;
#if defined __FreeBSD__ || defined __MACH__ #if defined __FreeBSD__ || defined __MACH__
@ -162,6 +180,11 @@ bool TSocket::peek() {
} }
void TSocket::openConnection(struct addrinfo *res) { void TSocket::openConnection(struct addrinfo *res) {
#ifdef _WIN32
TWinsockSingleton::create();
#endif // _WIN32
if (isOpen()) { if (isOpen()) {
return; return;
} }
@ -222,6 +245,9 @@ void TSocket::openConnection(struct addrinfo *res) {
// Connect the socket // Connect the socket
int ret; int ret;
if (! path_.empty()) { if (! path_.empty()) {
#ifndef _WIN32
struct sockaddr_un address; struct sockaddr_un address;
socklen_t len; socklen_t len;
@ -235,6 +261,12 @@ void TSocket::openConnection(struct addrinfo *res) {
snprintf(address.sun_path, sizeof(address.sun_path), "%s", path_.c_str()); snprintf(address.sun_path, sizeof(address.sun_path), "%s", path_.c_str());
len = sizeof(address); len = sizeof(address);
ret = connect(socket_, (struct sockaddr *) &address, len); ret = connect(socket_, (struct sockaddr *) &address, len);
#else
GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);
throw TTransportException(TTransportException::NOT_OPEN, " Unix Domain socket path not supported");
#endif
} else { } else {
ret = connect(socket_, res->ai_addr, res->ai_addrlen); ret = connect(socket_, res->ai_addr, res->ai_addrlen);
} }
@ -262,7 +294,7 @@ void TSocket::openConnection(struct addrinfo *res) {
int val; int val;
socklen_t lon; socklen_t lon;
lon = sizeof(int); lon = sizeof(int);
int ret2 = getsockopt(socket_, SOL_SOCKET, SO_ERROR, (void *)&val, &lon); int ret2 = getsockopt(socket_, SOL_SOCKET, SO_ERROR, cast_sockopt(&val), &lon);
if (ret2 == -1) { if (ret2 == -1) {
int errno_copy = errno; int errno_copy = errno;
GlobalOutput.perror("TSocket::open() getsockopt() " + getSocketInfo(), errno_copy); GlobalOutput.perror("TSocket::open() getsockopt() " + getSocketInfo(), errno_copy);
@ -366,8 +398,15 @@ void TSocket::local_open(){
void TSocket::close() { void TSocket::close() {
if (socket_ >= 0) { if (socket_ >= 0) {
#ifdef _WIN32
shutdown(socket_, SD_BOTH);
::closesocket(socket_);
#else
shutdown(socket_, SHUT_RDWR); shutdown(socket_, SHUT_RDWR);
::close(socket_); ::close(socket_);
#endif
} }
socket_ = -1; socket_ = -1;
} }
@ -408,7 +447,7 @@ uint32_t TSocket::read(uint8_t* buf, uint32_t len) {
// an EAGAIN is due to a timeout or an out-of-resource condition. // an EAGAIN is due to a timeout or an out-of-resource condition.
begin.tv_sec = begin.tv_usec = 0; begin.tv_sec = begin.tv_usec = 0;
} }
int got = recv(socket_, buf, len, 0); int got = recv(socket_, cast_sockopt(buf), len, 0);
int errno_copy = errno; //gettimeofday can change errno int errno_copy = errno; //gettimeofday can change errno
++g_socket_syscalls; ++g_socket_syscalls;
@ -518,7 +557,7 @@ uint32_t TSocket::write_partial(const uint8_t* buf, uint32_t len) {
flags |= MSG_NOSIGNAL; flags |= MSG_NOSIGNAL;
#endif // ifdef MSG_NOSIGNAL #endif // ifdef MSG_NOSIGNAL
int b = send(socket_, buf + sent, len - sent, flags); int b = send(socket_, const_cast_sockopt(buf + sent), len - sent, flags);
++g_socket_syscalls; ++g_socket_syscalls;
if (b < 0) { if (b < 0) {
@ -568,7 +607,7 @@ void TSocket::setLinger(bool on, int linger) {
} }
struct linger l = {(lingerOn_ ? 1 : 0), lingerVal_}; struct linger l = {(lingerOn_ ? 1 : 0), lingerVal_};
int ret = setsockopt(socket_, SOL_SOCKET, SO_LINGER, &l, sizeof(l)); int ret = setsockopt(socket_, SOL_SOCKET, SO_LINGER, cast_sockopt(&l), sizeof(l));
if (ret == -1) { if (ret == -1) {
int errno_copy = errno; // Copy errno because we're allocating memory. int errno_copy = errno; // Copy errno because we're allocating memory.
GlobalOutput.perror("TSocket::setLinger() setsockopt() " + getSocketInfo(), errno_copy); GlobalOutput.perror("TSocket::setLinger() setsockopt() " + getSocketInfo(), errno_copy);
@ -583,7 +622,7 @@ void TSocket::setNoDelay(bool noDelay) {
// Set socket to NODELAY // Set socket to NODELAY
int v = noDelay_ ? 1 : 0; int v = noDelay_ ? 1 : 0;
int ret = setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, &v, sizeof(v)); int ret = setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, cast_sockopt(&v), sizeof(v));
if (ret == -1) { if (ret == -1) {
int errno_copy = errno; // Copy errno because we're allocating memory. int errno_copy = errno; // Copy errno because we're allocating memory.
GlobalOutput.perror("TSocket::setNoDelay() setsockopt() " + getSocketInfo(), errno_copy); GlobalOutput.perror("TSocket::setNoDelay() setsockopt() " + getSocketInfo(), errno_copy);
@ -612,7 +651,7 @@ void TSocket::setRecvTimeout(int ms) {
// Copy because poll may modify // Copy because poll may modify
struct timeval r = recvTimeval_; struct timeval r = recvTimeval_;
int ret = setsockopt(socket_, SOL_SOCKET, SO_RCVTIMEO, &r, sizeof(r)); int ret = setsockopt(socket_, SOL_SOCKET, SO_RCVTIMEO, cast_sockopt(&r), sizeof(r));
if (ret == -1) { if (ret == -1) {
int errno_copy = errno; // Copy errno because we're allocating memory. int errno_copy = errno; // Copy errno because we're allocating memory.
GlobalOutput.perror("TSocket::setRecvTimeout() setsockopt() " + getSocketInfo(), errno_copy); GlobalOutput.perror("TSocket::setRecvTimeout() setsockopt() " + getSocketInfo(), errno_copy);
@ -634,7 +673,7 @@ void TSocket::setSendTimeout(int ms) {
struct timeval s = {(int)(sendTimeout_/1000), struct timeval s = {(int)(sendTimeout_/1000),
(int)((sendTimeout_%1000)*1000)}; (int)((sendTimeout_%1000)*1000)};
int ret = setsockopt(socket_, SOL_SOCKET, SO_SNDTIMEO, &s, sizeof(s)); int ret = setsockopt(socket_, SOL_SOCKET, SO_SNDTIMEO, cast_sockopt(&s), sizeof(s));
if (ret == -1) { if (ret == -1) {
int errno_copy = errno; // Copy errno because we're allocating memory. int errno_copy = errno; // Copy errno because we're allocating memory.
GlobalOutput.perror("TSocket::setSendTimeout() setsockopt() " + getSocketInfo(), errno_copy); GlobalOutput.perror("TSocket::setSendTimeout() setsockopt() " + getSocketInfo(), errno_copy);

View File

@ -0,0 +1,53 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "Fcntl.h"
// Win32
#include <Winsock2.h>
int fcntl(int fd, int cmd, int flags)
{
if(cmd != F_GETFL && cmd != F_SETFL)
{
return -1;
}
if(flags != O_NONBLOCK && flags != 0)
{
return -1;
}
if(cmd == F_GETFL)
{
return 0;
}
int res;
if(flags)
{
res = ioctlsocket(fd, FIONBIO, reinterpret_cast<u_long *>(&(flags = 1)));
}
else
{
res = ioctlsocket(fd, FIONBIO, reinterpret_cast<u_long *>(&(flags = 0)));
}
return res;
}

View File

@ -0,0 +1,41 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_FCNTL_H_
#define _THRIFT_WINDOWS_FCNTL_H_ 1
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
#define O_NONBLOCK 1
enum
{
F_GETFL,
F_SETFL,
};
int fcntl(int fd, int cmd, int flags);
#endif // _THRIFT_WINDOWS_FCNTL_H_

View File

@ -0,0 +1,92 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "GetTimeOfDay.h"
#include "config.h"
// win32
#include <time.h>
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
# define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
# define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};
int gettimeofday(struct timeval * tv, struct timezone * tz)
{
FILETIME ft;
unsigned __int64 tmpres(0);
static int tzflag;
if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
/*converting file time to unix epoch*/
tmpres -= DELTA_EPOCH_IN_MICROSECS;
tmpres /= 10; /*convert into microseconds*/
tv->tv_sec = (long)(tmpres / 1000000UL);
tv->tv_usec = (long)(tmpres % 1000000UL);
}
if (NULL != tz)
{
if (!tzflag)
{
_tzset();
tzflag++;
}
long time_zone(0);
errno_t err(_get_timezone(&time_zone));
if (err == NO_ERROR)
{
tz->tz_minuteswest = time_zone / 60;
}
else
{
return -1;
}
int day_light(0);
err = (_get_daylight(&day_light));
if (err == NO_ERROR)
{
tz->tz_dsttime = day_light;
return 0;
}
else
{
return -1;
}
}
return -1;
}

View File

@ -0,0 +1,33 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_GETTIMEOFDAY_H_
#define _THRIFT_WINDOWS_GETTIMEOFDAY_H_
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
int gettimeofday(struct timeval * tv, struct timezone * tz);
#endif // _THRIFT_WINDOWS_GETTIMEOFDAY_H_

View File

@ -0,0 +1,40 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_OPERATORS_H_
#define _THRIFT_WINDOWS_OPERATORS_H_
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
namespace apache { namespace thrift {
class TEnumIterator;
inline bool operator == (const TEnumIterator&, const TEnumIterator&)
{
// Not entirely sure what the test should be here. It is only to enable
// iterator debugging and is not used in release mode.
return true;
}
}} // apache::thrift
#endif // _THRIFT_WINDOWS_OPERATORS_H_

View File

@ -0,0 +1,96 @@
/* socketpair.c
* Copyright 2007 by Nathan C. Myers <ncm@cantrip.org>; some rights reserved.
* This code is Free Software. It may be copied freely, in original or
* modified form, subject only to the restrictions that (1) the author is
* relieved from all responsibilities for any use for any purpose, and (2)
* this copyright notice must be retained, unchanged, in its entirety. If
* for any reason the author might be held responsible for any consequences
* of copying or use, license is withheld.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "SocketPair.h"
// stl
#include <string.h>
// Win32
#include <Winsock2.h>
#include <WS2tcpip.h>
int socketpair(int d, int type, int protocol, int sv[2])
{
union {
struct sockaddr_in inaddr;
struct sockaddr addr;
} a;
SOCKET listener;
int e;
socklen_t addrlen = sizeof(a.inaddr);
DWORD flags = 0;
int reuse = 1;
if (sv == 0) {
WSASetLastError(WSAEINVAL);
return SOCKET_ERROR;
}
listener = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listener == INVALID_SOCKET)
return SOCKET_ERROR;
memset(&a, 0, sizeof(a));
a.inaddr.sin_family = AF_INET;
a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
a.inaddr.sin_port = 0;
sv[0] = sv[1] = INVALID_SOCKET;
do {
if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR,
(char*) &reuse, (socklen_t) sizeof(reuse)) == -1)
break;
if (bind(listener, &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR)
break;
if (getsockname(listener, &a.addr, &addrlen) == SOCKET_ERROR)
break;
if (listen(listener, 1) == SOCKET_ERROR)
break;
sv[0] = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, flags);
if (sv[0] == INVALID_SOCKET)
break;
if (connect(sv[0], &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR)
break;
sv[1] = accept(listener, NULL, NULL);
if (sv[1] == INVALID_SOCKET)
break;
closesocket(listener);
return 0;
} while (0);
e = WSAGetLastError();
closesocket(listener);
closesocket(sv[0]);
closesocket(sv[1]);
WSASetLastError(e);
return SOCKET_ERROR;
}

View File

@ -0,0 +1,33 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_SOCKETPAIR_H_
#define _THRIFT_WINDOWS_SOCKETPAIR_H_ 1
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
int socketpair(int d, int type, int protocol, int sv[2]);
#endif // _THRIFT_WINDOWS_SOCKETPAIR_H_

View File

@ -0,0 +1,20 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "stdafx.h"

View File

@ -0,0 +1,38 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_STDAFX_H_
#define _THRIFT_WINDOWS_STDAFX_H_
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
#include "TargetVersion.h"
#include "Config.h"
// Exclude rarely-used stuff from Windows headers
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#endif // _THRIFT_WINDOWS_STDAFX_H_

View File

@ -0,0 +1,63 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "StdAfx.h"
#include "TWinsockSingleton.h"
// boost
#include <boost/assert.hpp>
namespace apache { namespace thrift { namespace transport {
TWinsockSingleton::instance_ptr TWinsockSingleton::instance_ptr_(NULL);
boost::once_flag TWinsockSingleton::flags_ = BOOST_ONCE_INIT;
//------------------------------------------------------------------------------
TWinsockSingleton::TWinsockSingleton(void)
{
WORD version(MAKEWORD(2, 2));
WSAData data = {0};
int error(WSAStartup(version, &data));
if (error != 0)
{
BOOST_ASSERT(false);
throw std::runtime_error("Failed to initialise Winsock.");
}
}
//------------------------------------------------------------------------------
TWinsockSingleton::~TWinsockSingleton(void)
{
WSACleanup();
}
//------------------------------------------------------------------------------
void TWinsockSingleton::create(void)
{
boost::call_once(init, flags_);
}
//------------------------------------------------------------------------------
void TWinsockSingleton::init(void)
{
instance_ptr_.reset(new TWinsockSingleton);
}
}}} // apache::thrift::transport

View File

@ -0,0 +1,77 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_
#define _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_ 1
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
// boost
#include <boost/noncopyable.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/thread/once.hpp>
namespace apache { namespace thrift { namespace transport {
/**
* Winsock2 must be intialised once only in order to create sockets. This class
* performs a one time initialisation when create is called.
*/
class TWinsockSingleton : private boost::noncopyable
{
public:
typedef boost::scoped_ptr<TWinsockSingleton> instance_ptr;
private:
friend void boost::call_once(void (*func)(void), boost::once_flag& flag);
private:
TWinsockSingleton(void);
public:
~TWinsockSingleton(void);
public:
static void create(void);
private:
static void init(void);
private:
static instance_ptr instance_ptr_;
static boost::once_flag flags_;
};
}}} // apache::thrift::transport
#endif // _THRIFT_TRANSPORT_WINDOWS_TWINSOCKSINGLETON_H_

View File

@ -0,0 +1,33 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THIRFT_WINDOWS_TARGETVERSION_H_
#define _THIRFT_WINDOWS_TARGETVERSION_H_
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
#include <SDKDDKVer.h>
#endif //_THIRFT_WINDOWS_TARGETVERSION_H_

View File

@ -0,0 +1,80 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_CONFIG_H_
#define _THRIFT_WINDOWS_CONFIG_H_ 1
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
#include "TargetVersion.h"
#include "GetTimeOfDay.h"
#include "Operators.h"
#include "TWinsockSingleton.h"
#include "Fcntl.h"
#include "SocketPair.h"
// boost
#include <boost/cstdint.hpp>
typedef boost::int64_t int64_t;
typedef boost::uint32_t uint32_t;
typedef boost::uint8_t uint8_t;
// windows
#include <Winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
// pthreads
#include <pthread.h>
//"asm/posix_types.h"
typedef unsigned int __kernel_size_t;
typedef int __kernel_ssize_t;
//"linux/types.h"
typedef __kernel_size_t size_t;
typedef __kernel_ssize_t ssize_t;
// Missing defines.
#define __BYTE_ORDER __LITTLE_ENDIAN
// Missing functions.
#define usleep(ms) Sleep(ms)
#if WINVER == 0x0501
# define poll(fds, nfds, timeout) \
select(0, NULL, fds, NULL, timeout)
#else
# define poll(fds, nfds, timeout) \
WSAPoll(fds, nfds, timeout)
#endif // WINVER
inline void close(SOCKET socket)
{
::closesocket(socket);
}
#endif // _THRIFT_WINDOWS_CONFIG_H_

View File

@ -0,0 +1,53 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef _THRIFT_WINDOWS_FORCEINC_H_
#define _THRIFT_WINDOWS_FORCEINC_H_
#if defined(_MSC_VER) && (_MSC_VER > 1200)
#pragma once
#endif // _MSC_VER
#ifndef _WIN32
#error This is a MSVC header only.
#endif
#undef gai_strerror
#define gai_strerror gai_strerrorA
#undef errno
#undef EINTR
#undef EINPROGRESS
#undef ECONNRESET
#undef ENOTCONN
#undef ETIMEDOUT
#undef EWOULDBLOCK
#undef EAGAIN
#undef EPIPE
#define errno ::WSAGetLastError()
#define EINPROGRESS WSAEINPROGRESS
#define EAGAIN WSAEWOULDBLOCK
#define EINTR WSAEINTR
#define ECONNRESET WSAECONNRESET
#define ENOTCONN WSAENOTCONN
#define ETIMEDOUT WSAETIMEDOUT
#define EWOULDBLOCK WSAEWOULDBLOCK
#define EPIPE WSAECONNRESET
#endif // _THRIFT_WINDOWS_FORCEINC_H_

View File

@ -0,0 +1,20 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <functional>

31
lib/cpp/thrift.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libthriftnb", "libthriftnb.vcxproj", "{D8696CCE-7D46-4659-B432-91754A41DEB0}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libthrift", "libthrift.vcxproj", "{DD26F57E-60F2-4F37-A616-D219A9BF338F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{006984E0-7CC1-47E2-ACD2-A40FE4D38693}"
ProjectSection(SolutionItems) = preProject
README_WINDOWS = README_WINDOWS
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D8696CCE-7D46-4659-B432-91754A41DEB0}.Debug|Win32.ActiveCfg = Debug|Win32
{D8696CCE-7D46-4659-B432-91754A41DEB0}.Debug|Win32.Build.0 = Debug|Win32
{D8696CCE-7D46-4659-B432-91754A41DEB0}.Release|Win32.ActiveCfg = Release|Win32
{D8696CCE-7D46-4659-B432-91754A41DEB0}.Release|Win32.Build.0 = Release|Win32
{DD26F57E-60F2-4F37-A616-D219A9BF338F}.Debug|Win32.ActiveCfg = Debug|Win32
{DD26F57E-60F2-4F37-A616-D219A9BF338F}.Debug|Win32.Build.0 = Debug|Win32
{DD26F57E-60F2-4F37-A616-D219A9BF338F}.Release|Win32.ActiveCfg = Release|Win32
{DD26F57E-60F2-4F37-A616-D219A9BF338F}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal