コード例 #1
0
ファイル: gdb-stub.c プロジェクト: NunaticAlumina/mgba
void GDBStubUpdate(struct GDBStub* stub) {
	if (stub->socket == INVALID_SOCKET) {
		if (stub->d.state == DEBUGGER_PAUSED) {
			stub->d.state = DEBUGGER_RUNNING;
		}
		return;
	}
	if (stub->connection == INVALID_SOCKET) {
		if (stub->shouldBlock) {
			Socket reads = stub->socket;
			SocketPoll(1, &reads, 0, 0, SOCKET_TIMEOUT);
		}
		stub->connection = SocketAccept(stub->socket, 0);
		if (!SOCKET_FAILED(stub->connection)) {
			if (!SocketSetBlocking(stub->connection, false)) {
				goto connectionLost;
			}
			mDebuggerEnter(&stub->d, DEBUGGER_ENTER_ATTACHED, 0);
		} else if (SocketWouldBlock()) {
			return;
		} else {
			goto connectionLost;
		}
	}
	while (true) {
		if (stub->shouldBlock) {
			Socket reads = stub->connection;
			SocketPoll(1, &reads, 0, 0, SOCKET_TIMEOUT);
		}
		ssize_t messageLen = SocketRecv(stub->connection, stub->line, GDB_STUB_MAX_LINE - 1);
		if (messageLen == 0) {
			goto connectionLost;
		}
		if (messageLen == -1) {
			if (SocketWouldBlock()) {
				return;
			}
			goto connectionLost;
		}
		stub->line[messageLen] = '\0';
		mLOG(DEBUGGER, DEBUG, "< %s", stub->line);
		ssize_t position = 0;
		while (position < messageLen) {
			position += _parseGDBMessage(stub, &stub->line[position]);
		}
	}

connectionLost:
	mLOG(DEBUGGER, WARN, "Connection lost");
	GDBStubHangup(stub);
}
コード例 #2
0
int API_recv(SOCKETDESC *desc, void *data, size_t cbMaxData)
{
    PyClient *client = (PyClient *) desc->prv;

    if (client == NULL)
    {
        PyErr_Format(PyExc_IOError, "No client object");

        PRINTMARK();
        return -1;
    }

    int result;

    while (true)
    {
        result = recv ( client->sockfd, (char *) data, cbMaxData, MSG_NOSIGNAL);

        if (result == 0)
        {
            PRINTMARK();
            PyErr_Format(PyExc_IOError, "Connection reset by peer while reading on socket");
            return -1;
        }

        if (result > 0)
        {
            PRINTMARK();
            break;
        }

        PRINTMARK();
        if (!SocketWouldBlock(client->sockfd))
        {
            PyErr_Format(PyExc_IOError, "Socket error %d when reading", SocketGetLastError());
            return -1;
        }

        PRINTMARK();
        if (API_wouldBlock_gevent(client->sock, client->sockfd, 1, 10) == 0)
        {
            PRINTMARK();
            return -1;
        }
        PRINTMARK();

    }

    return result;
}