WindowsSDKv7.1を搭載したWindows7マシンのソースからOpenJDK6をコンパイルしようとしています。
いくつかの調整を行った後、私は本当に何をすべきかわからないところに到達しました。
47行目と49行目:
static int POLLIN = 1; // line 47
static int POLLCONN = 2;
static int POLLOUT = 4; // line 49
問題は、インクルードされたファイルwinsock2.hに次のコードが含まれていることです。
#if(_WIN32_WINNT >= 0x0600)
/* Event flag definitions for WSAPoll(). */
#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400
#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020
#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004
typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
#endif // (_WIN32_WINNT >= 0x0600)
winsock2#definesPOLLIN
とPOLLOUT
、が、WindowsSelectorImpl.cがそれらをconstsとして宣言していることに注目してください。さらに悪いことに、両方とも異なる値を与えます。
OpenJDK:
POLLIN = 1
POLLOUT = 4
WinSock2(Windows SDK v7.1):
POLLIN = 0x300
POLLOUT = 0x10
明らかに、OpenJDKコードはWindows7でコンパイルされることは想定されていません。
ただし、Windows7でコンパイルしたいと思います。
オプションの1つは、古いWindowsSDKをインストールすることです。もう1つは、ファイルWindowsSelectorImpl.cを変更することです。問題は、どのように行うかです。私の意図は定数の名前を変更することですが、WinSock2 #defining定数をまったく同じ名前で、値が異なることについて疑問に思わずにはいられません...
何かアドバイスはありますか?
編集1
考え直してみると、WinSock2の値を条件付きで使用したほうがいいのではないでしょうか。つまり、値の変更はおそらくAPIの変更を意味します。
WinSock2.hは、pollfdを次のように定義します。
typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
vs WindowsSelectorImpl.c:
typedef struct {
jint fd;
jshort events;
} pollfd;
前者は後者と下位互換性があります(多かれ少なかれ、アライメントは別として)。
したがって、WinSock2定数がWindows 7に適している可能性がありますが、それではどうすればよいPOLLCONN
でしょうか。また、コードはWindows 2003またはXPでどのように実行されますか?
EDIT2
Cの実装にはJavaで対応するものがあるため、事態はさらに悪化します-http ://hg.openjdk.java.net/jdk6/jdk6/jdk/file/tip/src/windows/classes/sun/nio/ch/ WindowsSelectorImpl.javaは、Cコードと同じ定数を使用します。
わかりません。Windows 7のwinsock2は、Windows 2003 SP1のwinsock2用に記述されたコードを壊しますか?
EDIT3
jdk7uソース(WindowsSelectorImpl.cおよびAbstractPollArrayWrapper.java)を確認しました。これは名前変更アプローチを使用します。つまり、Windows SDK v7.1が異なる値でPOLLINとPOLLOUTを宣言していても、jdk7はjdk6の実装に固執します。
私はそれが何を意味するのか本当にわかりませんが、私はここで教皇よりもカトリックになるつもりはありません。