testpoll.c

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

C
706
字号
/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include "testutil.h"#include "apr_strings.h"#include "apr_errno.h"#include "apr_general.h"#include "apr_lib.h"#include "apr_network_io.h"#include "apr_poll.h"#define SMALL_NUM_SOCKETS 3/* We can't use 64 here, because some platforms *ahem* Solaris *ahem* have * a default limit of 64 open file descriptors per process.  If we use * 64, the test will fail even though the code is correct. */#define LARGE_NUM_SOCKETS 50static apr_socket_t *s[LARGE_NUM_SOCKETS];static apr_sockaddr_t *sa[LARGE_NUM_SOCKETS];static apr_pollset_t *pollset;static apr_pollcb_t *pollcb;/* ###: tests surrounded by ifdef OLD_POLL_INTERFACE either need to be * converted to use the pollset interface or removed. */#ifdef OLD_POLL_INTERFACEstatic apr_pollfd_t *pollarray;static apr_pollfd_t *pollarray_large;#endifstatic void make_socket(apr_socket_t **sock, apr_sockaddr_t **sa,                         apr_port_t port, apr_pool_t *p, abts_case *tc){    apr_status_t rv;    rv = apr_sockaddr_info_get(sa, "127.0.0.1", APR_UNSPEC, port, 0, p);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    rv = apr_socket_create(sock, (*sa)->family, SOCK_DGRAM, 0, p);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    rv =apr_socket_bind((*sock), (*sa));    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);}#ifdef OLD_POLL_INTERFACEstatic void check_sockets(const apr_pollfd_t *pollarray,                           apr_socket_t **sockarray, int which, int pollin,                           abts_case *tc){    apr_status_t rv;    apr_int16_t event;    char *str;    rv = apr_poll_revents_get(&event, sockarray[which],                               (apr_pollfd_t *)pollarray);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    if (pollin) {        str = apr_psprintf(p, "Socket %d not signalled when it should be",                           which);        ABTS_ASSERT(tc, str, event & APR_POLLIN);    } else {        str = apr_psprintf(p, "Socket %d signalled when it should not be",                           which);        ABTS_ASSERT(tc, str, !(event & APR_POLLIN));    }}#endifstatic void send_msg(apr_socket_t **sockarray, apr_sockaddr_t **sas, int which,                     abts_case *tc){    apr_size_t len = 5;    apr_status_t rv;    ABTS_PTR_NOTNULL(tc, sockarray[which]);    rv = apr_socket_sendto(sockarray[which], sas[which], 0, "hello", &len);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_SIZE_EQUAL(tc, strlen("hello"), len);}static void recv_msg(apr_socket_t **sockarray, int which, apr_pool_t *p,                      abts_case *tc){    apr_size_t buflen = 5;    char *buffer = apr_pcalloc(p, sizeof(char) * (buflen + 1));    apr_sockaddr_t *recsa;    apr_status_t rv;    ABTS_PTR_NOTNULL(tc, sockarray[which]);    apr_sockaddr_info_get(&recsa, "127.0.0.1", APR_UNSPEC, 7770, 0, p);    rv = apr_socket_recvfrom(recsa, sockarray[which], 0, buffer, &buflen);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    ABTS_SIZE_EQUAL(tc, strlen("hello"), buflen);    ABTS_STR_EQUAL(tc, "hello", buffer);}    static void create_all_sockets(abts_case *tc, void *data){    int i;    for (i = 0; i < LARGE_NUM_SOCKETS; i++){        make_socket(&s[i], &sa[i], 7777 + i, p, tc);    }}       #ifdef OLD_POLL_INTERFACEstatic void setup_small_poll(abts_case *tc, void *data){    apr_status_t rv;    int i;    rv = apr_poll_setup(&pollarray, SMALL_NUM_SOCKETS, p);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);        for (i = 0; i < SMALL_NUM_SOCKETS;i++){        ABTS_INT_EQUAL(tc, 0, pollarray[i].reqevents);        ABTS_INT_EQUAL(tc, 0, pollarray[i].rtnevents);        rv = apr_poll_socket_add(pollarray, s[i], APR_POLLIN);        ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);        ABTS_PTR_EQUAL(tc, s[i], pollarray[i].desc.s);    }}static void setup_large_poll(abts_case *tc, void *data){    apr_status_t rv;    int i;    rv = apr_poll_setup(&pollarray_large, LARGE_NUM_SOCKETS, p);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);        for (i = 0; i < LARGE_NUM_SOCKETS;i++){        ABTS_INT_EQUAL(tc, 0, pollarray_large[i].reqevents);        ABTS_INT_EQUAL(tc, 0, pollarray_large[i].rtnevents);        rv = apr_poll_socket_add(pollarray_large, s[i], APR_POLLIN);        ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);        ABTS_PTR_EQUAL(tc, s[i], pollarray_large[i].desc.s);    }}static void nomessage(abts_case *tc, void *data){    apr_status_t rv;    int srv = SMALL_NUM_SOCKETS;    rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    check_sockets(pollarray, s, 0, 0, tc);    check_sockets(pollarray, s, 1, 0, tc);    check_sockets(pollarray, s, 2, 0, tc);}static void send_2(abts_case *tc, void *data){    apr_status_t rv;    int srv = SMALL_NUM_SOCKETS;    send_msg(s, sa, 2, tc);    rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    check_sockets(pollarray, s, 0, 0, tc);    check_sockets(pollarray, s, 1, 0, tc);    check_sockets(pollarray, s, 2, 1, tc);}static void recv_2_send_1(abts_case *tc, void *data){    apr_status_t rv;    int srv = SMALL_NUM_SOCKETS;    recv_msg(s, 2, p, tc);    send_msg(s, sa, 1, tc);    rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    check_sockets(pollarray, s, 0, 0, tc);    check_sockets(pollarray, s, 1, 1, tc);    check_sockets(pollarray, s, 2, 0, tc);}static void send_2_signaled_1(abts_case *tc, void *data){    apr_status_t rv;    int srv = SMALL_NUM_SOCKETS;    send_msg(s, sa, 2, tc);    rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    check_sockets(pollarray, s, 0, 0, tc);    check_sockets(pollarray, s, 1, 1, tc);    check_sockets(pollarray, s, 2, 1, tc);}static void recv_1_send_0(abts_case *tc, void *data){    apr_status_t rv;    int srv = SMALL_NUM_SOCKETS;    recv_msg(s, 1, p, tc);    send_msg(s, sa, 0, tc);    rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    check_sockets(pollarray, s, 0, 1, tc);    check_sockets(pollarray, s, 1, 0, tc);    check_sockets(pollarray, s, 2, 1, tc);}static void clear_all_signalled(abts_case *tc, void *data){    apr_status_t rv;    int srv = SMALL_NUM_SOCKETS;    recv_msg(s, 0, p, tc);    recv_msg(s, 2, p, tc);    rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    check_sockets(pollarray, s, 0, 0, tc);    check_sockets(pollarray, s, 1, 0, tc);    check_sockets(pollarray, s, 2, 0, tc);}static void send_large_pollarray(abts_case *tc, void *data){    apr_status_t rv;    int lrv = LARGE_NUM_SOCKETS;    int i;    send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc);    rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv,                   2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    for (i = 0; i < LARGE_NUM_SOCKETS; i++) {        if (i == (LARGE_NUM_SOCKETS - 1)) {            check_sockets(pollarray_large, s, i, 1, tc);        }        else {            check_sockets(pollarray_large, s, i, 0, tc);        }    }}static void recv_large_pollarray(abts_case *tc, void *data){    apr_status_t rv;    int lrv = LARGE_NUM_SOCKETS;    int i;    recv_msg(s, LARGE_NUM_SOCKETS - 1, p, tc);    rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv,                   2 * APR_USEC_PER_SEC);    ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv));    for (i = 0; i < LARGE_NUM_SOCKETS; i++) {        check_sockets(pollarray_large, s, i, 0, tc);    }}#endifstatic void setup_pollset(abts_case *tc, void *data){    apr_status_t rv;    rv = apr_pollset_create(&pollset, LARGE_NUM_SOCKETS, p, 0);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);}static void multi_event_pollset(abts_case *tc, void *data){    apr_status_t rv;    apr_pollfd_t socket_pollfd;    int lrv;    const apr_pollfd_t *descs = NULL;    ABTS_PTR_NOTNULL(tc, s[0]);    socket_pollfd.desc_type = APR_POLL_SOCKET;    socket_pollfd.reqevents = APR_POLLIN | APR_POLLOUT;    socket_pollfd.desc.s = s[0];    socket_pollfd.client_data = s[0];    rv = apr_pollset_add(pollset, &socket_pollfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);    send_msg(s, sa, 0, tc);    rv = apr_pollset_poll(pollset, 0, &lrv, &descs);    ABTS_INT_EQUAL(tc, 0, APR_STATUS_IS_TIMEUP(rv));    if (lrv == 1) {        ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);        ABTS_INT_EQUAL(tc, APR_POLLIN | APR_POLLOUT, descs[0].rtnevents);        ABTS_PTR_EQUAL(tc, s[0],  descs[0].client_data);    }    else if (lrv == 2) {        ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);        ABTS_PTR_EQUAL(tc, s[0], descs[0].client_data);        ABTS_PTR_EQUAL(tc, s[0], descs[1].desc.s);        ABTS_PTR_EQUAL(tc, s[0], descs[1].client_data);        ABTS_ASSERT(tc, "returned events incorrect",                    ((descs[0].rtnevents | descs[1].rtnevents)                     == (APR_POLLIN | APR_POLLOUT))                    && descs[0].rtnevents != descs[1].rtnevents);    }    else {        ABTS_ASSERT(tc, "either one or two events returned",                    lrv == 1 || lrv == 2);    }    recv_msg(s, 0, p, tc);    rv = apr_pollset_poll(pollset, 0, &lrv, &descs);    ABTS_INT_EQUAL(tc, 0, APR_STATUS_IS_TIMEUP(rv));    ABTS_INT_EQUAL(tc, 1, lrv);    ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);    ABTS_INT_EQUAL(tc, APR_POLLOUT, descs[0].rtnevents);    ABTS_PTR_EQUAL(tc, s[0],  descs[0].client_data);    rv = apr_pollset_remove(pollset, &socket_pollfd);    ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);}                         static void add_sockets_pollset(abts_case *tc, void *data){    apr_status_t rv;    int i;    for (i = 0; i < LARGE_NUM_SOCKETS;i++){        apr_pollfd_t socket_pollfd;

⌨️ 快捷键说明

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