void Start_Visualizer(Socket_with_Event *arg)
{
//recv an id
DWORD dwID = 0;
DWORD dwForeignProcID = 0;
//Get the node's identifier
while (SOCKET_ERROR == recv(arg->sock, (char*)&dwID, sizeof(DWORD), 0))
{
int error;
char msg[256];
error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
{
Sleep(0);
continue;
}
translate_WSAErrorCode(error, msg);
fdebug2("Socket Error dwID: %i, %s\n", error, msg);
closesocket(arg->sock);
WSACloseEvent(arg->sock_event);
delete arg;
ExitThread(0);
}
//get the foreign ProcID
while (SOCKET_ERROR == recv(arg->sock, (char*)&dwForeignProcID, sizeof(DWORD), 0))
{
int error;
char msg[256];
error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
{
Sleep(0);
continue;
}
translate_WSAErrorCode(error, msg);
fdebug2("Socket Error dwID: %i, %s\n", error, msg);
closesocket(arg->sock);
WSACloseEvent(arg->sock_event);
delete arg;
ExitThread(0);
}
//get the right to read the list
WaitForSingleObject(insert_mutex, INFINITE);
// find the application
MPI_Node *iter_node = mpi_list, *node = NULL;
while (iter_node != NULL)
{
if (iter_node->id == dwID)
{
node = iter_node;
break;
}
iter_node = iter_node->next;
}
//send over the list
if (node)
{
while (SOCKET_ERROR == send(arg->sock, (char *)&node->nproc, sizeof(node->nproc), 0))
{
int error;
char msg[256];
error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
{
Sleep(0);
continue;
}
translate_WSAErrorCode(error, msg);
fdebug2("Socket Error dwID: %i, %s\n", error, msg);
closesocket(arg->sock);
WSACloseEvent(arg->sock_event);
delete arg;
ExitThread(0);
}
for (int i = 0; i < node->nproc; ++i)
{
WSAPROTOCOL_INFO ProtocolInfo;
if (SOCKET_ERROR == WSADuplicateSocket(node->sockets[i], dwForeignProcID, &ProtocolInfo))
{
fdebug("Error in Duplicating the Socket\n");
int error = WSAGetLastError();
char msg[256];
translate_WSAErrorCode(error, msg);
fdebug2("Socket Error dwID: %i, %s\n", error, msg);
}
while (SOCKET_ERROR == send(arg->sock, (char *)&ProtocolInfo, sizeof(WSAPROTOCOL_INFO), 0))
{
int error;
char msg[256];
error = WSAGetLastError();
if (error == WSAEWOULDBLOCK)
{
Sleep(0);
continue;
}
translate_WSAErrorCode(error, msg);
fdebug2("Socket Error dwID: %i, %s\n", error, msg);
closesocket(arg->sock);
WSACloseEvent(arg->sock_event);
delete arg;
ExitThread(0);
}
}
}
else
{
dwID =0;
send(arg->sock, (char *)&dwID, sizeof(dwID), 0);
}
ReleaseMutex(insert_mutex);
}