DWORD WINAPI ThreadPopBuffer(LPVOID lpParam) { T_ThreadParams params = *(T_ThreadParams*)lpParam; T_ProcessArray* processArray = params.processArray; CircularBuffer* circularBuffer = params.circularBuffer; CircularBuffer* syncBuffer = params.syncBuffer; SOCKET connectSocket = params.socket; bool* working = params.working; bool* replicatorsConnected = params.replicatorsConnected; bool* popFinished = params.popFinished; char* retVal; printf("[ThreadPopBuffer] ThreadPopBuffer started\n"); int iResult; int numOfEmptyBuffers = 0; while (*working) { if (!*replicatorsConnected) { break; } numOfEmptyBuffers = 0; retVal = circularBuffer->Pop(); if (retVal == NULL) { numOfEmptyBuffers++; } else { iResult = Send(retVal, *(int*)retVal, connectSocket, working); free(retVal); if (iResult == SocketStatus::Shutdown || iResult == SocketStatus::Error || iResult == SocketStatus::Closed) { printf("Replicator disconnected!\n"); *replicatorsConnected = false; break; } } retVal = syncBuffer->Pop(); if (retVal == NULL) { numOfEmptyBuffers++; } else { iResult = Send(retVal, *(int*)retVal, connectSocket, working); free(retVal); if (iResult == SocketStatus::Shutdown || iResult == SocketStatus::Error || iResult == SocketStatus::Closed) { printf("Replicator disconnected!\n"); *replicatorsConnected = false; break; } } if (numOfEmptyBuffers == 2) { Sleep(SLEEP_TIME); continue; } } iResult = shutdown(params.socket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("[206]shutdown failed with error: %d\n", WSAGetLastError()); } printf("[ThreadPopBuffer] Ended gracefully\n"); // signal ThreadForward to close socket and delete params *popFinished = true; RemoveFromProcessArray(processArray, POP_PROCESS_ID); return 0; }