Index: cvsapi/RunFile.h =================================================================== RCS file: /cvs/cvsnt/cvsapi/RunFile.h,v retrieving revision 1.1.2.19.4.3 diff -c -r1.1.2.19.4.3 RunFile.h *** cvsapi/RunFile.h 31 Jul 2011 11:58:21 -0000 1.1.2.19.4.3 --- cvsapi/RunFile.h 1 Aug 2011 23:19:45 -0000 *************** *** 45,50 **** --- 45,51 ---- CVSAPI_EXPORT bool wait(int& result, int timeout = -1); CVSAPI_EXPORT bool terminate(); CVSAPI_EXPORT unsigned long processid(); + CVSAPI_EXPORT unsigned long resume(); CVSAPI_EXPORT static int (*const StandardInput)(char *,size_t, void *); CVSAPI_EXPORT static int (*const StandardOutput)(const char *,size_t, void *); *************** *** 61,69 **** int (*m_debugFn)(int type, const char *buf, size_t len, void *userData); void *m_inputData,*m_outputData,*m_errorData,*m_debugData; #ifdef _WIN32 void *m_hProcess; ! void *m_hThread[2]; static unsigned __stdcall _inputThreadProc(void *param); static unsigned __stdcall _outputThreadProc(void *param); unsigned inputThreadProc(); --- 62,74 ---- int (*m_debugFn)(int type, const char *buf, size_t len, void *userData); void *m_inputData,*m_outputData,*m_errorData,*m_debugData; + bool dothread(); + #ifdef _WIN32 void *m_hProcess; ! DWORD m_dwProcessId; ! DWORD m_dwThreadId; ! void *m_hThread[3]; static unsigned __stdcall _inputThreadProc(void *param); static unsigned __stdcall _outputThreadProc(void *param); unsigned inputThreadProc(); Index: cvsapi/mdns_apple.cpp =================================================================== RCS file: /cvs/cvsnt/cvsapi/mdns_apple.cpp,v retrieving revision 1.1.2.6.4.5 diff -c -r1.1.2.6.4.5 mdns_apple.cpp *** cvsapi/mdns_apple.cpp 23 Feb 2011 20:45:44 -0000 1.1.2.6.4.5 --- cvsapi/mdns_apple.cpp 1 Aug 2011 23:09:53 -0000 *************** *** 175,181 **** } void CMdnsHelperApple::_resolve_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, ! const char *fullname, const char *hosttarget, uint16_t opaqueport, uint16_t txtLen, const unsigned char *txtRecord, void *context) { browse_host_t *host = (browse_host_t*)context; --- 175,187 ---- } void CMdnsHelperApple::_resolve_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, ! const char *fullname, const char *hosttarget, uint16_t opaqueport, uint16_t txtLen, ! #if (__APPLE__) && (!defined(__DARWIN_OS__) || __DARWIN_OS__ > 7) ! const unsigned char *txtRecord, ! #else ! const char *txtRecord, ! #endif ! void *context) { browse_host_t *host = (browse_host_t*)context; Index: cvsapi/mdns_apple.h =================================================================== RCS file: /cvs/cvsnt/cvsapi/mdns_apple.h,v retrieving revision 1.1.2.1.4.1 diff -c -r1.1.2.1.4.1 mdns_apple.h *** cvsapi/mdns_apple.h 23 Feb 2011 20:45:44 -0000 1.1.2.1.4.1 --- cvsapi/mdns_apple.h 1 Aug 2011 23:12:27 -0000 *************** *** 54,60 **** void browse_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *replyName, const char *replyType, const char *replyDomain); static void DNSSD_API _resolve_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, ! const char *fullname, const char *hosttarget, uint16_t opaqueport, uint16_t txtLen, const unsigned char *txtRecord, void *context); static void DNSSD_API _query_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, --- 54,66 ---- void browse_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *replyName, const char *replyType, const char *replyDomain); static void DNSSD_API _resolve_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, ! const char *fullname, const char *hosttarget, uint16_t opaqueport, uint16_t txtLen, ! #if (__APPLE__) && (!defined(__DARWIN_OS__) || __DARWIN_OS__ > 7) ! const unsigned char *txtRecord, ! #else ! const char *txtRecord, ! #endif ! void *context); static void DNSSD_API _query_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, Index: cvsapi/unix/RunFile.cpp =================================================================== RCS file: /cvs/cvsnt/cvsapi/unix/RunFile.cpp,v retrieving revision 1.1.2.20.4.7 diff -c -r1.1.2.20.4.7 RunFile.cpp *** cvsapi/unix/RunFile.cpp 31 Jul 2011 11:58:21 -0000 1.1.2.20.4.7 --- cvsapi/unix/RunFile.cpp 1 Aug 2011 23:19:59 -0000 *************** *** 221,226 **** --- 221,232 ---- return m_child; } + // not currently implemented on unix + unsigned long CRunFile::resume() + { + return 0; + } + /* Unix gets no I/O until wait() is called - if we had reliable threads this wouldn't be necessary... fork() isolates the address spaces so is not suitable for this Index: cvsapi/win32/RunFile.cpp =================================================================== RCS file: /cvs/cvsnt/cvsapi/win32/RunFile.cpp,v retrieving revision 1.1.2.28.4.2 diff -c -r1.1.2.28.4.2 RunFile.cpp *** cvsapi/win32/RunFile.cpp 3 Jun 2010 03:53:07 -0000 1.1.2.28.4.2 --- cvsapi/win32/RunFile.cpp 1 Aug 2011 23:20:47 -0000 *************** *** 51,56 **** --- 51,61 ---- m_errorFn=NULL; m_debugFn=NULL; m_hProcess=NULL; + m_dwProcessId=0; + m_hThread[0]=NULL; + m_dwThreadId=0; + m_hThread[1]=NULL; + m_hThread[2]=NULL; } CRunFile::~CRunFile() *************** *** 119,125 **** return true; } ! bool CRunFile::run(const char *path, bool bShow) { STARTUPINFOW si = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pi; --- 124,146 ---- return true; } ! bool CRunFile::dothread() ! { ! m_hThread[1]=m_hThread[2]=NULL; ! if(m_outFd>=0 || m_errFd>=0) ! m_hThread[1]=(void*)_beginthreadex(NULL,0,_outputThreadProc,this,0,NULL); ! if(m_inFd>=0) ! m_hThread[2]=(void*)_beginthreadex(NULL,0,_inputThreadProc,this,0,NULL); ! //else if(!m_inputFn) ! // _close(fd1[PIPE_WRITE]); ! ! WaitForInputIdle(m_hProcess,INFINITE); ! CloseHandle(m_hThread[0]); ! ! return true; ! } ! ! bool CRunFile::run(const char *path, bool bShow /* = false */, bool bSuspend /* = false */) { STARTUPINFOW si = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pi; *************** *** 184,190 **** m_debugFn(4,tmp.c_str(),tmp.length(),m_debugData); } ! status = CreateProcessW(CFileAccess::Win32Wide(path), (LPWSTR)(LPCWSTR)CFileAccess::Win32Wide(args), NULL, NULL, TRUE, 0, 0, 0, &si, &pi); if (! status) { --- 205,211 ---- m_debugFn(4,tmp.c_str(),tmp.length(),m_debugData); } ! status = CreateProcessW(CFileAccess::Win32Wide(path), (LPWSTR)(LPCWSTR)CFileAccess::Win32Wide(args), NULL, NULL, TRUE, (bSuspend)?CREATE_SUSPENDED:0, 0, 0, &si, &pi); if (! status) { *************** *** 212,228 **** } m_hProcess = pi.hProcess; ! m_hThread[0]=m_hThread[1]=NULL; ! if(m_outFd>=0 || m_errFd>=0) ! m_hThread[0]=(void*)_beginthreadex(NULL,0,_outputThreadProc,this,0,NULL); ! if(m_inFd>=0) ! m_hThread[1]=(void*)_beginthreadex(NULL,0,_inputThreadProc,this,0,NULL); ! else if(!m_inputFn) ! _close(fd1[PIPE_WRITE]); ! WaitForInputIdle(pi.hProcess,INFINITE); ! CloseHandle(pi.hThread); if(m_inFd>=0 || !m_inputFn) { --- 233,247 ---- } m_hProcess = pi.hProcess; + m_dwProcessId = pi.dwProcessId; + m_hThread[0] = pi.hThread; + m_dwThreadId = pi.dwThreadId; ! if (!bSuspend) ! dothread(); ! if((m_inFd<0)&&(!m_inputFn)) ! _close(fd1[PIPE_WRITE]); if(m_inFd>=0 || !m_inputFn) { *************** *** 259,278 **** exit = dwErr; } } - if(m_hThread[0]) - { - WaitForSingleObject(m_hThread[0],INFINITE); - CloseHandle(m_hThread[0]); - } if(m_hThread[1]) { WaitForSingleObject(m_hThread[1],INFINITE); CloseHandle(m_hThread[1]); } if(m_hProcess) { CloseHandle(m_hProcess); m_hProcess = NULL; } result=(int)exit; --- 278,302 ---- exit = dwErr; } } if(m_hThread[1]) { WaitForSingleObject(m_hThread[1],INFINITE); CloseHandle(m_hThread[1]); + m_hThread[1] = NULL; + } + if(m_hThread[2]) + { + WaitForSingleObject(m_hThread[2],INFINITE); + CloseHandle(m_hThread[2]); + m_hThread[2] = NULL; } if(m_hProcess) { CloseHandle(m_hProcess); m_hProcess = NULL; + m_dwProcessId = 0; + m_hThread[0] = NULL; + m_dwThreadId = 0; } result=(int)exit; *************** *** 374,403 **** unsigned long CRunFile::processid() { DWORD pid=0; if(m_hProcess) ! pid=GetProcessId(m_hProcess); return pid; } ! bool CRunFile::terminate() { ! if(m_hProcess) ! TerminateProcess(m_hProcess,-1); if(m_hThread[0]) { ! WaitForSingleObject(m_hThread[0],INFINITE); ! CloseHandle(m_hThread[0]); } if(m_hThread[1]) { WaitForSingleObject(m_hThread[1],INFINITE); CloseHandle(m_hThread[1]); } if(m_hProcess) { CloseHandle(m_hProcess); m_hProcess = NULL; } return true; } --- 398,447 ---- unsigned long CRunFile::processid() { + // GetProcessId(m_hProcess): + // Minimum supported client: Windows Vista, Windows XP with SP1 + // Minimum supported server: Windows Server 2003 DWORD pid=0; if(m_hProcess) ! pid=m_dwProcessId; return pid; } ! unsigned long CRunFile::resume() { ! DWORD resume_ret; if(m_hThread[0]) { ! resume_ret = ResumeThread(m_hThread[0]); ! if (resume_ret!=-1) ! dothread(); } + return (resume_ret==-1)?0:m_dwThreadId; + } + + bool CRunFile::terminate() + { + if(m_hProcess) + TerminateProcess(m_hProcess,-1); if(m_hThread[1]) { WaitForSingleObject(m_hThread[1],INFINITE); CloseHandle(m_hThread[1]); + m_hThread[1] = NULL; + } + if(m_hThread[2]) + { + WaitForSingleObject(m_hThread[2],INFINITE); + CloseHandle(m_hThread[2]); + m_hThread[2] = NULL; } if(m_hProcess) { CloseHandle(m_hProcess); + m_dwProcessId = 0; m_hProcess = NULL; + m_hThread[0] = NULL; + m_dwThreadId = 0; } return true; }