Skip to content
SocketPollItem

SocketPollItem

Description

One slot in a SocketPoll call. Caller fills fd (from a Listener or Socket) and events_requested; SocketPoll writes events_ready back.

Usage example (Cross-references)

Usage examples (Cross-references)
        u32    events_requested;
        u32    events_ready;
    } SocketPollItem;
    
    // --- Addressing -------------------------------------------------------------
    /// TAGS: Socket, Poll, Multiplexing
    ///
    i32 SocketPoll(SocketPollItem *items, u32 count, i32 timeout_ms);
    
    #endif // MISRA_SYS_SOCKET_H
    #endif
    
    i32 SocketPoll(SocketPollItem *items, u32 count, i32 timeout_ms) {
        if (!items && count > 0) {
            LOG_FATAL("SocketPoll: items is NULL but count > 0");
        }
    
        SocketPollItem items[2];
        char           buf[8192];
        while (!g_stop) {
        char           buf[8192];
        while (!g_stop) {
            items[0] = (SocketPollItem) {.fd = a->fd, .events_requested = SOCKET_POLL_READ};
            items[1] = (SocketPollItem) {.fd = b->fd, .events_requested = SOCKET_POLL_READ};
        while (!g_stop) {
            items[0] = (SocketPollItem) {.fd = a->fd, .events_requested = SOCKET_POLL_READ};
            items[1] = (SocketPollItem) {.fd = b->fd, .events_requested = SOCKET_POLL_READ};
    
            i32 ready = SocketPoll(items, 2, 1000);
                // accept() blocking forever (and without the EINTR error
                // log noise when it does).
                SocketPollItem listen_item = {.fd = listener.fd, .events_requested = SOCKET_POLL_READ};
                i32            ready       = SocketPoll(&listen_item, 1, 1000);
                if (ready <= 0) {
        bool sent    = SocketSend(&p.client, payload, 1) == 1;
    
        SocketPollItem item   = {0};
        item.fd               = p.server.fd;
        item.events_requested = SOCKET_POLL_READ;
        bool sent = SocketSend(&p.client, "Y", 1) == 1;
    
        SocketPollItem item   = {0};
        item.fd               = p.server.fd;
        item.events_requested = SOCKET_POLL_WRITE; // not READ
        }
    
        SocketPollItem item   = {0};
        item.fd               = p.client.fd;
        item.events_requested = SOCKET_POLL_WRITE;
        bool sent = SocketSend(&p.client, "Z", 1) == 1;
    
        SocketPollItem item   = {0};
        item.fd               = p.server.fd;
        item.events_requested = SOCKET_POLL_READ; // not WRITE
        }
    
        SocketPollItem item   = {0};
        item.fd               = p.server.fd;
        item.events_requested = SOCKET_POLL_READ;
        // once readable it stays readable) so the combined assertion poll below
        // is deterministic. Do NOT collapse this back into one poll.
        SocketPollItem warm0 = {.fd = p0.server.fd, .events_requested = SOCKET_POLL_READ};
        (void)SocketPoll(&warm0, 1, 1000);
        SocketPollItem warm2 = {.fd = p2.server.fd, .events_requested = SOCKET_POLL_READ};
        SocketPollItem warm0 = {.fd = p0.server.fd, .events_requested = SOCKET_POLL_READ};
        (void)SocketPoll(&warm0, 1, 1000);
        SocketPollItem warm2 = {.fd = p2.server.fd, .events_requested = SOCKET_POLL_READ};
        (void)SocketPoll(&warm2, 1, 1000);
        (void)SocketPoll(&warm2, 1, 1000);
    
        SocketPollItem items[3]   = {0};
        items[0].fd               = p0.server.fd;
        items[0].events_requested = SOCKET_POLL_READ;
        bool sent = SocketSend(&p1.client, "M", 1) == 1;
    
        SocketPollItem items[3]   = {0};
        items[0].fd               = p0.server.fd;
        items[0].events_requested = SOCKET_POLL_READ;
        SocketClose(&p.client);
    
        SocketPollItem item   = {0};
        item.fd               = p.server.fd;
        item.events_requested = SOCKET_POLL_READ;
        bool ok = made == N;
        if (ok) {
            SocketPollItem items[N] = {0};
            for (u32 i = 0; i < N; ++i) {
                items[i].fd               = pairs[i].server.fd;
            ok = SocketSend(&pairs[N - 1].client, "L", 1) == 1;
    
            SocketPollItem items[N] = {0};
            for (u32 i = 0; i < N; ++i) {
                items[i].fd               = pairs[i].server.fd;
    
        // Idle server: poll(0ms) must report nothing ready.
        SocketPollItem idle   = {0};
        idle.fd               = server.fd;
        idle.events_requested = SOCKET_POLL_READ;
        ok           = ok && SocketSend(&client, payload, n) == (i64)n;
    
        SocketPollItem ready   = {0};
        ready.fd               = server.fd;
        ready.events_requested = SOCKET_POLL_READ;
Last updated on