bottleneck testcase based on rubbos
[bottlenecks.git] / rubbos / app / httpd-2.0.64 / srclib / apr / support / unix / waitio.c
1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2  * contributor license agreements.  See the NOTICE file distributed with
3  * this work for additional information regarding copyright ownership.
4  * The ASF licenses this file to You under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with
6  * the License.  You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "apr_arch_file_io.h"
18 #include "apr_arch_networkio.h"
19 #include "apr_poll.h"
20 #include "apr_errno.h"
21 #include "apr_support.h"
22
23 /* The only case where we don't use wait_for_io_or_timeout is on
24  * pre-BONE BeOS, so this check should be sufficient and simpler */
25 #if !BEOS_R5
26 #define USE_WAIT_FOR_IO
27 #endif
28
29 #ifdef USE_WAIT_FOR_IO
30 apr_status_t apr_wait_for_io_or_timeout(apr_file_t *f, apr_socket_t *s,
31                                            int for_read)
32 {
33     apr_interval_time_t timeout;
34     apr_pollfd_t pollset;
35     int srv, n;
36     int type = for_read ? APR_POLLIN : APR_POLLOUT;
37
38     /* TODO - timeout should be less each time through this loop */
39     if (f) {
40         pollset.desc_type = APR_POLL_FILE;
41         pollset.desc.f = f;
42         pollset.p = f->pool;
43         timeout = f->timeout;
44     }
45     else {
46         pollset.desc_type = APR_POLL_SOCKET;
47         pollset.desc.s = s;
48         pollset.p = s->cntxt;
49         timeout = s->timeout;
50     }
51     pollset.reqevents = type;
52
53     do {
54         srv = apr_poll(&pollset, 1, &n, timeout);
55
56         if (n == 1 && pollset.rtnevents & type) {
57             return APR_SUCCESS;
58         }
59     } while (APR_STATUS_IS_EINTR(srv));
60
61     return srv;
62 }
63 #endif
64