*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
*/
/**
* SECTION:gstpoll
* @short_description: Keep track of file descriptors and make it possible
- * to wait on them in a cancelable way
+ * to wait on them in a cancellable way
*
* A #GstPoll keeps track of file descriptors much like fd_set (used with
* select()) or a struct pollfd array (used with poll()). Once created with
#ifdef G_OS_WIN32
#include <winsock2.h>
-#define EINPROGRESS WSAEINPROGRESS
#else
#define _GNU_SOURCE 1
#ifdef HAVE_SYS_POLL_H
#define WAKE_EVENT(s) (write ((s)->control_write_fd.fd, "W", 1) == 1)
#define RELEASE_EVENT(s) (read ((s)->control_read_fd.fd, (s)->buf, 1) == 1)
#else
-#define WAKE_EVENT(s) (SetEvent ((s)->wakeup_event), errno = GetLastError () == NO_ERROR ? 0 : EACCES, errno == 0 ? 1 : 0)
+#define WAKE_EVENT(s) (SetLastError (0), SetEvent ((s)->wakeup_event), errno = GetLastError () == NO_ERROR ? 0 : EACCES, errno == 0 ? 1 : 0)
#define RELEASE_EVENT(s) (ResetEvent ((s)->wakeup_event))
#endif
#if !defined(HAVE_PPOLL) && defined(HAVE_POLL)
/* check if all file descriptors will fit in an fd_set */
static gboolean
-selectable_fds (const GstPoll * set)
+selectable_fds (GstPoll * set)
{
guint i;
#endif
static GstPollMode
-choose_mode (const GstPoll * set, GstClockTime timeout)
+choose_mode (GstPoll * set, GstClockTime timeout)
{
GstPollMode mode;
*
* Free-function: gst_poll_free
*
- * Returns: (transfer full): a new #GstPoll, or %NULL in case of an error.
- * Free with gst_poll_free().
- *
- * Since: 0.10.18
+ * Returns: (transfer full) (nullable): a new #GstPoll, or %NULL in
+ * case of an error. Free with gst_poll_free().
*/
GstPoll *
gst_poll_new (gboolean controllable)
{
GstPoll *nset;
- GST_DEBUG ("controllable : %d", controllable);
-
nset = g_slice_new0 (GstPoll);
+ GST_DEBUG ("%p: new controllable : %d", nset, controllable);
g_mutex_init (&nset->lock);
#ifndef G_OS_WIN32
nset->mode = GST_POLL_MODE_AUTO;
*
* Free-function: gst_poll_free
*
- * Returns: (transfer full): a new #GstPoll, or %NULL in case of an error.
- * Free with gst_poll_free().
- *
- * Since: 0.10.23
+ * Returns: (transfer full) (nullable): a new #GstPoll, or %NULL in
+ * case of an error. Free with gst_poll_free().
*/
GstPoll *
gst_poll_new_timer (void)
* @set: (transfer full): a file descriptor set.
*
* Free a file descriptor set.
- *
- * Since: 0.10.18
*/
void
gst_poll_free (GstPoll * set)
*
* Get a GPollFD for the reading part of the control socket. This is useful when
* integrating with a GSource and GMainLoop.
- *
- * Since: 0.10.32
*/
void
gst_poll_get_read_gpollfd (GstPoll * set, GPollFD * fd)
*
* Initializes @fd. Alternatively you can initialize it with
* #GST_POLL_FD_INIT.
- *
- * Since: 0.10.18
*/
void
gst_poll_fd_init (GstPollFD * fd)
#endif
MARK_REBUILD (set);
} else {
- GST_WARNING ("%p: couldn't find fd !", set);
+ GST_WARNING ("%p: fd already added !", set);
}
return TRUE;
* Add a file descriptor to the file descriptor set.
*
* Returns: %TRUE if the file descriptor was successfully added to the set.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_add_fd (GstPoll * set, GstPollFD * fd)
* Remove a file descriptor from the file descriptor set.
*
* Returns: %TRUE if the file descriptor was successfully removed from the set.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_remove_fd (GstPoll * set, GstPollFD * fd)
* writability.
*
* Returns: %TRUE if the descriptor was successfully updated.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_fd_ctl_write (GstPoll * set, GstPollFD * fd, gboolean active)
else
pfd->events &= ~POLLOUT;
- GST_LOG ("pfd->events now %d (POLLOUT:%d)", pfd->events, POLLOUT);
+ GST_LOG ("%p: pfd->events now %d (POLLOUT:%d)", set, pfd->events, POLLOUT);
#else
gst_poll_update_winsock_event_mask (set, idx, FD_WRITE | FD_CONNECT,
active);
* readability.
*
* Returns: %TRUE if the descriptor was successfully updated.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_fd_ctl_read (GstPoll * set, GstPollFD * fd, gboolean active)
* The reason why this is needed is because the underlying implementation
* might not allow querying the fd more than once between calls to one of
* the re-enabling operations.
- *
- * Since: 0.10.18
*/
void
gst_poll_fd_ignored (GstPoll * set, GstPollFD * fd)
* Check if @fd in @set has closed the connection.
*
* Returns: %TRUE if the connection was closed.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_fd_has_closed (const GstPoll * set, GstPollFD * fd)
g_return_val_if_fail (fd != NULL, FALSE);
g_return_val_if_fail (fd->fd >= 0, FALSE);
- GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
-
g_mutex_lock (&((GstPoll *) set)->lock);
idx = find_index (set->active_fds, fd);
} else {
GST_WARNING ("%p: couldn't find fd !", set);
}
-
g_mutex_unlock (&((GstPoll *) set)->lock);
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d) %d", set, fd->fd, fd->idx, res);
+
return res;
}
* Check if @fd in @set has an error.
*
* Returns: %TRUE if the descriptor has an error.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_fd_has_error (const GstPoll * set, GstPollFD * fd)
g_return_val_if_fail (fd != NULL, FALSE);
g_return_val_if_fail (fd->fd >= 0, FALSE);
- GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
-
g_mutex_lock (&((GstPoll *) set)->lock);
idx = find_index (set->active_fds, fd);
} else {
GST_WARNING ("%p: couldn't find fd !", set);
}
-
g_mutex_unlock (&((GstPoll *) set)->lock);
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d) %d", set, fd->fd, fd->idx, res);
+
return res;
}
gboolean res = FALSE;
gint idx;
- GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
-
idx = find_index (set->active_fds, fd);
if (idx >= 0) {
#ifndef G_OS_WIN32
} else {
GST_WARNING ("%p: couldn't find fd !", set);
}
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d) %d", set, fd->fd, fd->idx, res);
return res;
}
* Check if @fd in @set has data to be read.
*
* Returns: %TRUE if the descriptor has data to be read.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_fd_can_read (const GstPoll * set, GstPollFD * fd)
* Check if @fd in @set can be used for writing.
*
* Returns: %TRUE if the descriptor can be used for writing.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_fd_can_write (const GstPoll * set, GstPollFD * fd)
g_return_val_if_fail (fd != NULL, FALSE);
g_return_val_if_fail (fd->fd >= 0, FALSE);
- GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
-
g_mutex_lock (&((GstPoll *) set)->lock);
idx = find_index (set->active_fds, fd);
} else {
GST_WARNING ("%p: couldn't find fd !", set);
}
-
g_mutex_unlock (&((GstPoll *) set)->lock);
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d) %d", set, fd->fd, fd->idx, res);
+
return res;
}
* Returns: The number of #GstPollFD in @set that have activity or 0 when no
* activity was detected after @timeout. If an error occurs, -1 is returned
* and errno is set.
- *
- * Since: 0.10.18
*/
gint
gst_poll_wait (GstPoll * set, GstClockTime timeout)
g_return_val_if_fail (set != NULL, -1);
- GST_DEBUG ("timeout :%" GST_TIME_FORMAT, GST_TIME_ARGS (timeout));
+ GST_DEBUG ("%p: timeout :%" GST_TIME_FORMAT, set, GST_TIME_ARGS (timeout));
is_timer = set->timer;
tvptr = NULL;
}
- GST_DEBUG ("Calling select");
+ GST_DEBUG ("%p: Calling select", set);
res = select (max_fd + 1, &readfds, &writefds, &errorfds, tvptr);
- GST_DEBUG ("After select, res:%d", res);
+ GST_DEBUG ("%p: After select, res:%d", set, res);
} else {
#ifdef HAVE_PSELECT
struct timespec ts;
tsptr = NULL;
}
- GST_DEBUG ("Calling pselect");
+ GST_DEBUG ("%p: Calling pselect", set);
res =
pselect (max_fd + 1, &readfds, &writefds, &errorfds, tsptr, NULL);
- GST_DEBUG ("After pselect, res:%d", res);
+ GST_DEBUG ("%p: After pselect, res:%d", set, res);
#endif
}
* gst_poll_set_flushing().
*
* Returns: %TRUE if the controllability of @set could be updated.
- *
- * Since: 0.10.18
*/
gboolean
gst_poll_set_controllable (GstPoll * set, gboolean controllable)
* used after adding or removing descriptors to @set.
*
* If @set is not controllable, then this call will have no effect.
- *
- * Since: 0.10.18
*/
void
gst_poll_restart (GstPoll * set)
* to gst_poll_wait() will return -1, with errno set to EBUSY.
*
* Unsetting the flushing state will restore normal operation of @set.
- *
- * Since: 0.10.18
*/
void
gst_poll_set_flushing (GstPoll * set, gboolean flushing)
*
* Returns: %TRUE on success. %FALSE when @set is not controllable or when the
* byte could not be written.
- *
- * Since: 0.10.23
*/
gboolean
gst_poll_write_control (GstPoll * set)
*
* Returns: %TRUE on success. %FALSE when @set is not controllable or when there
* was no byte to read.
- *
- * Since: 0.10.23
*/
gboolean
gst_poll_read_control (GstPoll * set)