Ejemplo n.º 1
0
void bus_terminal_release(bus_terminal_t* bt)
{
    struct idtable_iterator_t* it;
    struct bus_terminal_channel_t* btc;
    if (bt) {
        // release send channels
        if (bt->send_channels) {
            it = idtable_iterator_init(bt->send_channels, 0);
            while (it) {
                btc = (struct bus_terminal_channel_t*)idtable_iterator_value(it);
                if (btc) {
                    bus_terminal_channel_release(btc);
                }
                if (idtable_iterator_next(it) < 0) {
                    idtable_iterator_release(it);
                    break;
                }
            }
            idtable_release(bt->send_channels);
            bt->send_channels = NULL;
        }
        // release recv channels
        if (bt->recv_channels) {
            it = idtable_iterator_init(bt->recv_channels, 0);
            while (it) {
                btc = (struct bus_terminal_channel_t*)idtable_iterator_value(it);
                if (btc) {
                    bus_terminal_channel_release(btc);
                }
                if (idtable_iterator_next(it) < 0) {
                    idtable_iterator_release(it);
                    break;
                }
            }
            idtable_release(bt->recv_channels);
            bt->recv_channels = NULL;
        }
        FREE(bt);
    }
}
Ejemplo n.º 2
0
int
test_ws_server() {
    con_table = idtable_create(1024);
    assert(con_table);

    r = reactor_create();
    assert(r);

    acc_t* acc = acc_create(r);
    assert(acc);
    acc_set_read_func(acc, _accept_read, NULL);

    struct sockaddr_in addr;
    int res = sock_addr_aton(WS_IP, WS_PORT, &addr);
    assert(res == 0);

    res = acc_start(acc, (struct sockaddr*)&addr);
    assert(res == 0);

    while (1) {
        res = reactor_dispatch(r, 1);
        if(res < 0) return -1;
        if(res == 0) usleep(100);
    }

    acc_stop(acc);
    acc_release(acc);
    for (int i = 0; i < 1024; i++) {
        WSCtx* ctx = idtable_get(con_table, i);
        if (ctx) {
            wsconn_release(ctx->con);
            FREE(ctx);
        }
    }
    idtable_release(con_table);
    reactor_release(r);
    return 0;
}