Commit b4f758c9 authored by Yann Ylavic's avatar Yann Ylavic
Browse files

event: always favor APR_POLLSET_WAKEABLE over method/implementation.

(probably more about correctness than a real issue since systems are
unlikely to implement more than one/their method...).


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1835846 13f79535-47bb-0310-9956-ffa450edef68
parent 3088f2b0
Loading
Loading
Loading
Loading
+15 −9
Changes for server/mpm/event/event.c: 15 added lines, 9 removed lines.
Original line number Diff line number Diff line
@@ -2486,6 +2486,7 @@ static void *APR_THREAD_FUNC start_threads(apr_thread_t * thd, void *dummy)
    const apr_uint32_t pollset_size = (apr_uint32_t)num_listensocks +
                                      (apr_uint32_t)threads_per_child *
                                      (async_factor > 2 ? async_factor : 2);
    int pollset_flags;

    /* All threads (listener, workers) and synchronization objects (queues,
     * pollset, mutexes...) created here should have at least the lifetime of
@@ -2536,25 +2537,30 @@ static void *APR_THREAD_FUNC start_threads(apr_thread_t * thd, void *dummy)
    }

    /* Create the main pollset */
    for (i = 0; i < sizeof(good_methods) / sizeof(good_methods[0]); i++) {
        apr_uint32_t flags = APR_POLLSET_THREADSAFE | APR_POLLSET_NOCOPY |
    pollset_flags = APR_POLLSET_THREADSAFE | APR_POLLSET_NOCOPY |
                    APR_POLLSET_NODEFAULT | APR_POLLSET_WAKEABLE;
        rv = apr_pollset_create_ex(&event_pollset, pollset_size, pchild, flags,
                                   good_methods[i]);
    for (i = 0; i < sizeof(good_methods) / sizeof(good_methods[0]); i++) {
        rv = apr_pollset_create_ex(&event_pollset, pollset_size, pruntime,
                                   pollset_flags, good_methods[i]);
        if (rv == APR_SUCCESS) {
            listener_is_wakeable = 1;
            break;
        }
        flags &= ~APR_POLLSET_WAKEABLE;
        rv = apr_pollset_create_ex(&event_pollset, pollset_size, pchild, flags,
                                   good_methods[i]);
    }
    if (rv != APR_SUCCESS) {
        pollset_flags &= ~APR_POLLSET_WAKEABLE;
        for (i = 0; i < sizeof(good_methods) / sizeof(good_methods[0]); i++) {
            rv = apr_pollset_create_ex(&event_pollset, pollset_size, pruntime,
                                       pollset_flags, good_methods[i]);
            if (rv == APR_SUCCESS) {
                break;
            }
        }
    }
    if (rv != APR_SUCCESS) {
        rv = apr_pollset_create(&event_pollset, pollset_size, pchild,
                                APR_POLLSET_THREADSAFE | APR_POLLSET_NOCOPY);
        pollset_flags &= ~APR_POLLSET_NODEFAULT;
        rv = apr_pollset_create(&event_pollset, pollset_size, pruntime,
                                pollset_flags);
    }
    if (rv != APR_SUCCESS) {
        ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, APLOGNO(03103)