/* * %CopyrightBegin% * * Copyright Ericsson AB 2006-2018. All Rights Reserved. * * Licensed 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. * * %CopyrightEnd% */ /** * @description: Poll interface functions * @author Lukas Larsson * * The functions in the header are used to interact with the poll * implementation. Iff the kernel-poll implementation needs a fallback * pollset, then all functions are exported twice. Once with a _flbk * suffix and once without any suffix. If no fallback is needed, then * only the non-suffix version is exported. */ /** * Initialize the poll implementation. Has to be called before any other function. * @param[out] concurrent_waiters if not NULL, set to 1 if more then one thread * is allowed to wait in the pollsets at the same time. */ void ERTS_POLL_EXPORT(erts_poll_init)(int *concurrent_waiters); /** * @brief Create a new pollset. * @param id The unique debug id of this pollset. */ ErtsPollSet *ERTS_POLL_EXPORT(erts_poll_create_pollset)(int id); /** * Modify the contents of a pollset. This function can be called while one * (or possibly more) thread is waiting in the pollset. * * @param ps the pollset to modify * @param fd the file descriptor to modify * @param op the type of operation to do. Normal usage is ADD,MOD...MOD,DEL. * @param evts the events that we are changing interest to. Ignored if op is DEL. * @param[in] wake_poller if set to 1 any thread waiting in the pollset will be woken. * This parameter is ignored if the pollset supports concurrent waiters. * @param[out] wake_poller set to 1 if the waiting thread was woken. * @return The events set, or ERTS_POLL_EV_NVAL if it was not possible to add the * fd to the pollset. */ ErtsPollEvents ERTS_POLL_EXPORT(erts_poll_control)(ErtsPollSet *ps, ErtsSysFdType fd, ErtsPollOp op, ErtsPollEvents evts, int *wake_poller); /** * Wait for events to be ready in the pollset. If the erts_poll_init call * set concurrent_waiters to 1, then multiple threads are allowed to call * this function at the same time. * * When an event has been triggered on a fd, that event is disabled. To * re-enable it the implementation has to call erts_poll_control again. * * @param ps the pollset to wait for events in * @param res an array of fd results that the ready fds are put in. * @param[in] length the length of the res array * @param[out] length the number of ready events returned in res * @param tpd the thread progress data to note sleep state in * @param timeout_time the time in native to wake up at * @return 0 on success, else the ERRNO of the error that happened. */ int ERTS_POLL_EXPORT(erts_poll_wait)(ErtsPollSet *ps, ErtsPollResFd res[], int *length, ErtsThrPrgrData *tpd, ErtsMonotonicTime timeout_time); /** * Interrupt the thread waiting in the pollset. This function should be called * with set = 0 before any thread calls erts_poll_wait in order to clear any * interrupts that have happened while the thread was awake. * * This function has no effect on pollsets that support concurrent waiters. * * @param ps the pollset to wake * @param set if 1, interrupt the pollset, if 0 clear the interrupt flag. */ void ERTS_POLL_EXPORT(erts_poll_interrupt)(ErtsPollSet *ps, int set); /* Debug functions */ /** * Get the maximum number of fds supported by the pollset */ int ERTS_POLL_EXPORT(erts_poll_max_fds)(void); /** * Get information about the given pollset */ void ERTS_POLL_EXPORT(erts_poll_info)(ErtsPollSet *ps, ErtsPollInfo *info); /** * Get information about which events are currently selected. * * The unix fd is used to index into the array, so naturally this function does * not work on windows. If the pollset cannot figure out what the selected * events for a given fd is, it is set to ERTS_POLL_EV_NONE. * * @param ps the pollset to get events from * @param evts an array of which events are selected on. */ void ERTS_POLL_EXPORT(erts_poll_get_selected_events)(ErtsPollSet *ps, ErtsPollEvents evts[], int length); #ifdef ERTS_ENABLE_LOCK_COUNT /** * Enable lock counting of any locks within the pollset. */ void ERTS_POLL_EXPORT(erts_lcnt_enable_pollset_lock_count)(ErtsPollSet *, int enable); #endif