initial changes for win port

This commit is contained in:
unknown 2009-09-07 15:41:43 +02:00
parent 87ccbb9fae
commit f895426c18
14 changed files with 764 additions and 25 deletions

View File

@ -25,7 +25,6 @@ extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
#if defined MSC_VER && defined ZMQ_BUILDING_LIBZMQ
#define ZMQ_EXPORT __declspec(dllexport)
@ -35,6 +34,8 @@ extern "C" {
// Maximal size of "Very Small Message". VSMs are passed by value
// to avoid excessive memory allocation/deallocation.
// If VMSs larger than 255 bytes are required, type of 'vsm_size'
// field in zmq_msg_t structure should be modified accordingly.
#define ZMQ_MAX_VSM_SIZE 30
// Message & notification types.
@ -98,7 +99,7 @@ struct zmq_msg_t
{
void *content;
unsigned char shared;
uint16_t vsm_size;
unsigned char vsm_size;
unsigned char vsm_data [ZMQ_MAX_VSM_SIZE];
};

520
msvc/libzmq/libzmq.vcproj Normal file
View File

@ -0,0 +1,520 @@
<?xml version="1.0" encoding="windows-1250"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="libzmq"
ProjectGUID="{641C5F36-32EE-4323-B740-992B651CF9D6}"
RootNamespace="libzmq"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine="copy ..\platform.hpp ..\..\src"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine="copy ..\platform.hpp ..\..\src"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath="..\..\src\app_thread.cpp"
>
</File>
<File
RelativePath="..\..\src\devpoll.cpp"
>
</File>
<File
RelativePath="..\..\src\dispatcher.cpp"
>
</File>
<File
RelativePath="..\..\src\epoll.cpp"
>
</File>
<File
RelativePath="..\..\src\err.cpp"
>
</File>
<File
RelativePath="..\..\src\fd_signaler.cpp"
>
</File>
<File
RelativePath="..\..\src\io_object.cpp"
>
</File>
<File
RelativePath="..\..\src\io_thread.cpp"
>
</File>
<File
RelativePath="..\..\src\ip.cpp"
>
</File>
<File
RelativePath="..\..\src\kqueue.cpp"
>
</File>
<File
RelativePath="..\..\src\object.cpp"
>
</File>
<File
RelativePath="..\..\src\options.cpp"
>
</File>
<File
RelativePath="..\..\src\owned.cpp"
>
</File>
<File
RelativePath="..\..\src\pipe.cpp"
>
</File>
<File
RelativePath="..\..\src\poll.cpp"
>
</File>
<File
RelativePath="..\..\src\select.cpp"
>
</File>
<File
RelativePath="..\..\src\session.cpp"
>
</File>
<File
RelativePath="..\..\src\socket_base.cpp"
>
</File>
<File
RelativePath="..\..\src\tcp_connecter.cpp"
>
</File>
<File
RelativePath="..\..\src\tcp_listener.cpp"
>
</File>
<File
RelativePath="..\..\src\tcp_socket.cpp"
>
</File>
<File
RelativePath="..\..\src\thread.cpp"
>
</File>
<File
RelativePath="..\..\src\uuid.cpp"
>
</File>
<File
RelativePath="..\..\src\ypollset.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_connecter.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_connecter_init.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_decoder.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_encoder.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_engine.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_listener.cpp"
>
</File>
<File
RelativePath="..\..\src\zmq_listener_init.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\..\src\app_thread.hpp"
>
</File>
<File
RelativePath="..\..\src\atomic_bitmap.hpp"
>
</File>
<File
RelativePath="..\..\src\atomic_counter.hpp"
>
</File>
<File
RelativePath="..\..\src\atomic_ptr.hpp"
>
</File>
<File
RelativePath="..\..\src\command.hpp"
>
</File>
<File
RelativePath="..\..\src\config.hpp"
>
</File>
<File
RelativePath="..\..\src\decoder.hpp"
>
</File>
<File
RelativePath="..\..\src\devpoll.hpp"
>
</File>
<File
RelativePath="..\..\src\dispatcher.hpp"
>
</File>
<File
RelativePath="..\..\src\encoder.hpp"
>
</File>
<File
RelativePath="..\..\src\epoll.hpp"
>
</File>
<File
RelativePath="..\..\src\err.hpp"
>
</File>
<File
RelativePath="..\..\src\fd.hpp"
>
</File>
<File
RelativePath="..\..\src\fd_signaler.hpp"
>
</File>
<File
RelativePath="..\..\src\i_endpoint.hpp"
>
</File>
<File
RelativePath="..\..\src\i_engine.hpp"
>
</File>
<File
RelativePath="..\..\src\i_inout.hpp"
>
</File>
<File
RelativePath="..\..\src\i_poll_events.hpp"
>
</File>
<File
RelativePath="..\..\src\i_poller.hpp"
>
</File>
<File
RelativePath="..\..\src\i_signaler.hpp"
>
</File>
<File
RelativePath="..\..\src\io_object.hpp"
>
</File>
<File
RelativePath="..\..\src\io_thread.hpp"
>
</File>
<File
RelativePath="..\..\src\ip.hpp"
>
</File>
<File
RelativePath="..\..\src\kqueue.hpp"
>
</File>
<File
RelativePath="..\..\src\msg_content.hpp"
>
</File>
<File
RelativePath="..\..\src\mutex.hpp"
>
</File>
<File
RelativePath="..\..\src\object.hpp"
>
</File>
<File
RelativePath="..\..\src\options.hpp"
>
</File>
<File
RelativePath="..\..\src\owned.hpp"
>
</File>
<File
RelativePath="..\..\src\pipe.hpp"
>
</File>
<File
RelativePath="..\platform.hpp"
>
</File>
<File
RelativePath="..\..\src\poll.hpp"
>
</File>
<File
RelativePath="..\..\src\select.hpp"
>
</File>
<File
RelativePath="..\..\src\session.hpp"
>
</File>
<File
RelativePath="..\..\src\simple_semaphore.hpp"
>
</File>
<File
RelativePath="..\..\src\socket_base.hpp"
>
</File>
<File
RelativePath="..\..\src\stdint.hpp"
>
</File>
<File
RelativePath="..\..\src\tcp_connecter.hpp"
>
</File>
<File
RelativePath="..\..\src\tcp_listener.hpp"
>
</File>
<File
RelativePath="..\..\src\tcp_socket.hpp"
>
</File>
<File
RelativePath="..\..\src\thread.hpp"
>
</File>
<File
RelativePath="..\..\src\uuid.hpp"
>
</File>
<File
RelativePath="..\..\src\windows.hpp"
>
</File>
<File
RelativePath="..\..\src\wire.hpp"
>
</File>
<File
RelativePath="..\..\src\ypipe.hpp"
>
</File>
<File
RelativePath="..\..\src\ypollset.hpp"
>
</File>
<File
RelativePath="..\..\src\yqueue.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_connecter.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_connecter_init.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_decoder.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_encoder.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_engine.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_listener.hpp"
>
</File>
<File
RelativePath="..\..\src\zmq_listener_init.hpp"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

20
msvc/msvc.sln Normal file
View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzmq", "libzmq\libzmq.vcproj", "{641C5F36-32EE-4323-B740-992B651CF9D6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{641C5F36-32EE-4323-B740-992B651CF9D6}.Debug|Win32.ActiveCfg = Debug|Win32
{641C5F36-32EE-4323-B740-992B651CF9D6}.Debug|Win32.Build.0 = Debug|Win32
{641C5F36-32EE-4323-B740-992B651CF9D6}.Release|Win32.ActiveCfg = Release|Win32
{641C5F36-32EE-4323-B740-992B651CF9D6}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

59
msvc/platform.hpp Normal file
View File

@ -0,0 +1,59 @@
/*
Copyright (c) 2007-2009 FastMQ Inc.
This file is part of 0MQ.
0MQ is free software; you can redistribute it and/or modify it under
the terms of the Lesser GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
0MQ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Lesser GNU General Public License for more details.
You should have received a copy of the Lesser GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ZMQ_PLATFORM_HPP_INCLUDED__
#define __ZMQ_PLATFORM_HPP_INCLUDED__
// This is the platform definition for the Windows platform.
// As a first step of the build process it is copied to
// zmq directory to take place of platform.hpp generated from
// platform.hpp.in on platforms supported by GNU autotools.
#define ZMQ_HAVE_WINDOWS
#define _WINSOCKAPI_
#define NOMINMAX
#define _CRT_SECURE_NO_WARNINGS
// Turn on only the items zmq needs on the Windows platform.
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef NOMCX // No Modem Configuration Extensions.
#define NOMCX
#endif
#ifndef NOIME // No Input Method Editor.
#define NOIME
#endif
#ifndef NOSOUND // No Sound driver routines.
#define NOSOUND
#endif
#include <windows.h>
#include <objbase.h>
// Enable winsock (not included when WIN32_LEAN_AND_MEAN is defined).
#if(_WIN32_WINNT >= 0x0400)
#include <winsock2.h>
#include <mswsock.h>
#else
#include <winsock.h>
#endif
#endif

View File

@ -21,6 +21,8 @@
#include "../include/zmq.h"
#include "platform.hpp"
#if defined ZMQ_HAVE_WINDOWS
#include "windows.hpp"
#else

View File

@ -21,6 +21,7 @@
#include "platform.hpp"
#include "err.hpp"
#include "fd.hpp"
#include "ip.hpp"
#if defined ZMQ_HAVE_OPENVMS
#include <netinet/tcp.h>

View File

@ -22,6 +22,8 @@
#include <string>
#include "stdint.hpp"
namespace zmq
{

View File

@ -17,9 +17,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <pthread.h>
#include <../include/zmq.h>
#include "../include/zmq.h"
#include "pipe.hpp"

View File

@ -26,8 +26,79 @@
#ifdef ZMQ_HAVE_WINDOWS
#include "windows.hpp"
#error
zmq::tcp_connecter_t::tcp_connecter_t () :
s (retired_fd)
{
memset (&addr, 0, sizeof (addr));
}
zmq::tcp_connecter_t::~tcp_connecter_t ()
{
if (s != retired_fd)
close ();
}
int zmq::tcp_connecter_t::set_address (const char *addr_)
{
// Convert the hostname into sockaddr_in structure.
return resolve_ip_hostname (&addr, addr_);
}
int zmq::tcp_connecter_t::open ()
{
zmq_assert (s == retired_fd);
// Create the socket.
s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
// TODO: Convert error to errno.
wsa_assert (s != INVALID_SOCKET);
// Set to non-blocking mode.
unsigned long argp = 1;
int rc = ioctlsocket (s, FIONBIO, &argp);
wsa_assert (rc != SOCKET_ERROR);
// Disable Nagle's algorithm.
int flag = 1;
rc = setsockopt (s, IPPROTO_TCP, TCP_NODELAY, (char*) &flag,
sizeof (int));
wsa_assert (rc != SOCKET_ERROR);
// Connect to the remote peer.
rc = ::connect (s, (sockaddr*) &addr, sizeof addr);
// Connect was successfull immediately.
if (rc == 0)
return 0;
// Asynchronous connect was launched.
if (rc == SOCKET_ERROR && (WSAGetLastError () == WSAEINPROGRESS ||
WSAGetLastError () == WSAEWOULDBLOCK)) {
errno = EAGAIN;
return -1;
}
// TODO: Convert error to errno.
wsa_assert (rc == 0);
return -1;
}
int zmq::tcp_connecter_t::close ()
{
zmq_assert (s != retired_fd);
int rc = closesocket (s);
wsa_assert (rc != SOCKET_ERROR);
s = retired_fd;
return 0;
}
zmq::fd_t zmq::tcp_connecter_t::get_fd ()
{
return s;
}
// connect
#else

View File

@ -27,7 +27,6 @@
#ifdef ZMQ_HAVE_WINDOWS
#include "windows.hpp"
#error
#else

View File

@ -23,8 +23,75 @@
#ifdef ZMQ_HAVE_WINDOWS
#include "windows.hpp"
#error
zmq::tcp_socket_t::tcp_socket_t () :
s (retired_fd)
{
}
zmq::tcp_socket_t::~tcp_socket_t ()
{
if (s != retired_fd)
close ();
}
int zmq::tcp_socket_t::open (fd_t fd_)
{
zmq_assert (s == retired_fd);
s = fd_;
return 0;
}
int zmq::tcp_socket_t::close ()
{
zmq_assert (s != retired_fd);
int rc = closesocket (s);
wsa_assert (rc != SOCKET_ERROR);
s = retired_fd;
return 0;
}
int zmq::tcp_socket_t::write (const void *data, int size)
{
int nbytes = send (s, (char*) data, size, 0);
// If not a single byte can be written to the socket in non-blocking mode
// we'll get an error (this may happen during the speculative write).
if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK)
return 0;
// Signalise peer failure.
if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAECONNRESET)
return -1;
wsa_assert (nbytes != SOCKET_ERROR);
return (size_t) nbytes;
}
int zmq::tcp_socket_t::read (void *data, int size)
{
int nbytes = recv (s, (char*) data, size, 0);
// If not a single byte can be read from the socket in non-blocking mode
// we'll get an error (this may happen during the speculative read).
if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK)
return 0;
// Connection failure.
if (nbytes == -1 && (
WSAGetLastError () == WSAECONNRESET ||
WSAGetLastError () == WSAECONNREFUSED ||
WSAGetLastError () == WSAENOTCONN))
return -1;
wsa_assert (nbytes != SOCKET_ERROR);
// Orderly shutdown by the other peer.
if (nbytes == 0)
return -1;
return (size_t) nbytes;
}
#else
@ -113,4 +180,3 @@ int zmq::tcp_socket_t::read (void *data, int size)
}
#endif

View File

@ -23,25 +23,28 @@
#if defined ZMQ_HAVE_WINDOWS
#include <rpcdce.h>
zmq::uuid_t::uuid_t ()
{
RPC_STATUS ret = UuidCreate (&uuid);
zmq_assert (ret == RPC_S_OK);
ret = UuidToString (&uuid, &uuid_str);
zmq_assert (ret == RPC_S_OK);
/*
HRESULT hr = CoCreateGUID (&uuid);
zmq_assert (hr == S_OK);
int rc = StringFromGUID2 (uuid, uuid_str, 40);
zmq_assert (rc != 0);
*/
}
zmq::uuid_t::~uuid_t ()
{
RPC_STATUS ret = RpcStringFree(&uuid_str);
assert (ret == RPC_S_OK);
}
const char *zmq::uuid_t::to_string ()
{
return uuid_str;
return (char*) uuid_str;
}
#elif defined ZMQ_HAVE_FREEBSD

View File

@ -21,15 +21,12 @@
#define __ZMQ_UUID_HPP_INCLUDED__
#include "platform.hpp"
#include "stdint.hpp"
#if defined ZMQ_HAVE_WINDOWS
#include <rpcdce.h>
#elif defined ZMQ_HAVE_FREEBSD
#if defined ZMQ_HAVE_FREEBSD
#include <uuid.h>
#elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX
#include <uuid/uuid.h>
#else
#include <stdint.h>
#endif
namespace zmq
@ -57,7 +54,7 @@ namespace zmq
#if defined ZMQ_HAVE_WINDOWS
::UUID uuid;
char *uuid_str;
RPC_CSTR uuid_str;
#elif defined ZMQ_HAVE_FREEBSD
::uuid_t uuid;
char *uuid_str;

View File

@ -106,7 +106,7 @@ void zmq::zmq_connecter_t::start_connecting ()
}
// Connection establishment may be dealyed. Poll for its completion.
else if (rc == -1 && errno == EINPROGRESS) {
else if (rc == -1 && errno == EAGAIN) {
handle = add_fd (tcp_connecter.get_fd ());
handle_valid = true;
set_pollout (handle);