inport from local

Dependents:   Hobbyking_Cheetah_0511

Committer:
NYX
Date:
Mon Mar 16 06:35:48 2020 +0000
Revision:
0:85b3fd62ea1a
reinport to mbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /* mbed Microcontroller Library
NYX 0:85b3fd62ea1a 2 * Copyright (c) 2017 ARM Limited
NYX 0:85b3fd62ea1a 3 *
NYX 0:85b3fd62ea1a 4 * Licensed under the Apache License, Version 2.0 (the "License");
NYX 0:85b3fd62ea1a 5 * you may not use this file except in compliance with the License.
NYX 0:85b3fd62ea1a 6 * You may obtain a copy of the License at
NYX 0:85b3fd62ea1a 7 *
NYX 0:85b3fd62ea1a 8 * http://www.apache.org/licenses/LICENSE-2.0
NYX 0:85b3fd62ea1a 9 *
NYX 0:85b3fd62ea1a 10 * Unless required by applicable law or agreed to in writing, software
NYX 0:85b3fd62ea1a 11 * distributed under the License is distributed on an "AS IS" BASIS,
NYX 0:85b3fd62ea1a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
NYX 0:85b3fd62ea1a 13 * See the License for the specific language governing permissions and
NYX 0:85b3fd62ea1a 14 * limitations under the License.
NYX 0:85b3fd62ea1a 15 */
NYX 0:85b3fd62ea1a 16 #include "mbed_poll.h"
NYX 0:85b3fd62ea1a 17 #include "FileHandle.h"
NYX 0:85b3fd62ea1a 18 #include "Timer.h"
NYX 0:85b3fd62ea1a 19 #ifdef MBED_CONF_RTOS_PRESENT
NYX 0:85b3fd62ea1a 20 #include "rtos/Thread.h"
NYX 0:85b3fd62ea1a 21 #endif
NYX 0:85b3fd62ea1a 22
NYX 0:85b3fd62ea1a 23 namespace mbed {
NYX 0:85b3fd62ea1a 24
NYX 0:85b3fd62ea1a 25 // timeout -1 forever, or milliseconds
NYX 0:85b3fd62ea1a 26 int poll(pollfh fhs[], unsigned nfhs, int timeout)
NYX 0:85b3fd62ea1a 27 {
NYX 0:85b3fd62ea1a 28 /**
NYX 0:85b3fd62ea1a 29 * TODO Proper wake-up mechanism.
NYX 0:85b3fd62ea1a 30 * In order to correctly detect availability of read/write a FileHandle, we needed
NYX 0:85b3fd62ea1a 31 * a select or poll mechanisms. We opted for poll as POSIX defines in
NYX 0:85b3fd62ea1a 32 * http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html Currently,
NYX 0:85b3fd62ea1a 33 * mbed::poll() just spins and scans filehandles looking for any events we are
NYX 0:85b3fd62ea1a 34 * interested in. In future, his spinning behaviour will be replaced with
NYX 0:85b3fd62ea1a 35 * condition variables.
NYX 0:85b3fd62ea1a 36 */
NYX 0:85b3fd62ea1a 37 Timer timer;
NYX 0:85b3fd62ea1a 38 if (timeout > 0) {
NYX 0:85b3fd62ea1a 39 timer.start();
NYX 0:85b3fd62ea1a 40 }
NYX 0:85b3fd62ea1a 41
NYX 0:85b3fd62ea1a 42 int count = 0;
NYX 0:85b3fd62ea1a 43 for (;;) {
NYX 0:85b3fd62ea1a 44 /* Scan the file handles */
NYX 0:85b3fd62ea1a 45 for (unsigned n = 0; n < nfhs; n++) {
NYX 0:85b3fd62ea1a 46 FileHandle *fh = fhs[n].fh;
NYX 0:85b3fd62ea1a 47 short mask = fhs[n].events | POLLERR | POLLHUP | POLLNVAL;
NYX 0:85b3fd62ea1a 48 if (fh) {
NYX 0:85b3fd62ea1a 49 fhs[n].revents = fh->poll(mask) & mask;
NYX 0:85b3fd62ea1a 50 } else {
NYX 0:85b3fd62ea1a 51 fhs[n].revents = POLLNVAL;
NYX 0:85b3fd62ea1a 52 }
NYX 0:85b3fd62ea1a 53 if (fhs[n].revents) {
NYX 0:85b3fd62ea1a 54 count++;
NYX 0:85b3fd62ea1a 55 }
NYX 0:85b3fd62ea1a 56 }
NYX 0:85b3fd62ea1a 57
NYX 0:85b3fd62ea1a 58 if (count) {
NYX 0:85b3fd62ea1a 59 break;
NYX 0:85b3fd62ea1a 60 }
NYX 0:85b3fd62ea1a 61
NYX 0:85b3fd62ea1a 62 /* Nothing selected - this is where timeout handling would be needed */
NYX 0:85b3fd62ea1a 63 if (timeout == 0 || (timeout > 0 && timer.read_ms() > timeout)) {
NYX 0:85b3fd62ea1a 64 break;
NYX 0:85b3fd62ea1a 65 }
NYX 0:85b3fd62ea1a 66 #ifdef MBED_CONF_RTOS_PRESENT
NYX 0:85b3fd62ea1a 67 // TODO - proper blocking
NYX 0:85b3fd62ea1a 68 // wait for condition variable, wait queue whatever here
NYX 0:85b3fd62ea1a 69 rtos::Thread::yield();
NYX 0:85b3fd62ea1a 70 #endif
NYX 0:85b3fd62ea1a 71 }
NYX 0:85b3fd62ea1a 72 return count;
NYX 0:85b3fd62ea1a 73 }
NYX 0:85b3fd62ea1a 74
NYX 0:85b3fd62ea1a 75 } // namespace mbed