Replaced globals with argument to thread procedure

This commit is contained in:
vylsaz 2024-02-04 02:35:47 +00:00
parent 74d3620839
commit 42e4956fb9
2 changed files with 58 additions and 55 deletions

View File

@ -1120,7 +1120,7 @@ B sh_c2(B t, B w, B x) {
bool any = false; bool any = false;
if (ps[out_i].revents & POLLIN) while(true) { i64 len = read(p_out[0], &oBuf[0], bufsz); shDbg("read stdout "N64d"\n",len); if(len<=0) break; else any=true; *oBufIA = len; s_out = vec_join(s_out, incG(oBufObj)); } if (ps[out_i].revents & POLLIN) while(true) { i64 len = read(p_out[0], &oBuf[0], bufsz); shDbg("read stdout "N64d"\n",len); if(len<=0) break; else any=true; *oBufIA = len; s_out = vec_join(s_out, incG(oBufObj)); }
if (ps[err_i].revents & POLLIN) while(true) { i64 len = read(p_err[0], &oBuf[0], bufsz); shDbg("read stderr "N64d"\n",len); if(len<=0) break; else any=true; *oBufIA = len; s_err = vec_join(s_err, incG(oBufObj)); } if (ps[err_i].revents & POLLIN) while(true) { i64 len = read(p_err[0], &oBuf[0], bufsz); shDbg("read stderr "N64d"\n",len); if(len<=0) break; else any=true; *oBufIA = len; s_err = vec_join(s_err, incG(oBufObj)); }
if (!iDone && ps[in_i].revents & POLLOUT) { if (!iDone && ps[in_i].revents & POLLOUT) {
shDbg("writing "N64u"\n", iLen-iOff); shDbg("writing "N64u"\n", iLen-iOff);
ssize_t ww = write(p_in[1], iBuf+iOff, iLen-iOff); ssize_t ww = write(p_in[1], iBuf+iOff, iLen-iOff);
shDbg("written %zd/"N64u"\n", ww, iLen-iOff); shDbg("written %zd/"N64u"\n", ww, iLen-iOff);
@ -1228,6 +1228,7 @@ B sh_c2(B t, B w, B x) {
} }
} else iBuf = ""; } else iBuf = "";
// run command
DWORD code = -1; DWORD code = -1;
u64 oLen = 0; char* oBuf; u64 oLen = 0; char* oBuf;
u64 eLen = 0; char* eBuf; u64 eLen = 0; char* eBuf;
@ -1238,6 +1239,7 @@ B sh_c2(B t, B w, B x) {
thrF("•SH: Failed to run command: %S", winErrorEx(dwResult)); thrF("•SH: Failed to run command: %S", winErrorEx(dwResult));
} }
// prepare output
u8* op; u8* op;
B s_out = m_c8arrv(&op, oLen); B s_out = m_c8arrv(&op, oLen);
if (oLen > 0 && oBuf != NULL) { if (oLen > 0 && oBuf != NULL) {

View File

@ -44,14 +44,18 @@ static char* winQuoteCmdArg(u64 len, char* source, char* target) {
return target; return target;
} }
char *dataInp, *dataOut, *dataErr; typedef struct {
u64 sizeInp, sizeOut, sizeErr; HANDLE hndl;
char* buf;
u64 len;
} ThreadIO;
static DWORD WINAPI winThreadWriteIn(LPVOID arg) { static DWORD WINAPI winThreadWrite(LPVOID arg0) {
DWORD dwResult = ERROR_SUCCESS; DWORD dwResult = ERROR_SUCCESS;
HANDLE hndl = (HANDLE)arg; ThreadIO* arg = arg0;
char *wBuf = dataInp; HANDLE hndl = arg->hndl;
DWORD dwToWrite = sizeInp, dwWritten = 0, dwOff = 0; char* wBuf = arg->buf;
DWORD dwToWrite = arg->len, dwWritten = 0, dwOff = 0;
for (;;) { for (;;) {
BOOL bOk = WriteFile(hndl, &wBuf[dwOff], dwToWrite-dwOff, &dwWritten, NULL); BOOL bOk = WriteFile(hndl, &wBuf[dwOff], dwToWrite-dwOff, &dwWritten, NULL);
@ -64,41 +68,42 @@ static DWORD WINAPI winThreadWriteIn(LPVOID arg) {
return dwResult; return dwResult;
} }
#define winThreadRead(D) \ static DWORD WINAPI winThreadRead(LPVOID arg0) {
static DWORD WINAPI winThreadRead##D(LPVOID arg) { \ DWORD dwResult = ERROR_SUCCESS;
DWORD dwResult = ERROR_SUCCESS; \ ThreadIO* arg = arg0;
HANDLE hndl = (HANDLE)arg; \ HANDLE hndl = arg->hndl;
u8 buf[1024] = {0}; \ u8 buf[1024] = {0};
const usz bufSize = sizeof(buf)/sizeof(u8); \ const usz bufSize = sizeof(buf)/sizeof(u8);
DWORD dwRead = 0, dwHasRead = 0; \ DWORD dwRead = 0, dwHasRead = 0;
char *rBuf = NULL; \ char* rBuf = NULL;
for (;;) { \
ZeroMemory(buf, bufSize); \ for (;;) {
BOOL bOk = ReadFile(hndl, buf, bufSize, &dwRead, NULL); \ ZeroMemory(buf, bufSize);
if (!bOk) { \ BOOL bOk = ReadFile(hndl, buf, bufSize, &dwRead, NULL);
DWORD dwErr = GetLastError(); \ if (!bOk) {
if (dwErr == ERROR_BROKEN_PIPE) { break; } \ DWORD dwErr = GetLastError();
else { dwResult = dwErr; break; } \ if (dwErr == ERROR_BROKEN_PIPE) { break; }
} \ else { dwResult = dwErr; break; }
char *newBuf = (rBuf==NULL)? \ }
calloc(dwHasRead+dwRead, sizeof(char)) : \ char* newBuf = (rBuf==NULL)?
realloc(rBuf, (dwHasRead+dwRead)*sizeof(char)); \ calloc(dwHasRead+dwRead, sizeof(char)) :
if (newBuf == NULL) { dwResult = GetLastError(); break; } \ realloc(rBuf, (dwHasRead+dwRead)*sizeof(char));
rBuf = newBuf; \ if (newBuf == NULL) { dwResult = GetLastError(); break; }
memcpy(&rBuf[dwHasRead], buf, dwRead); \ rBuf = newBuf;
dwHasRead += dwRead; \ memcpy(&rBuf[dwHasRead], buf, dwRead);
} \ dwHasRead += dwRead;
data##D = rBuf; \ }
size##D = dwHasRead; \
CloseHandle(hndl); \ if (dwResult != ERROR_SUCCESS) {
return dwResult; \ if (dwHasRead > 0 && rBuf != NULL) { free(rBuf); }
} else {
arg->buf = rBuf;
arg->len = dwHasRead;
}
CloseHandle(hndl);
return dwResult;
} }
winThreadRead(Out)
winThreadRead(Err)
#undef winThreadRead
static DWORD winCmd(char* arg, static DWORD winCmd(char* arg,
u64 iLen, char* iBuf, u64 iLen, char* iBuf,
DWORD* code, DWORD* code,
@ -131,7 +136,7 @@ static DWORD winCmd(char* arg,
si.hStdInput = hInpR; si.hStdInput = hInpR;
si.hStdOutput = hOutW; si.hStdOutput = hOutW;
si.hStdError = hErrW; si.hStdError = hErrW;
si.dwFlags |= STARTF_USESTDHANDLES | STARTF_UNTRUSTEDSOURCE; si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
@ -145,18 +150,16 @@ static DWORD winCmd(char* arg,
CloseHandle(hOutW); CloseHandle(hOutW);
CloseHandle(hErrW); CloseHandle(hErrW);
// Now we are dealing with the globals and threads // Spawn the thread to deal with redirected io
ThreadIO data0 = {hInpW, iBuf, iLen};
ThreadIO data1 = {hOutR, NULL, 0};
ThreadIO data2 = {hErrR, NULL, 0};
dataInp = iBuf;
sizeInp = iLen;
DWORD exitCode = -1; DWORD exitCode = -1;
HANDLE lpThreads[3]; HANDLE lpThreads[3];
lpThreads[0] = CreateThread(NULL, 0, winThreadWriteIn, (LPVOID)hInpW, 0, NULL); lpThreads[0] = CreateThread(NULL, 0, winThreadWrite, (LPVOID)&data0, 0, NULL);
lpThreads[1] = CreateThread(NULL, 0, winThreadReadOut, (LPVOID)hOutR, 0, NULL); lpThreads[1] = CreateThread(NULL, 0, winThreadRead, (LPVOID)&data1, 0, NULL);
lpThreads[2] = CreateThread(NULL, 0, winThreadReadErr, (LPVOID)hErrR, 0, NULL); lpThreads[2] = CreateThread(NULL, 0, winThreadRead, (LPVOID)&data2, 0, NULL);
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
if (lpThreads[i] == NULL) { dwResult = GetLastError(); goto error; } if (lpThreads[i] == NULL) { dwResult = GetLastError(); goto error; }
@ -180,8 +183,8 @@ static DWORD winCmd(char* arg,
// Give outputs // Give outputs
*code = exitCode; *code = exitCode;
*oLen = sizeOut; *oBuf = dataOut; *oLen = data1.len; *oBuf = data1.buf;
*eLen = sizeErr; *eBuf = dataErr; *eLen = data2.len; *eBuf = data2.buf;
error: error:
// Close handles // Close handles
@ -189,7 +192,5 @@ error:
CloseHandle(pi.hProcess); CloseHandle(pi.hProcess);
CloseHandle(pi.hThread); CloseHandle(pi.hThread);
return dwResult; return dwResult;
} }