testpoll.c

来自「linux网络服务器工具」· C语言 代码 · 共 706 行 · 第 1/2 页

C
706
字号
        ABTS_PTR_NOTNULL(tc, s[i]);        socket_pollfd.desc_type = APR_POLL_SOCKET;        socket_pollfd.reqevents = APR_POLLIN;        socket_pollfd.desc.s = s[i];        socket_pollfd.client_data = s[i];        rv = apr_pollset_add(pollset, &socket_pollfd);        ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    }}static void nomessage_pollset(abts_case *tc, void *data){    apr_status_t rv;    int lrv;    const apr_pollfd_t *descs = NULL;    rv = apr_pollset_poll(pollset, 0, &lrv, &descs);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 0, lrv);    ABTS_PTR_EQUAL(tc, NULL, descs);}static void send0_pollset(abts_case *tc, void *data){    apr_status_t rv;    const apr_pollfd_t *descs = NULL;    int num;        send_msg(s, sa, 0, tc);    rv = apr_pollset_poll(pollset, 0, &num, &descs);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_INT_EQUAL(tc, 1, num);    ABTS_PTR_NOTNULL(tc, descs);    ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);    ABTS_PTR_EQUAL(tc, s[0],  descs[0].client_data);}static void recv0_pollset(abts_case *tc, void *data){    apr_status_t rv;    int lrv;    const apr_pollfd_t *descs = NULL;    recv_msg(s, 0, p, tc);    rv = apr_pollset_poll(pollset, 0, &lrv, &descs);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 0, lrv);    ABTS_PTR_EQUAL(tc, NULL, descs);}static void send_middle_pollset(abts_case *tc, void *data){    apr_status_t rv;    const apr_pollfd_t *descs = NULL;    int num;        send_msg(s, sa, 2, tc);    send_msg(s, sa, 5, tc);    rv = apr_pollset_poll(pollset, 0, &num, &descs);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_INT_EQUAL(tc, 2, num);    ABTS_PTR_NOTNULL(tc, descs);    ABTS_ASSERT(tc, "Incorrect socket in result set",            ((descs[0].desc.s == s[2]) && (descs[1].desc.s == s[5])) ||            ((descs[0].desc.s == s[5]) && (descs[1].desc.s == s[2])));}static void clear_middle_pollset(abts_case *tc, void *data){    apr_status_t rv;    int lrv;    const apr_pollfd_t *descs = NULL;    recv_msg(s, 2, p, tc);    recv_msg(s, 5, p, tc);    rv = apr_pollset_poll(pollset, 0, &lrv, &descs);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 0, lrv);    ABTS_PTR_EQUAL(tc, NULL, descs);}static void send_last_pollset(abts_case *tc, void *data){    apr_status_t rv;    const apr_pollfd_t *descs = NULL;    int num;        send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc);    rv = apr_pollset_poll(pollset, 0, &num, &descs);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_INT_EQUAL(tc, 1, num);    ABTS_PTR_NOTNULL(tc, descs);    ABTS_PTR_EQUAL(tc, s[LARGE_NUM_SOCKETS - 1], descs[0].desc.s);    ABTS_PTR_EQUAL(tc, s[LARGE_NUM_SOCKETS - 1],  descs[0].client_data);}static void clear_last_pollset(abts_case *tc, void *data){    apr_status_t rv;    int lrv;    const apr_pollfd_t *descs = NULL;    recv_msg(s, LARGE_NUM_SOCKETS - 1, p, tc);    rv = apr_pollset_poll(pollset, 0, &lrv, &descs);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 0, lrv);    ABTS_PTR_EQUAL(tc, NULL, descs);}static void close_all_sockets(abts_case *tc, void *data){    apr_status_t rv;    int i;    for (i = 0; i < LARGE_NUM_SOCKETS; i++){        rv = apr_socket_close(s[i]);        ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    }}static void pollset_remove(abts_case *tc, void *data){    apr_status_t rv;    apr_pollset_t *pollset;    const apr_pollfd_t *hot_files;    apr_pollfd_t pfd;    apr_int32_t num;    rv = apr_pollset_create(&pollset, 5, p, 0);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    pfd.p = p;    pfd.desc_type = APR_POLL_SOCKET;    pfd.reqevents = APR_POLLOUT;    pfd.desc.s = s[0];    pfd.client_data = (void *)1;    rv = apr_pollset_add(pollset, &pfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    pfd.desc.s = s[1];    pfd.client_data = (void *)2;    rv = apr_pollset_add(pollset, &pfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    pfd.desc.s = s[2];    pfd.client_data = (void *)3;    rv = apr_pollset_add(pollset, &pfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    pfd.desc.s = s[3];    pfd.client_data = (void *)4;    rv = apr_pollset_add(pollset, &pfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    rv = apr_pollset_poll(pollset, 1000, &num, &hot_files);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_INT_EQUAL(tc, 4, num);    /* now remove the pollset element referring to desc s[1] */    pfd.desc.s = s[1];    pfd.client_data = (void *)999; /* not used on this call */    rv = apr_pollset_remove(pollset, &pfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    /* this time only three should match */    rv = apr_pollset_poll(pollset, 1000, &num, &hot_files);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_INT_EQUAL(tc, 3, num);    ABTS_PTR_EQUAL(tc, (void *)1, hot_files[0].client_data);    ABTS_PTR_EQUAL(tc, s[0], hot_files[0].desc.s);    ABTS_PTR_EQUAL(tc, (void *)3, hot_files[1].client_data);    ABTS_PTR_EQUAL(tc, s[2], hot_files[1].desc.s);    ABTS_PTR_EQUAL(tc, (void *)4, hot_files[2].client_data);    ABTS_PTR_EQUAL(tc, s[3], hot_files[2].desc.s);        /* now remove the pollset elements referring to desc s[2] */    pfd.desc.s = s[2];    pfd.client_data = (void *)999; /* not used on this call */    rv = apr_pollset_remove(pollset, &pfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    /* this time only two should match */    rv = apr_pollset_poll(pollset, 1000, &num, &hot_files);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_INT_EQUAL(tc, 2, num);    ABTS_ASSERT(tc, "Incorrect socket in result set",            ((hot_files[0].desc.s == s[0]) && (hot_files[1].desc.s == s[3]))  ||            ((hot_files[0].desc.s == s[3]) && (hot_files[1].desc.s == s[0])));    ABTS_ASSERT(tc, "Incorrect client data in result set",            ((hot_files[0].client_data == (void *)1) &&             (hot_files[1].client_data == (void *)4)) ||            ((hot_files[0].client_data == (void *)4) &&             (hot_files[1].client_data == (void *)1)));}#define POLLCB_PREREQ \    do { \        if (pollcb == NULL) { \            ABTS_NOT_IMPL(tc, "pollcb interface not supported"); \            return; \        } \    } while (0)static void setup_pollcb(abts_case *tc, void *data){    apr_status_t rv;    rv = apr_pollcb_create(&pollcb, LARGE_NUM_SOCKETS, p, 0);    if (rv == APR_ENOTIMPL) {        pollcb = NULL;        ABTS_NOT_IMPL(tc, "pollcb interface not supported");    }    else {        ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    }}typedef struct pollcb_baton_t {    abts_case *tc;    int count;} pollcb_baton_t;static apr_status_t trigger_pollcb_cb(void* baton, apr_pollfd_t *descriptor){    pollcb_baton_t* pcb = (pollcb_baton_t*) baton;    ABTS_PTR_EQUAL(pcb->tc, s[0], descriptor->desc.s);    ABTS_PTR_EQUAL(pcb->tc, s[0], descriptor->client_data);    pcb->count++;    return APR_SUCCESS;}static void trigger_pollcb(abts_case *tc, void *data){    apr_status_t rv;    apr_pollfd_t socket_pollfd;    pollcb_baton_t pcb;        POLLCB_PREREQ;    ABTS_PTR_NOTNULL(tc, s[0]);    socket_pollfd.desc_type = APR_POLL_SOCKET;    socket_pollfd.reqevents = APR_POLLIN;    socket_pollfd.desc.s = s[0];    socket_pollfd.client_data = s[0];    rv = apr_pollcb_add(pollcb, &socket_pollfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);        send_msg(s, sa, 0, tc);    pcb.tc = tc;    pcb.count = 0;    rv = apr_pollcb_poll(pollcb, 0, trigger_pollcb_cb, &pcb);        ABTS_INT_EQUAL(tc, 0, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 1, pcb.count);    rv = apr_pollcb_remove(pollcb, &socket_pollfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);}static void timeout_pollcb(abts_case *tc, void *data){    apr_status_t rv;    pollcb_baton_t pcb;    POLLCB_PREREQ;    pcb.count = 0;    pcb.tc = tc;    rv = apr_pollcb_poll(pollcb, 1, trigger_pollcb_cb, &pcb);        ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 0, pcb.count);}static void timeout_pollin_pollcb(abts_case *tc, void *data){    apr_status_t rv;    pollcb_baton_t pcb;    apr_pollfd_t socket_pollfd;    POLLCB_PREREQ;    recv_msg(s, 0, p, tc);        ABTS_PTR_NOTNULL(tc, s[0]);    socket_pollfd.desc_type = APR_POLL_SOCKET;    socket_pollfd.reqevents = APR_POLLIN;    socket_pollfd.desc.s = s[0];    socket_pollfd.client_data = s[0];    rv = apr_pollcb_add(pollcb, &socket_pollfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);        pcb.count = 0;    pcb.tc = tc;        rv = apr_pollcb_poll(pollcb, 1, trigger_pollcb_cb, &pcb);        ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 0, pcb.count);    rv = apr_pollcb_remove(pollcb, &socket_pollfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);}abts_suite *testpoll(abts_suite *suite){    suite = ADD_SUITE(suite)    abts_run_test(suite, create_all_sockets, NULL);#ifdef OLD_POLL_INTERFACE    abts_run_test(suite, setup_small_poll, NULL);    abts_run_test(suite, setup_large_poll, NULL);    abts_run_test(suite, nomessage, NULL);    abts_run_test(suite, send_2, NULL);    abts_run_test(suite, recv_2_send_1, NULL);    abts_run_test(suite, send_2_signaled_1, NULL);    abts_run_test(suite, recv_1_send_0, NULL);    abts_run_test(suite, clear_all_signalled, NULL);    abts_run_test(suite, send_large_pollarray, NULL);    abts_run_test(suite, recv_large_pollarray, NULL);#endif    abts_run_test(suite, setup_pollset, NULL);    abts_run_test(suite, multi_event_pollset, NULL);    abts_run_test(suite, add_sockets_pollset, NULL);    abts_run_test(suite, nomessage_pollset, NULL);    abts_run_test(suite, send0_pollset, NULL);    abts_run_test(suite, recv0_pollset, NULL);    abts_run_test(suite, send_middle_pollset, NULL);    abts_run_test(suite, clear_middle_pollset, NULL);    abts_run_test(suite, send_last_pollset, NULL);    abts_run_test(suite, clear_last_pollset, NULL);    abts_run_test(suite, pollset_remove, NULL);        abts_run_test(suite, close_all_sockets, NULL);    abts_run_test(suite, create_all_sockets, NULL);    abts_run_test(suite, setup_pollcb, NULL);    abts_run_test(suite, trigger_pollcb, NULL);    abts_run_test(suite, timeout_pollcb, NULL);    abts_run_test(suite, timeout_pollin_pollcb, NULL);    abts_run_test(suite, close_all_sockets, NULL);    return suite;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?