Chandra

 view release on metacpan or  search on metacpan

include/chandra/chandra_socket_hub.h  view on Meta::CPAN


static void
_hub_do_broadcast(pTHX_ SV *self, SV *channel, SV *data)
{
    HV *hv = (HV *)SvRV(self);
    SV **conns_svp = hv_fetchs(hv, "_conns", 0);
    HV *conns_hv;
    HE *entry;

    if (!conns_svp || !SvROK(*conns_svp)) return;
    conns_hv = (HV *)SvRV(*conns_svp);

    hv_iterinit(conns_hv);
    while ((entry = hv_iternext(conns_hv)) != NULL) {
        SV *conn = hv_iterval(conns_hv, entry);
        if (SvOK(conn))
            _sock_conn_send(aTHX_ conn, SvPV_nolen(channel), data);
    }
}

/* ---- Close hub: shutdown all connections, cleanup files ---- */

static void
_hub_do_close(pTHX_ SV *self)
{
    HV *hv = (HV *)SvRV(self);
    SV **conns_svp      = hv_fetchs(hv, "_conns", 0);
    SV **listener_svp   = hv_fetchs(hv, "_listener", 0);
    SV **select_svp     = hv_fetchs(hv, "_select", 0);
    SV **token_path_svp = hv_fetchs(hv, "_token_path", 0);
    SV **sock_path_svp  = hv_fetchs(hv, "_socket_path", 0);

    if (conns_svp && SvROK(*conns_svp)) {
        HV *conns_hv = (HV *)SvRV(*conns_svp);
        HE *entry;

        hv_iterinit(conns_hv);
        while ((entry = hv_iternext(conns_hv)) != NULL) {
            SV *conn = hv_iterval(conns_hv, entry);
            if (SvOK(conn)) {
                _sock_conn_send(aTHX_ conn, "__shutdown",
                    sv_2mortal(newRV_noinc((SV *)newHV())));
                _sock_call_void(aTHX_ conn, "close");
            }
        }
    }

    (void)hv_stores(hv, "_conns",   newRV_noinc((SV *)newHV()));
    (void)hv_stores(hv, "_clients", newRV_noinc((SV *)newHV()));

    if (listener_svp && SvOK(*listener_svp)) {
        if (select_svp && SvOK(*select_svp))
            _sock_select_remove(aTHX_ *select_svp, *listener_svp);
        _sock_call_void(aTHX_ *listener_svp, "close");
        (void)hv_stores(hv, "_listener", newSV(0));
    }

    if (token_path_svp && SvOK(*token_path_svp)) {
        const char *tp = SvPV_nolen(*token_path_svp);
        Stat_t st;
        if (PerlLIO_stat(tp, &st) == 0)
            (void)PerlLIO_unlink(tp);
    }

    if (sock_path_svp && SvOK(*sock_path_svp)) {
        const char *sp = SvPV_nolen(*sock_path_svp);
        Stat_t st;
        if (PerlLIO_stat(sp, &st) == 0)
            (void)PerlLIO_unlink(sp);
    }

    /* Clean up TCP discovery file (Windows auto-upgrade) */
    {
        SV **disc_svp = hv_fetchs(hv, "_discovery_path", 0);
        if (disc_svp && SvOK(*disc_svp)) {
            const char *dp = SvPV_nolen(*disc_svp);
            Stat_t st;
            if (PerlLIO_stat(dp, &st) == 0)
                (void)PerlLIO_unlink(dp);
        }
    }
}

#endif /* CHANDRA_SOCKET_HUB_H */



( run in 2.038 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )