From bc8940841ef624d6df8ef29cb8cc2c2262e6d6bb Mon Sep 17 00:00:00 2001 From: Fons Rademakers <Fons.Rademakers@cern.ch> Date: Tue, 18 Apr 2006 10:34:35 +0000 Subject: [PATCH] From Bertrand: port of new xrootd based PROOF infrastructure to Windows. git-svn-id: http://root.cern.ch/svn/root/trunk@14732 27541ba8-7e3a-0410-8455-c3a389f83636 --- Makefile | 3 ++ config/Makefile.depend | 2 +- netx/Module.mk | 4 +++ proofd/Module.mk | 65 ++++++++++++++++++++++++++++++++++ proofd/inc/XrdProofdTrace.h | 4 +-- proofd/src/XrdProofConn.cxx | 19 +++++++++- proofd/src/XrdProofPhyConn.cxx | 17 ++++++++- proofx/Module.mk | 12 +++++++ proofx/inc/LinkDef.h | 6 ++-- proofx/src/TXSocket.cxx | 16 ++++++++- win32gdk/src/TGWin32.cxx | 5 +-- winnt/src/TWinNTSystem.cxx | 15 +++++++- xrootd/Module.mk | 59 ++++++++++++++++++++++++++++++ 13 files changed, 216 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 93b9141beeb..be620c26826 100644 --- a/Makefile +++ b/Makefile @@ -198,6 +198,9 @@ ifneq ($(ARCH),win32) MODULES += rpdutils rootd proofd endif ifeq ($(BUILDXRD),yes) +ifeq ($(ARCH),win32) +MODULES += proofd +endif MODULES += proofx endif diff --git a/config/Makefile.depend b/config/Makefile.depend index e20d6dff64e..591c56ea0f7 100644 --- a/config/Makefile.depend +++ b/config/Makefile.depend @@ -52,7 +52,7 @@ PROOFLIBDEP = $(TREELIB) $(G3DLIB) $(GRAFLIB) $(HISTLIB) \ PROOFLIBEXTRA = lib/libTree.lib lib/libGraf3d.lib lib/libGraf.lib \ lib/libHist.lib lib/libTreePlayer.lib lib/libThread.lib PROOFXLIBDEP = $(PROOFLIB) $(XPDLIB) -PROOFXLIBEXTRA = lib/libProof.lib lib/libXrdProofd +PROOFXLIBEXTRA = lib/libProof.lib lib/libXrdProofd.lib PROOFGUILIBDEP = $(PROOFLIB) $(GUILIB) PROOFGUILIBEXTRA = lib/libProof.lib lib/libGui.lib PEACLIBDEP = $(PROOFLIB) $(CLARENSLIB) diff --git a/netx/Module.mk b/netx/Module.mk index 3dc45c28219..2f5dc7058d1 100644 --- a/netx/Module.mk +++ b/netx/Module.mk @@ -49,8 +49,12 @@ endif NETXINCEXTRA := $(XROOTDDIRI:%=-I%) # Xrootd client libs +ifeq ($(PLATFORM),win32) +NETXLIBEXTRA += $(XROOTDDIRL)/libXrdClient.lib +else NETXLIBEXTRA += $(XROOTDDIRL)/libXrdClient.a $(XROOTDDIRL)/libXrdOuc.a \ $(XROOTDDIRL)/libXrdNet.a +endif ##### local rules ##### include/%.h: $(NETXDIRI)/%.h diff --git a/proofd/Module.mk b/proofd/Module.mk index a31319ef6c6..cdb66f723b5 100644 --- a/proofd/Module.mk +++ b/proofd/Module.mk @@ -11,6 +11,69 @@ PROOFDDIR := $(MODDIR) PROOFDDIRS := $(PROOFDDIR)/src PROOFDDIRI := $(PROOFDDIR)/inc +ifeq ($(PLATFORM),win32) + +##### XrdProofd plugin #### +XPDH := $(wildcard $(MODDIRI)/X*.h) +XPDS := $(wildcard $(MODDIRS)/X*.cxx) +XPDO := $(XPDS:.cxx=.o) +XPDO := $(MODDIRS)/XProofProtUtils.o + + +##### Object files used by libProofx ##### +XPCONNH := $(MODDIRI)/XrdProofConn.h $(MODDIRI)/XrdProofPhyConn.h \ + $(MODDIRI)/XProofProtUtils.h + +XPCONNS := $(MODDIRS)/XrdProofConn.cxx $(MODDIRS)/XrdProofPhyConn.cxx \ + $(MODDIRS)/XProofProtUtils.cxx + +XPCONNO := $(MODDIRS)/XrdProofConn.o $(MODDIRS)/XrdProofPhyConn.o \ + $(MODDIRS)/XProofProtUtils.o + +XPDDEP := $(XPCONNO:.o=.d) + +XPDLIB := $(LPATH)/libXrdProofd.$(SOEXT) + +# Extra include paths and libs +XPDINCEXTRA := $(XROOTDDIRI:%=-I%) +XPDINCEXTRA += $(PROOFDDIRI:%=-I%) + +XPDLIBEXTRA += $(XROOTDDIRL)/libXrdClient.lib + +# used in the main Makefile +PROOFDEXEH := $(MODDIRI)/proofdp.h +ALLHDRS += $(patsubst $(MODDIRI)/%.h,include/%.h,$(PROOFDEXEH)) +ALLLIBS += $(XPDLIB) + +# include all dependency files +INCLUDEFILES += $(XPDDEP) + +##### local rules ##### +include/%.h: $(PROOFDDIRI)/%.h + cp $< $@ + +$(XPDLIB): $(XPCONNO) $(XPCONNH) $(XRDPLUGINS) $(ORDER_) $(MAINLIBS) + @$(MAKELIB) $(PLATFORM) $(LD) "$(LDFLAGS)" \ + "$(SOFLAGS)" libXrdProofd.$(SOEXT) $@ "$(XPDO)" \ + "$(XPDLIBEXTRA)" + +all-proofd: $(XPDLIB) + +clean-proofd: + @rm -f $(XPCONNO) + +clean:: clean-proofd + +distclean-proofd: clean-proofd + @rm -f $(XPDDEP) $(XPDLIB) + +distclean:: distclean-proofd + +##### extra rules ###### +$(XPCONNO): CXXFLAGS += $(XPDINCEXTRA) + +else + ##### proofd ##### PROOFDEXEH := $(MODDIRI)/proofdp.h PROOFDEXES := $(MODDIRS)/proofd.cxx @@ -106,3 +169,5 @@ else $(XPDO): CXXFLAGS += $(XPDINCEXTRA) endif endif + +endif diff --git a/proofd/inc/XrdProofdTrace.h b/proofd/inc/XrdProofdTrace.h index d850f0f387f..1828cedfb19 100644 --- a/proofd/inc/XrdProofdTrace.h +++ b/proofd/inc/XrdProofdTrace.h @@ -1,4 +1,4 @@ -// @(#)root/proofd:$Name: $:$Id: proofdp.h,v 1.4 2003/08/29 10:41:28 rdm Exp $ +// @(#)root/proofd:$Name: $:$Id: XrdProofdTrace.h,v 1.2 2006/03/01 15:46:33 rdm Exp $ // Author: G. Ganis June 2005 /************************************************************************* @@ -38,7 +38,7 @@ //#define NODEBUG #ifndef NODEBUG -#include <iostream.h> +#include <Riostream.h> #include "XrdOuc/XrdOucTrace.hh" #define PRINT(x) \ diff --git a/proofd/src/XrdProofConn.cxx b/proofd/src/XrdProofConn.cxx index 37d20085936..7fa9473bc27 100644 --- a/proofd/src/XrdProofConn.cxx +++ b/proofd/src/XrdProofConn.cxx @@ -1,4 +1,4 @@ -// @(#)root/proofd:$Name: $:$Id: XrdProofConn.cxx,v 1.5 2006/03/16 09:08:08 rdm Exp $ +// @(#)root/proofd:$Name: $:$Id: XrdProofConn.cxx,v 1.6 2006/03/20 21:24:59 rdm Exp $ // Author: Gerardo Ganis 12/12/2005 /************************************************************************* @@ -45,10 +45,12 @@ #endif #endif +#ifndef WIN32 #include <dlfcn.h> #if !defined(__APPLE__) #include <link.h> #endif +#endif // Tracing utils #include "XrdProofdTrace.h" @@ -56,9 +58,14 @@ extern XrdOucTrace *XrdProofdTrace; static const char *TraceID = " "; #define TRACEID TraceID +#ifndef WIN32 #include <sys/socket.h> #include <sys/types.h> #include <pwd.h> +#else +#include <process.h> +#include <Winsock2.h> +#endif // Security handle typedef XrdSecProtocol *(*XrdSecGetProt_t)(const char *, const struct sockaddr &, @@ -856,10 +863,18 @@ bool XrdProofConn::Login() reqhdr.login.pid = getpid(); // Get username from Url +#ifndef WIN32 struct passwd *pw = getpwuid(getuid()); if (fUser.length() <= 0 && pw) // Use local username, if not specified fUser = pw->pw_name; +#else + char name[256]; + DWORD length = sizeof (name); + ::GetUserName(name, &length); + if (fUser.length() <= 0 && strlen(name) > 1) + fUser = name; +#endif if (fUser.length() >= 0) strcpy( (char *)reqhdr.login.username, (char *)(fUser.c_str()) ); else @@ -931,9 +946,11 @@ bool XrdProofConn::Login() putenv(s); // netrc file XrdOucString netrc = "/.rootnetrc"; +#ifndef WIN32 if (pw) netrc.insert((char *)(pw->pw_dir),0); else +#endif netrc = ""; if (netrc.length() > 0) { s = new char [strlen("XrdSecNETRC")+netrc.length()+2]; diff --git a/proofd/src/XrdProofPhyConn.cxx b/proofd/src/XrdProofPhyConn.cxx index 807bae7da0e..1e33f981663 100644 --- a/proofd/src/XrdProofPhyConn.cxx +++ b/proofd/src/XrdProofPhyConn.cxx @@ -1,4 +1,4 @@ -// @(#)root/proofd:$Name: $:$Id: XrdProofPhyConn.cxx,v 1.3 2006/03/01 15:46:33 rdm Exp $ +// @(#)root/proofd:$Name: $:$Id: XrdProofPhyConn.cxx,v 1.4 2006/03/16 09:08:08 rdm Exp $ // Author: Gerardo Ganis 12/12/2005 /************************************************************************* @@ -28,9 +28,13 @@ #include "XrdClient/XrdClientMessage.hh" #include "XrdSec/XrdSecInterface.hh" +#ifndef WIN32 #include <sys/socket.h> #include <sys/types.h> #include <pwd.h> +#else +#include <Winsock2.h> +#endif // Tracing utils #include "XrdProofdTrace.h" @@ -68,8 +72,15 @@ bool XrdProofPhyConn::Init(const char *url) if (!fTcp) { // Set some variables +#ifndef WIN32 struct passwd *pw = getpwuid(getuid()); fUser = (pw) ? pw->pw_name : ""; +#else + char name[256]; + DWORD length = sizeof (name); + ::GetUserName(name, &length); + fUser = name; +#endif fHost = "localhost"; fPort = -1; @@ -142,7 +153,11 @@ bool XrdProofPhyConn::Init(const char *url) // And we wait a bit before retrying TRACE(REQ,"XrdProofPhyConn::Init: connection attempt failed: sleep " << timeOut << " secs"); +#ifndef WIN32 sleep(timeOut); +#else + Sleep(timeOut * 1000); +#endif } //for connect try diff --git a/proofx/Module.mk b/proofx/Module.mk index ebb9d1f3ed2..a161b6ec47a 100644 --- a/proofx/Module.mk +++ b/proofx/Module.mk @@ -17,8 +17,15 @@ PROOFXDS := $(MODDIRS)/G__Proofx.cxx PROOFXDO := $(PROOFXDS:.cxx=.o) PROOFXDH := $(PROOFXDS:.cxx=.h) +ifeq ($(PLATFORM),win32) +PROOFXH := $(MODDIRI)/TXProofMgr.h $(MODDIRI)/TXSlave.h \ + $(MODDIRI)/TXSocket.h $(MODDIRI)/TXSocketHandler.h +PROOFXS := $(MODDIRS)/TXProofMgr.cxx $(MODDIRS)/TXSlave.cxx \ + $(MODDIRS)/TXSocket.cxx $(MODDIRS)/TXSocketHandler.cxx +else PROOFXH := $(filter-out $(MODDIRI)/LinkDef%,$(wildcard $(MODDIRI)/*.h)) PROOFXS := $(filter-out $(MODDIRS)/G__%,$(wildcard $(MODDIRS)/*.cxx)) +endif PROOFXO := $(PROOFXS:.cxx=.o) PROOFXDEP := $(PROOFXO:.o=.d) $(PROOFXDO:.o=.d) @@ -51,8 +58,13 @@ PROOFXINCEXTRA += $(XROOTDDIRI:%=-I%) PROOFXINCEXTRA += $(PROOFDDIRI:%=-I%) # Xrootd client libs +ifeq ($(PLATFORM),win32) +PROOFXLIBEXTRA := $(XROOTDDIRL)/libXrdClient.lib +PROOFXLIBEXTRA += $(ROOTSYS)/lib/libThread.lib $(ROOTSYS)/lib/libProof.lib +else PROOFXLIBEXTRA := $(XROOTDDIRL)/libXrdClient.a $(XROOTDDIRL)/libXrdOuc.a \ $(XROOTDDIRL)/libXrdNet.a +endif ##### local rules ##### include/%.h: $(PROOFXDIRI)/%.h diff --git a/proofx/inc/LinkDef.h b/proofx/inc/LinkDef.h index 937264b0dbe..0eac8bb3750 100644 --- a/proofx/inc/LinkDef.h +++ b/proofx/inc/LinkDef.h @@ -1,4 +1,4 @@ -/* @(#)root/netx:$Name: $:$Id: LinkDef.h,v 1.5 2005/10/27 16:36:38 rdm Exp $ */ +/* @(#)root/netx:$Name: $:$Id: LinkDef.h,v 1.1 2005/12/12 12:54:27 rdm Exp $ */ /************************************************************************* * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. * @@ -15,9 +15,11 @@ #pragma link off all functions; #pragma link C++ class TXProofMgr; -#pragma link C++ class TXProofServ; #pragma link C++ class TXSlave; #pragma link C++ class TXSocket; +#ifndef WIN32 +#pragma link C++ class TXProofServ; #pragma link C++ class TXUnixSocket; +#endif #endif diff --git a/proofx/src/TXSocket.cxx b/proofx/src/TXSocket.cxx index c00a4dd660d..11d80ea5c9c 100644 --- a/proofx/src/TXSocket.cxx +++ b/proofx/src/TXSocket.cxx @@ -1,4 +1,4 @@ -// @(#)root/proofx:$Name: $:$Id: TXSocket.cxx,v 1.6 2006/04/07 09:26:19 rdm Exp $ +// @(#)root/proofx:$Name: $:$Id: TXSocket.cxx,v 1.7 2006/04/17 21:04:17 rdm Exp $ // Author: Gerardo Ganis 12/12/2005 /************************************************************************* @@ -38,7 +38,11 @@ #include "XrdClient/XrdClientLogConnection.hh" #include "XrdClient/XrdClientMessage.hh" +#ifndef WIN32 #include <sys/socket.h> +#else +#include <Winsock2.h> +#endif // ---- Tracing utils ---------------------------------------------------------- #include "XrdOuc/XrdOucError.hh" @@ -48,6 +52,11 @@ XrdOucTrace *XrdProofdTrace = 0; static XrdOucLogger eLogger; static XrdOucError eDest(0, "Proofx"); +#ifdef WIN32 +ULong64_t TSocket::fgBytesSent; +ULong64_t TSocket::fgBytesRecv; +#endif + //______________________________________________________________________________ //---- error handling ---------------------------------------------------------- @@ -365,8 +374,13 @@ UnsolRespProcResult TXSocket::ProcessUnsolicitedMsg(XrdClientUnsolMsgSender *, // Signal it if (gDebug > 3) Info("ProcessUnsolicitedMsg","%p: sending SIGURG: %d",this,ilev); +#ifndef WIN32 if (kill(fPid, SIGURG) != 0) { Error("ProcessUnsolicitedMsg","%d: problems sending kSigUrgent", this); +#else + if(!TerminateProcess((HANDLE)fPid, 0)) { + Error("ProcessUnsolicitedMsg","%d: problems calling TerminateProcess()", this); +#endif return rc; } } diff --git a/win32gdk/src/TGWin32.cxx b/win32gdk/src/TGWin32.cxx index 53c985f3d7b..916fbd606d0 100644 --- a/win32gdk/src/TGWin32.cxx +++ b/win32gdk/src/TGWin32.cxx @@ -1,4 +1,4 @@ -// @(#)root/win32gdk:$Name: $:$Id: TGWin32.cxx,v 1.108 2006/02/20 12:02:18 brun Exp $ +// @(#)root/win32gdk:$Name: $:$Id: TGWin32.cxx,v 1.109 2006/03/28 16:35:00 brun Exp $ // Author: Rene Brun, Olivier Couet, Fons Rademakers, Bertrand Bellenot 27/11/01 /************************************************************************* @@ -825,7 +825,8 @@ Bool_t TGWin32::IsCmdThread() const { // returns kTRUE if we are inside cmd/server thread - return (::GetCurrentThreadId() == TGWin32ProxyBase::fgMainThreadId); +// return (::GetCurrentThreadId() == TGWin32ProxyBase::fgMainThreadId); + return kTRUE; } //______________________________________________________________________________ diff --git a/winnt/src/TWinNTSystem.cxx b/winnt/src/TWinNTSystem.cxx index ff6d16a8882..54b187485cf 100644 --- a/winnt/src/TWinNTSystem.cxx +++ b/winnt/src/TWinNTSystem.cxx @@ -1,4 +1,4 @@ -// @(#)root/winnt:$Name: $:$Id: TWinNTSystem.cxx,v 1.133 2006/03/28 23:59:13 rdm Exp $ +// @(#)root/winnt:$Name: $:$Id: TWinNTSystem.cxx,v 1.134 2006/03/29 10:29:32 brun Exp $ // Author: Fons Rademakers 15/09/95 /************************************************************************* @@ -327,6 +327,19 @@ static int WinNTSelect(TFdSet *readready, TFdSet *writeready, Long_t timeout) if (retcode == SOCKET_ERROR) { int errcode = ::WSAGetLastError(); + // if file descriptor is not a socket, assume it is the pipe used + // by TXSocket + if (errcode == WSAENOTSOCK) { + struct __stat64 buf; + int result = _fstat64( readready->GetFd(0), &buf ); + if ( result == 0 ) { + if (buf.st_size > 0) + return 1; + } + SleepEx(1, TRUE); + return 0; + } + if ( errcode == WSAEINTR) { TSystem::ResetErrno(); // errno is not self reseting return -2; diff --git a/xrootd/Module.mk b/xrootd/Module.mk index 76bae8abd99..ae9c96f2a40 100644 --- a/xrootd/Module.mk +++ b/xrootd/Module.mk @@ -16,31 +16,55 @@ XROOTDSRCS := $(MODDIRS)/$(XROOTDVERS).src.tgz XROOTDETAG := $(MODDIRS)/headers.d ##### Xrootd config options ##### +ifeq ($(PLATFORM),win32) +ifeq (debug,$(findstring debug,$(ROOTBUILD))) +XRDDBG = "Win32 Debug" +else +XRDDBG = "Win32 Release" +endif +else ifeq (debug,$(findstring debug,$(ROOTBUILD))) XRDDBG = "--build=debug" else XRDDBG = endif +endif ifeq ($(PLATFORM),macosx) XRDSOEXT = so else XRDSOEXT = $(SOEXT) endif +ifeq ($(PLATFORM),win32) +XRDSOEXT = lib +endif ##### Xrootd executables ##### +ifneq ($(PLATFORM),win32) XRDEXEC = xrootd olbd xrdcp xrdpwdadmin xrdgsiproxy +else +XRDEXEC = xrdcp.exe +endif XRDEXECS := $(patsubst %,bin/%,$(XRDEXEC)) ##### Xrootd plugins ##### +ifeq ($(PLATFORM),win32) +XRDPLUGINSA:= $(XROOTDDIRL)/libXrdClient.$(XRDSOEXT) +XRDPLUGINS := $(XRDPLUGINSA) +else XRDPLUGINSA:= $(XROOTDDIRL)/libXrdSec.$(XRDSOEXT) XRDPLUGINS := $(LPATH)/libXrdSec.$(XRDSOEXT) ifeq ($(ARCH),win32gcc) XRDPLUGINS := $(patsubst $(LPATH)/%.$(XRDSOEXT),bin/%.$(XRDSOEXT),$(XRDPLUGINS)) endif +endif # used in the main Makefile ALLLIBS += $(XRDPLUGINS) +#ifneq ($(PLATFORM),win32) ALLEXECS += $(XRDEXECS) +#else +#ALLEXECS += $(XRDPLUGINS) +#endif ##### local rules ##### $(XROOTDETAG): $(XROOTDSRCS) @@ -54,7 +78,27 @@ $(XROOTDETAG): $(XROOTDSRCS) etag=`basename $(XROOTDETAG)` ; \ touch $$etag ; \ fi) +ifeq ($(PLATFORM),win32) + @(if [ -d $(XROOTDDIRD)/pthreads-win32 ]; then \ + lsplug=`find $(XROOTDDIRD)/pthreads-win32/lib -name "*.dll"` ; \ + for i in $$lsplug ; do \ + echo "Copying $$i ..." ; \ + cp $$i "$(ROOTSYS)/bin" ; \ + done ; \ + lsplug=`find $(XROOTDDIRD)/pthreads-win32/lib -name "*.lib"` ; \ + for i in $$lsplug ; do \ + echo "Copying $$i ..." ; \ + cp $$i "$(ROOTSYS)/lib" ; \ + done ; \ + lsplug=`find $(XROOTDDIRD)/pthreads-win32/include -name "*.h"` ; \ + for i in $$lsplug ; do \ + echo "Copying $$i ..." ; \ + cp $$i "$(ROOTSYS)/include" ; \ + done ; \ + fi) +endif +ifneq ($(PLATFORM),win32) $(XRDPLUGINS): $(XRDPLUGINSA) @(if [ -d $(XROOTDDIRL) ]; then \ lsplug=`find $(XROOTDDIRL) -name "libXrd*.$(XRDSOEXT)"` ; \ @@ -70,6 +114,7 @@ $(XRDPLUGINS): $(XRDPLUGINSA) fi; \ done ; \ fi) +endif $(XRDEXECS): $(XRDPLUGINSA) @(for i in $(XRDEXEC); do \ @@ -84,6 +129,7 @@ $(XRDEXECS): $(XRDPLUGINSA) fi ; \ done) +ifneq ($(PLATFORM),win32) $(XRDPLUGINSA): $(XROOTDETAG) @(cd $(XROOTDDIRS); \ RELE=`uname -r`; \ @@ -127,14 +173,27 @@ $(XRDPLUGINSA): $(XROOTDETAG) echo "*** Error condition reported by Xrootd-configure (rc = $$rc):" \ " building only the client ... " ; \ fi) +else +$(XRDPLUGINSA): $(XROOTDETAG) + @(cd $(XROOTDDIRD); \ + echo "*** Building xrootd..."; \ + unset MAKEFLAGS; \ + nmake -f Makefile.msc CFG=$(XRDDBG)) +endif all-xrootd: $(XRDPLUGINS) $(XRDEXECS) clean-xrootd: +ifneq ($(PLATFORM),win32) -@(if [ -d $(XROOTDDIRD)/config ]; then \ cd $(XROOTDDIRD); \ $(MAKE) clean; \ fi) +else + @(if [ -d $(XROOTDDIRD) ]; then \ + rm -rf $(XROOTDDIRD); \ + fi;) +endif clean:: clean-xrootd -- GitLab