1bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/*
2bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * I/O functions for libusb
3bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>
4bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com>
5bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
6bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This library is free software; you can redistribute it and/or
7bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * modify it under the terms of the GNU Lesser General Public
8bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * License as published by the Free Software Foundation; either
9bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * version 2.1 of the License, or (at your option) any later version.
10bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
11bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This library is distributed in the hope that it will be useful,
12bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of
13bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Lesser General Public License for more details.
15bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
16bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You should have received a copy of the GNU Lesser General Public
17bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * License along with this library; if not, write to the Free Software
18bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
20bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
21bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <config.h>
22bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <errno.h>
23bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <poll.h>
24bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <pthread.h>
25bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <signal.h>
26bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <stdint.h>
27bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <stdlib.h>
28bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <string.h>
29bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <sys/time.h>
30bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <time.h>
31bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <unistd.h>
32bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
33bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
34bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include <sys/timerfd.h>
35bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
36bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
37bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "libusbi.h"
38bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
39bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/**
40bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \page io Synchronous and asynchronous device I/O
41bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
42bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section intro Introduction
43bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
44bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you're using libusb in your application, you're probably wanting to
45bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * perform I/O with devices - you want to perform USB data transfers.
46bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
47bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb offers two separate interfaces for device I/O. This page aims to
48bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * introduce the two in order to help you decide which one is more suitable
49bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * for your application. You can also choose to use both interfaces in your
50bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * application by considering each transfer on a case-by-case basis.
51bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
52bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Once you have read through the following discussion, you should consult the
53bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * detailed API documentation pages for the details:
54bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - \ref syncio
55bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - \ref asyncio
56bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
57bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section theory Transfers at a logical level
58bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
59bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * At a logical level, USB transfers typically happen in two parts. For
60bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * example, when reading data from a endpoint:
61bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# A request for data is sent to the device
62bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Some time later, the incoming data is received by the host
63bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
64bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or when writing data to an endpoint:
65bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
66bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The data is sent to the device
67bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Some time later, the host receives acknowledgement from the device that
68bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    the data has been transferred.
69bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
70bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * There may be an indefinite delay between the two steps. Consider a
71bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * fictional USB input device with a button that the user can press. In order
72bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to determine when the button is pressed, you would likely submit a request
73bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to read data on a bulk or interrupt endpoint and wait for data to arrive.
74bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Data will arrive when the button is pressed by the user, which is
75bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * potentially hours later.
76bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
77bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb offers both a synchronous and an asynchronous interface to performing
78bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * USB transfers. The main difference is that the synchronous interface
79bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * combines both steps indicated above into a single function call, whereas
80bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the asynchronous interface separates them.
81bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
82bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section sync The synchronous interface
83bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
84bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The synchronous I/O interface allows you to perform a USB transfer with
85bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * a single function call. When the function call returns, the transfer has
86bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * completed and you can parse the results.
87bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
88bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you have used the libusb-0.1 before, this I/O style will seem familar to
89bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * you. libusb-0.1 only offered a synchronous interface.
90bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
91bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In our input device example, to read button presses you might write code
92bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * in the following style:
93bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
94bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevunsigned char data[4];
95bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevint actual_length,
96bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevint r = libusb_bulk_transfer(handle, EP_IN, data, sizeof(data), &actual_length, 0);
97bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevif (r == 0 && actual_length == sizeof(data)) {
98bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// results of the transaction can now be found in the data buffer
99bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// parse them here and report button press
100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev} else {
101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	error();
102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The main advantage of this model is simplicity: you did everything with
106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * a single simple function call.
107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * However, this interface has its limitations. Your application will sleep
109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * inside libusb_bulk_transfer() until the transaction has completed. If it
110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * takes the user 3 hours to press the button, your application will be
111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * sleeping for that long. Execution will be tied up inside the library -
112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the entire thread will be useless for that duration.
113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Another issue is that by tieing up the thread with that single transaction
115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * there is no possibility of performing I/O with multiple endpoints and/or
116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * multiple devices simultaneously, unless you resort to creating one thread
117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * per transaction.
118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Additionally, there is no opportunity to cancel the transfer after the
120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * request has been submitted.
121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * For details on how to use the synchronous API, see the
123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref syncio "synchronous I/O API documentation" pages.
124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section async The asynchronous interface
126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Asynchronous I/O is the most significant new feature in libusb-1.0.
128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Although it is a more complex interface, it solves all the issues detailed
129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * above.
130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Instead of providing which functions that block until the I/O has complete,
132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb's asynchronous interface presents non-blocking functions which
133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * begin a transfer and then return immediately. Your application passes a
134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback function pointer to this non-blocking function, which libusb will
135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * call with the results of the transaction when it has completed.
136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Transfers which have been submitted through the non-blocking functions
138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * can be cancelled with a separate function call.
139bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
140bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The non-blocking nature of this interface allows you to be simultaneously
141bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * performing I/O to multiple endpoints on multiple devices, without having
142bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to use threads.
143bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
144bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This added flexibility does come with some complications though:
145bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - In the interest of being a lightweight library, libusb does not create
146bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * threads and can only operate when your application is calling into it. Your
147bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * application must call into libusb from it's main loop when events are ready
148bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to be handled, or you must use some other scheme to allow libusb to
149bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * undertake whatever work needs to be done.
150bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - libusb also needs to be called into at certain fixed points in time in
151bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * order to accurately handle transfer timeouts.
152bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - Memory handling becomes more complex. You cannot use stack memory unless
153bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the function with that stack is guaranteed not to return until the transfer
154bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback has finished executing.
155bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - You generally lose some linearity from your code flow because submitting
156bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the transfer request is done in a separate function from where the transfer
157bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * results are handled. This becomes particularly obvious when you want to
158bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * submit a second transfer based on the results of an earlier transfer.
159bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
160bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Internally, libusb's synchronous interface is expressed in terms of function
161bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * calls to the asynchronous interface.
162bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
163bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * For details on how to use the asynchronous API, see the
164bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref asyncio "asynchronous I/O API" documentation pages.
165bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
166bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
167bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
168bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/**
169bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \page packetoverflow Packets and overflows
170bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
171bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section packets Packet abstraction
172bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
173bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The USB specifications describe how data is transmitted in packets, with
174bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * constraints on packet size defined by endpoint descriptors. The host must
175bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * not send data payloads larger than the endpoint's maximum packet size.
176bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
177bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb and the underlying OS abstract out the packet concept, allowing you
178bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to request transfers of any size. Internally, the request will be divided
179bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * up into correctly-sized packets. You do not have to be concerned with
180bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * packet sizes, but there is one exception when considering overflows.
181bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
182bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section overflow Bulk/interrupt transfer overflows
183bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
184bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * When requesting data on a bulk endpoint, libusb requires you to supply a
185bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * buffer and the maximum number of bytes of data that libusb can put in that
186bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * buffer. However, the size of the buffer is not communicated to the device -
187bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the device is just asked to send any amount of data.
188bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
189bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * There is no problem if the device sends an amount of data that is less than
190bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or equal to the buffer size. libusb reports this condition to you through
191bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the \ref libusb_transfer::actual_length "libusb_transfer.actual_length"
192bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * field.
193bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
194bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Problems may occur if the device attempts to send more data than can fit in
195bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the buffer. libusb reports LIBUSB_TRANSFER_OVERFLOW for this condition but
196bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * other behaviour is largely undefined: actual_length may or may not be
197bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * accurate, the chunk of data that can fit in the buffer (before overflow)
198bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * may or may not have been transferred.
199bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
200bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Overflows are nasty, but can be avoided. Even though you were told to
201bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * ignore packets above, think about the lower level details: each transfer is
202bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * split into packets (typically small, with a maximum size of 512 bytes).
203bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Overflows can only happen if the final packet in an incoming data transfer
204bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is smaller than the actual packet that the device wants to transfer.
205bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Therefore, you will never see an overflow if your transfer buffer size is a
206bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * multiple of the endpoint's packet size: the final packet will either
207bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * fill up completely or will be only partially filled.
208bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
209bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
210bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/**
211bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * @defgroup asyncio Asynchronous device I/O
212bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
213bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This page details libusb's asynchronous (non-blocking) API for USB device
214bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * I/O. This interface is very powerful but is also quite complex - you will
215bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * need to read this page carefully to understand the necessary considerations
216bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and issues surrounding use of this interface. Simplistic applications
217bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * may wish to consider the \ref syncio "synchronous I/O API" instead.
218bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
219bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The asynchronous interface is built around the idea of separating transfer
220bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * submission and handling of transfer completion (the synchronous model
221bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * combines both of these into one). There may be a long delay between
222bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * submission and completion, however the asynchronous submission function
223bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is non-blocking so will return control to your application during that
224bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * potentially long delay.
225bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
226bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncabstraction Transfer abstraction
227bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
228bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * For the asynchronous I/O, libusb implements the concept of a generic
229bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfer entity for all types of I/O (control, bulk, interrupt,
230bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * isochronous). The generic transfer object must be treated slightly
231bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * differently depending on which type of I/O you are performing with it.
232bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
233bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This is represented by the public libusb_transfer structure type.
234bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
235bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asynctrf Asynchronous transfers
236bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
237bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * We can view asynchronous I/O as a 5 step process:
238bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# <b>Allocation</b>: allocate a libusb_transfer
239bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# <b>Filling</b>: populate the libusb_transfer instance with information
240bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    about the transfer you wish to perform
241bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# <b>Submission</b>: ask libusb to submit the transfer
242bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# <b>Completion handling</b>: examine transfer results in the
243bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    libusb_transfer structure
244bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# <b>Deallocation</b>: clean up resources
245bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
246bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
247bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection asyncalloc Allocation
248bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
249bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This step involves allocating memory for a USB transfer. This is the
250bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * generic transfer object mentioned above. At this stage, the transfer
251bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is "blank" with no details about what type of I/O it will be used for.
252bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
253bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Allocation is done with the libusb_alloc_transfer() function. You must use
254bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * this function rather than allocating your own transfers.
255bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
256bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection asyncfill Filling
257bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
258bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This step is where you take a previously allocated transfer and fill it
259bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * with information to determine the message type and direction, data buffer,
260bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback function, etc.
261bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
262bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You can either fill the required fields yourself or you can use the
263bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * helper functions: libusb_fill_control_transfer(), libusb_fill_bulk_transfer()
264bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and libusb_fill_interrupt_transfer().
265bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
266bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection asyncsubmit Submission
267bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
268bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * When you have allocated a transfer and filled it, you can submit it using
269bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_submit_transfer(). This function returns immediately but can be
270bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * regarded as firing off the I/O request in the background.
271bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
272bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection asynccomplete Completion handling
273bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
274bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * After a transfer has been submitted, one of four things can happen to it:
275bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
276bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - The transfer completes (i.e. some data was transferred)
277bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - The transfer has a timeout and the timeout expires before all data is
278bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transferred
279bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - The transfer fails due to an error
280bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - The transfer is cancelled
281bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
282bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Each of these will cause the user-specified transfer callback function to
283bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * be invoked. It is up to the callback function to determine which of the
284bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * above actually happened and to act accordingly.
285bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
286bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The user-specified callback is passed a pointer to the libusb_transfer
287bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * structure which was used to setup and submit the transfer. At completion
288bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * time, libusb has populated this structure with results of the transfer:
289bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * success or failure reason, number of bytes of data transferred, etc. See
290bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the libusb_transfer structure documentation for more information.
291bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
292bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection Deallocation
293bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
294bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * When a transfer has completed (i.e. the callback function has been invoked),
295bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * you are advised to free the transfer (unless you wish to resubmit it, see
296bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * below). Transfers are deallocated with libusb_free_transfer().
297bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
298bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * It is undefined behaviour to free a transfer which has not completed.
299bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
300bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncresubmit Resubmission
301bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
302bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You may be wondering why allocation, filling, and submission are all
303bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * separated above where they could reasonably be combined into a single
304bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * operation.
305bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
306bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The reason for separation is to allow you to resubmit transfers without
307bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * having to allocate new ones every time. This is especially useful for
308bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * common situations dealing with interrupt endpoints - you allocate one
309bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfer, fill and submit it, and when it returns with results you just
310bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * resubmit it for the next interrupt.
311bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
312bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asynccancel Cancellation
313bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
314bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Another advantage of using the asynchronous interface is that you have
315bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the ability to cancel transfers which have not yet completed. This is
316bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * done by calling the libusb_cancel_transfer() function.
317bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
318bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_cancel_transfer() is asynchronous/non-blocking in itself. When the
319bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * cancellation actually completes, the transfer's callback function will
320bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * be invoked, and the callback function should check the transfer status to
321bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * determine that it was cancelled.
322bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
323bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Freeing the transfer after it has been cancelled but before cancellation
324bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * has completed will result in undefined behaviour.
325bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
326bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * When a transfer is cancelled, some of the data may have been transferred.
327bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb will communicate this to you in the transfer callback. Do not assume
328bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * that no data was transferred.
329bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
330bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints
331bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
332bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If your device does not have predictable transfer sizes (or it misbehaves),
333bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * your application may submit a request for data on an IN endpoint which is
334bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * smaller than the data that the device wishes to send. In some circumstances
335bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * this will cause an overflow, which is a nasty condition to deal with. See
336bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the \ref packetoverflow page for discussion.
337bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
338bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncctrl Considerations for control transfers
339bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
340bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The <tt>libusb_transfer</tt> structure is generic and hence does not
341bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * include specific fields for the control-specific setup packet structure.
342bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
343bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In order to perform a control transfer, you must place the 8-byte setup
344bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * packet at the start of the data buffer. To simplify this, you could
345bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * cast the buffer pointer to type struct libusb_control_setup, or you can
346bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * use the helper function libusb_fill_control_setup().
347bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
348bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The wLength field placed in the setup packet must be the length you would
349bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * expect to be sent in the setup packet: the length of the payload that
350bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * follows (or the expected maximum number of bytes to receive). However,
351bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the length field of the libusb_transfer object must be the length of
352bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the data buffer - i.e. it should be wLength <em>plus</em> the size of
353bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the setup packet (LIBUSB_CONTROL_SETUP_SIZE).
354bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
355bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you use the helper functions, this is simplified for you:
356bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Allocate a buffer of size LIBUSB_CONTROL_SETUP_SIZE plus the size of the
357bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * data you are sending/requesting.
358bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Call libusb_fill_control_setup() on the data buffer, using the transfer
359bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * request size as the wLength value (i.e. do not include the extra space you
360bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * allocated for the control setup).
361bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# If this is a host-to-device transfer, place the data to be transferred
362bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * in the data buffer, starting at offset LIBUSB_CONTROL_SETUP_SIZE.
363bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Call libusb_fill_control_transfer() to associate the data buffer with
364bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the transfer (and to set the remaining details such as callback and timeout).
365bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - Note that there is no parameter to set the length field of the transfer.
366bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *     The length is automatically inferred from the wLength field of the setup
367bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *     packet.
368bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Submit the transfer.
369bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
370bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The multi-byte control setup fields (wValue, wIndex and wLength) must
371bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * be given in little-endian byte order (the endianness of the USB bus).
372bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Endianness conversion is transparently handled by
373bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_fill_control_setup() which is documented to accept host-endian
374bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * values.
375bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
376bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Further considerations are needed when handling transfer completion in
377bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * your callback function:
378bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - As you might expect, the setup packet will still be sitting at the start
379bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * of the data buffer.
380bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - If this was a device-to-host transfer, the received data will be sitting
381bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * at offset LIBUSB_CONTROL_SETUP_SIZE into the buffer.
382bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - The actual_length field of the transfer structure is relative to the
383bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * wLength of the setup packet, rather than the size of the data buffer. So,
384bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * if your wLength was 4, your transfer's <tt>length</tt> was 12, then you
385bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * should expect an <tt>actual_length</tt> of 4 to indicate that the data was
386bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transferred in entirity.
387bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
388bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * To simplify parsing of setup packets and obtaining the data from the
389bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * correct offset, you may wish to use the libusb_control_transfer_get_data()
390bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and libusb_control_transfer_get_setup() functions within your transfer
391bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback.
392bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
393bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Even though control endpoints do not halt, a completed control transfer
394bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * may have a LIBUSB_TRANSFER_STALL status code. This indicates the control
395bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * request was not supported.
396bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
397bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncintr Considerations for interrupt transfers
398bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
399bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * All interrupt transfers are performed using the polling interval presented
400bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * by the bInterval value of the endpoint descriptor.
401bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
402bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asynciso Considerations for isochronous transfers
403bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
404bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Isochronous transfers are more complicated than transfers to
405bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * non-isochronous endpoints.
406bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
407bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * To perform I/O to an isochronous endpoint, allocate the transfer by calling
408bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_alloc_transfer() with an appropriate number of isochronous packets.
409bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
410bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * During filling, set \ref libusb_transfer::type "type" to
411bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_transfer_type::LIBUSB_TRANSFER_TYPE_ISOCHRONOUS
412bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * "LIBUSB_TRANSFER_TYPE_ISOCHRONOUS", and set
413bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_transfer::num_iso_packets "num_iso_packets" to a value less than
414bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or equal to the number of packets you requested during allocation.
415bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_alloc_transfer() does not set either of these fields for you, given
416bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * that you might not even use the transfer on an isochronous endpoint.
417bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
418bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Next, populate the length field for the first num_iso_packets entries in
419bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the \ref libusb_transfer::iso_packet_desc "iso_packet_desc" array. Section
420bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * 5.6.3 of the USB2 specifications describe how the maximum isochronous
421bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * packet length is determined by the wMaxPacketSize field in the endpoint
422bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * descriptor.
423bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Two functions can help you here:
424bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
425bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - libusb_get_max_iso_packet_size() is an easy way to determine the max
426bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   packet size for an isochronous endpoint. Note that the maximum packet
427bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   size is actually the maximum number of bytes that can be transmitted in
428bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   a single microframe, therefore this function multiplies the maximum number
429bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   of bytes per transaction by the number of transaction opportunities per
430bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   microframe.
431bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - libusb_set_iso_packet_lengths() assigns the same length to all packets
432bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   within a transfer, which is usually what you want.
433bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
434bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * For outgoing transfers, you'll obviously fill the buffer and populate the
435bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * packet descriptors in hope that all the data gets transferred. For incoming
436bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfers, you must ensure the buffer has sufficient capacity for
437bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the situation where all packets transfer the full amount of requested data.
438bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
439bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Completion handling requires some extra consideration. The
440bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_transfer::actual_length "actual_length" field of the transfer
441bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is meaningless and should not be examined; instead you must refer to the
442bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_iso_packet_descriptor::actual_length "actual_length" field of
443bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * each individual packet.
444bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
445bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The \ref libusb_transfer::status "status" field of the transfer is also a
446bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * little misleading:
447bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  - If the packets were submitted and the isochronous data microframes
448bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    completed normally, status will have value
449bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    \ref libusb_transfer_status::LIBUSB_TRANSFER_COMPLETED
450bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    "LIBUSB_TRANSFER_COMPLETED". Note that bus errors and software-incurred
451bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    delays are not counted as transfer errors; the transfer.status field may
452bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    indicate COMPLETED even if some or all of the packets failed. Refer to
453bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    the \ref libusb_iso_packet_descriptor::status "status" field of each
454bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    individual packet to determine packet failures.
455bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  - The status field will have value
456bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR
457bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    "LIBUSB_TRANSFER_ERROR" only when serious errors were encountered.
458bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  - Other transfer status codes occur with normal behaviour.
459bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
460bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The data for each packet will be found at an offset into the buffer that
461bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * can be calculated as if each prior packet completed in full. The
462bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_get_iso_packet_buffer() and libusb_get_iso_packet_buffer_simple()
463bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * functions may help you here.
464bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
465bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncmem Memory caveats
466bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
467bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In most circumstances, it is not safe to use stack memory for transfer
468bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * buffers. This is because the function that fired off the asynchronous
469bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfer may return before libusb has finished using the buffer, and when
470bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the function returns it's stack gets destroyed. This is true for both
471bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * host-to-device and device-to-host transfers.
472bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
473bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The only case in which it is safe to use stack memory is where you can
474bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * guarantee that the function owning the stack space for the buffer does not
475bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * return until after the transfer's callback function has completed. In every
476bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * other case, you need to use heap memory instead.
477bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
478bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncflags Fine control
479bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
480bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Through using this asynchronous interface, you may find yourself repeating
481bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * a few simple operations many times. You can apply a bitwise OR of certain
482bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * flags to a transfer to simplify certain things:
483bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_SHORT_NOT_OK
484bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   "LIBUSB_TRANSFER_SHORT_NOT_OK" results in transfers which transferred
485bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   less than the requested amount of data being marked with status
486bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR "LIBUSB_TRANSFER_ERROR"
487bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   (they would normally be regarded as COMPLETED)
488bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER
489bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask libusb to free the transfer
490bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   buffer when freeing the transfer.
491bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER
492bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   "LIBUSB_TRANSFER_FREE_TRANSFER" causes libusb to automatically free the
493bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   transfer after the transfer callback returns.
494bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
495bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section asyncevent Event handling
496bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
497bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In accordance of the aim of being a lightweight library, libusb does not
498bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * create threads internally. This means that libusb code does not execute
499bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * at any time other than when your application is calling a libusb function.
500bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * However, an asynchronous model requires that libusb perform work at various
501bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * points in time - namely processing the results of previously-submitted
502bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfers and invoking the user-supplied callback function.
503bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
504bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This gives rise to the libusb_handle_events() function which your
505bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * application must call into when libusb has work do to. This gives libusb
506bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the opportunity to reap pending transfers, invoke callbacks, etc.
507bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
508bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The first issue to discuss here is how your application can figure out
509bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * when libusb has work to do. In fact, there are two naive options which
510bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * do not actually require your application to know this:
511bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Periodically call libusb_handle_events() in non-blocking mode at fixed
512bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    short intervals from your main loop
513bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated
514bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    thread.
515bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
516bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The first option is plainly not very nice, and will cause unnecessary
517bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * CPU wakeups leading to increased power usage and decreased battery life.
518bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The second option is not very nice either, but may be the nicest option
519bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * available to you if the "proper" approach can not be applied to your
520bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * application (read on...).
521bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
522bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The recommended option is to integrate libusb with your application main
523bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * event loop. libusb exposes a set of file descriptors which allow you to do
524bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * this. Your main loop is probably already calling poll() or select() or a
525bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * variant on a set of file descriptors for other event sources (e.g. keyboard
526bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * button presses, mouse movements, network sockets, etc). You then add
527bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb's file descriptors to your poll()/select() calls, and when activity
528bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is detected on such descriptors you know it is time to call
529bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_handle_events().
530bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
531bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * There is one final event handling complication. libusb supports
532bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * asynchronous transfers which time out after a specified time period, and
533bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * this requires that libusb is called into at or after the timeout so that
534bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the timeout can be handled. So, in addition to considering libusb's file
535bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * descriptors in your main event loop, you must also consider that libusb
536bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * sometimes needs to be called into at fixed points in time even when there
537bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is no file descriptor activity.
538bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
539bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * For the details on retrieving the set of file descriptors and determining
540bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the next timeout, see the \ref poll "polling and timing" API documentation.
541bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
542bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
543bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/**
544bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * @defgroup poll Polling and timing
545bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
546bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This page documents libusb's functions for polling events and timing.
547bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * These functions are only necessary for users of the
548bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref asyncio "asynchronous API". If you are only using the simpler
549bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref syncio "synchronous API" then you do not need to ever call these
550bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * functions.
551bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
552bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The justification for the functionality described here has already been
553bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * discussed in the \ref asyncevent "event handling" section of the
554bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * asynchronous API documentation. In summary, libusb does not create internal
555bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * threads for event processing and hence relies on your application calling
556bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * into libusb at certain points in time so that pending events can be handled.
557bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In order to know precisely when libusb needs to be called into, libusb
558bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * offers you a set of pollable file descriptors and information about when
559bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the next timeout expires.
560bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
561bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you are using the asynchronous I/O API, you must take one of the two
562bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * following options, otherwise your I/O will not complete.
563bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
564bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section pollsimple The simple option
565bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
566bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If your application revolves solely around libusb and does not need to
567bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * handle other event sources, you can have a program structure as follows:
568bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
569bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// initialize libusb
570bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// find and open device
571bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// maybe fire off some initial async I/O
572bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
573bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevwhile (user_has_not_requested_exit)
574bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_handle_events(ctx);
575bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
576bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// clean up and exit
577bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
578bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
579bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * With such a simple main loop, you do not have to worry about managing
580bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * sets of file descriptors or handling timeouts. libusb_handle_events() will
581bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * handle those details internally.
582bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
583bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section pollmain The more advanced option
584bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
585bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In more advanced applications, you will already have a main loop which
586bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is monitoring other event sources: network sockets, X11 events, mouse
587bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * movements, etc. Through exposing a set of file descriptors, libusb is
588bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * designed to cleanly integrate into such main loops.
589bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
590bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In addition to polling file descriptors for the other event sources, you
591bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * take a set of file descriptors from libusb and monitor those too. When you
592bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * detect activity on libusb's file descriptors, you call
593bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_handle_events_timeout() in non-blocking mode.
594bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
595bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * What's more, libusb may also need to handle events at specific moments in
596bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * time. No file descriptor activity is generated at these times, so your
597bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * own application needs to be continually aware of when the next one of these
598bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * moments occurs (through calling libusb_get_next_timeout()), and then it
599bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * needs to call libusb_handle_events_timeout() in non-blocking mode when
600bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * these moments occur. This means that you need to adjust your
601bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * poll()/select() timeout accordingly.
602bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
603bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb provides you with a set of file descriptors to poll and expects you
604bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to poll all of them, treating them as a single entity. The meaning of each
605bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * file descriptor in the set is an internal implementation detail,
606bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * platform-dependent and may vary from release to release. Don't try and
607bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * interpret the meaning of the file descriptors, just do as libusb indicates,
608bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * polling all of them at once.
609bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
610bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * In pseudo-code, you want something that looks like:
611bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
612bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// initialise libusb
613bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
614bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevlibusb_get_pollfds(ctx)
615bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevwhile (user has not requested application exit) {
616bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_get_next_timeout(ctx);
617bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	poll(on libusb file descriptors plus any other event sources of interest,
618bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		using a timeout no larger than the value libusb just suggested)
619bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (poll() indicated activity on libusb file descriptors)
620bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_handle_events_timeout(ctx, 0);
621bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (time has elapsed to or beyond the libusb timeout)
622bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_handle_events_timeout(ctx, 0);
623bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// handle events from other sources here
624bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
625bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
626bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// clean up and exit
627bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
628bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
629bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection polltime Notes on time-based events
630bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
631bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The above complication with having to track time and call into libusb at
632bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * specific moments is a bit of a headache. For maximum compatibility, you do
633bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * need to write your main loop as above, but you may decide that you can
634bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * restrict the supported platforms of your application and get away with
635bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * a more simplistic scheme.
636bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
637bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * These time-based event complications are \b not required on the following
638bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * platforms:
639bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  - Darwin
640bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  - Linux, provided that the following version requirements are satisfied:
641bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - Linux v2.6.27 or newer, compiled with timerfd support
642bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - glibc v2.9 or newer
643bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - libusb v1.0.5 or newer
644bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
645bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Under these configurations, libusb_get_next_timeout() will \em always return
646bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * 0, so your main loop can be simplified to:
647bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
648bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// initialise libusb
649bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
650bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevlibusb_get_pollfds(ctx)
651bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevwhile (user has not requested application exit) {
652bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	poll(on libusb file descriptors plus any other event sources of interest,
653bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		using any timeout that you like)
654bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (poll() indicated activity on libusb file descriptors)
655bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_handle_events_timeout(ctx, 0);
656bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// handle events from other sources here
657bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
658bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
659bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// clean up and exit
660bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
661bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
662bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Do remember that if you simplify your main loop to the above, you will
663bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * lose compatibility with some platforms (including legacy Linux platforms,
664bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and <em>any future platforms supported by libusb which may have time-based
665bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * event requirements</em>). The resultant problems will likely appear as
666bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * strange bugs in your application.
667bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
668bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You can use the libusb_pollfds_handle_timeouts() function to do a runtime
669bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * check to see if it is safe to ignore the time-based event complications.
670bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If your application has taken the shortcut of ignoring libusb's next timeout
671bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * in your main loop, then you are advised to check the return value of
672bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_pollfds_handle_timeouts() during application startup, and to abort
673bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * if the platform does suffer from these timing complications.
674bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
675bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection fdsetchange Changes in the file descriptor set
676bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
677bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The set of file descriptors that libusb uses as event sources may change
678bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * during the life of your application. Rather than having to repeatedly
679bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * call libusb_get_pollfds(), you can set up notification functions for when
680bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the file descriptor set changes using libusb_set_pollfd_notifiers().
681bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
682bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection mtissues Multi-threaded considerations
683bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
684bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Unfortunately, the situation is complicated further when multiple threads
685bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * come into play. If two threads are monitoring the same file descriptors,
686bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the fact that only one thread will be woken up when an event occurs causes
687bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * some headaches.
688bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
689bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The events lock, event waiters lock, and libusb_handle_events_locked()
690bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * entities are added to solve these problems. You do not need to be concerned
691bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * with these entities otherwise.
692bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
693bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * See the extra documentation: \ref mtasync
694bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
695bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
696bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \page mtasync Multi-threaded applications and asynchronous I/O
697bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
698bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb is a thread-safe library, but extra considerations must be applied
699bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to applications which interact with libusb from multiple threads.
700bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
701bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The underlying issue that must be addressed is that all libusb I/O
702bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * revolves around monitoring file descriptors through the poll()/select()
703bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * system calls. This is directly exposed at the
704bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref asyncio "asynchronous interface" but it is important to note that the
705bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref syncio "synchronous interface" is implemented on top of the
706bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * asynchonrous interface, therefore the same considerations apply.
707bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
708bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The issue is that if two or more threads are concurrently calling poll()
709bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or select() on libusb's file descriptors then only one of those threads
710bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * will be woken up when an event arrives. The others will be completely
711bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * oblivious that anything has happened.
712bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
713bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Consider the following pseudo-code, which submits an asynchronous transfer
714bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * then waits for its completion. This style is one way you could implement a
715bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * synchronous interface on top of the asynchronous interface (and libusb
716bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * does something similar, albeit more advanced due to the complications
717bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * explained on this page).
718bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
719bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
720bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevvoid cb(struct libusb_transfer *transfer)
721bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
722bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int *completed = transfer->user_data;
723bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	*completed = 1;
724bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
725bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
726bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevvoid myfunc() {
727bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_transfer *transfer;
728bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE];
729bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int completed = 0;
730bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
731bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	transfer = libusb_alloc_transfer(0);
732bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_fill_control_setup(buffer,
733bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0);
734bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000);
735bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_submit_transfer(transfer);
736bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
737bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	while (!completed) {
738bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		poll(libusb file descriptors, 120*1000);
739bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (poll indicates activity)
740bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			libusb_handle_events_timeout(ctx, 0);
741bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
742bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	printf("completed!");
743bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// other code here
744bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
745bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
746bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
747bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Here we are <em>serializing</em> completion of an asynchronous event
748bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * against a condition - the condition being completion of a specific transfer.
749bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The poll() loop has a long timeout to minimize CPU usage during situations
750bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * when nothing is happening (it could reasonably be unlimited).
751bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
752bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If this is the only thread that is polling libusb's file descriptors, there
753bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is no problem: there is no danger that another thread will swallow up the
754bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * event that we are interested in. On the other hand, if there is another
755bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * thread polling the same descriptors, there is a chance that it will receive
756bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the event that we were interested in. In this situation, <tt>myfunc()</tt>
757bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * will only realise that the transfer has completed on the next iteration of
758bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the loop, <em>up to 120 seconds later.</em> Clearly a two-minute delay is
759bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * undesirable, and don't even think about using short timeouts to circumvent
760bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * this issue!
761bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
762bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The solution here is to ensure that no two threads are ever polling the
763bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * file descriptors at the same time. A naive implementation of this would
764bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * impact the capabilities of the library, so libusb offers the scheme
765bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * documented below to ensure no loss of functionality.
766bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
767bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Before we go any further, it is worth mentioning that all libusb-wrapped
768bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * event handling procedures fully adhere to the scheme documented below.
769bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This includes libusb_handle_events() and all the synchronous I/O functions -
770bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb hides this headache from you. You do not need to worry about any
771bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * of these issues if you stick to that level.
772bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
773bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The problem is when we consider the fact that libusb exposes file
774bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * descriptors to allow for you to integrate asynchronous USB I/O into
775bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * existing main loops, effectively allowing you to do some work behind
776bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb's back. If you do take libusb's file descriptors and pass them to
777bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * poll()/select() yourself, you need to be aware of the associated issues.
778bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
779bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section eventlock The events lock
780bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
781bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The first concept to be introduced is the events lock. The events lock
782bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is used to serialize threads that want to handle events, such that only
783bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * one thread is handling events at any one time.
784bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
785bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You must take the events lock before polling libusb file descriptors,
786bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * using libusb_lock_events(). You must release the lock as soon as you have
787bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * aborted your poll()/select() loop, using libusb_unlock_events().
788bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
789bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \section threadwait Letting other threads do the work for you
790bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
791bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Although the events lock is a critical part of the solution, it is not
792bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * enough on it's own. You might wonder if the following is sufficient...
793bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
794bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_lock_events(ctx);
795bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	while (!completed) {
796bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		poll(libusb file descriptors, 120*1000);
797bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (poll indicates activity)
798bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			libusb_handle_events_timeout(ctx, 0);
799bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
800bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_unlock_events(ctx);
801bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
802bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * ...and the answer is that it is not. This is because the transfer in the
803bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * code shown above may take a long time (say 30 seconds) to complete, and
804bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the lock is not released until the transfer is completed.
805bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
806bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Another thread with similar code that wants to do event handling may be
807bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * working with a transfer that completes after a few milliseconds. Despite
808bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * having such a quick completion time, the other thread cannot check that
809bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * status of its transfer until the code above has finished (30 seconds later)
810bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * due to contention on the lock.
811bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
812bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * To solve this, libusb offers you a mechanism to determine when another
813bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * thread is handling events. It also offers a mechanism to block your thread
814bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * until the event handling thread has completed an event (and this mechanism
815bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * does not involve polling of file descriptors).
816bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
817bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * After determining that another thread is currently handling events, you
818bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * obtain the <em>event waiters</em> lock using libusb_lock_event_waiters().
819bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You then re-check that some other thread is still handling events, and if
820bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * so, you call libusb_wait_for_event().
821bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
822bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_wait_for_event() puts your application to sleep until an event
823bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * occurs, or until a thread releases the events lock. When either of these
824bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * things happen, your thread is woken up, and should re-check the condition
825bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * it was waiting on. It should also re-check that another thread is handling
826bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * events, and if not, it should start handling events itself.
827bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
828bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This looks like the following, as pseudo-code:
829bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\code
830bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevretry:
831bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevif (libusb_try_lock_events(ctx) == 0) {
832bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// we obtained the event lock: do our own event handling
833bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	while (!completed) {
834bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!libusb_event_handling_ok(ctx)) {
835bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			libusb_unlock_events(ctx);
836bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			goto retry;
837bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
838bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		poll(libusb file descriptors, 120*1000);
839bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (poll indicates activity)
840bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			libusb_handle_events_locked(ctx, 0);
841bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
842bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_unlock_events(ctx);
843bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev} else {
844bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// another thread is doing event handling. wait for it to signal us that
845bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	// an event has completed
846bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_lock_event_waiters(ctx);
847bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
848bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	while (!completed) {
849bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		// now that we have the event waiters lock, double check that another
850bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		// thread is still handling events for us. (it may have ceased handling
851bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		// events in the time it took us to reach this point)
852bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!libusb_event_handler_active(ctx)) {
853bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			// whoever was handling events is no longer doing so, try again
854bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			libusb_unlock_event_waiters(ctx);
855bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			goto retry;
856bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
857bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
858bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_wait_for_event(ctx);
859bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
860bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_unlock_event_waiters(ctx);
861bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
862bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprintf("completed!\n");
863bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev\endcode
864bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
865bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * A naive look at the above code may suggest that this can only support
866bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * one event waiter (hence a total of 2 competing threads, the other doing
867bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * event handling), because the event waiter seems to have taken the event
868bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * waiters lock while waiting for an event. However, the system does support
869bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * multiple event waiters, because libusb_wait_for_event() actually drops
870bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the lock while waiting, and reaquires it before continuing.
871bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
872bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * We have now implemented code which can dynamically handle situations where
873bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * nobody is handling events (so we should do it ourselves), and it can also
874bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * handle situations where another thread is doing event handling (so we can
875bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * piggyback onto them). It is also equipped to handle a combination of
876bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the two, for example, another thread is doing event handling, but for
877bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * whatever reason it stops doing so before our condition is met, so we take
878bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * over the event handling.
879bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
880bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Four functions were introduced in the above pseudo-code. Their importance
881bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * should be apparent from the code shown above.
882bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb_try_lock_events() is a non-blocking function which attempts
883bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    to acquire the events lock but returns a failure code if it is contended.
884bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb_event_handling_ok() checks that libusb is still happy for your
885bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    thread to be performing event handling. Sometimes, libusb needs to
886bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    interrupt the event handler, and this is how you can check if you have
887bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    been interrupted. If this function returns 0, the correct behaviour is
888bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    for you to give up the event handling lock, and then to repeat the cycle.
889bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    The following libusb_try_lock_events() will fail, so you will become an
890bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    events waiter. For more information on this, read \ref fullstory below.
891bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb_handle_events_locked() is a variant of
892bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    libusb_handle_events_timeout() that you can call while holding the
893bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    events lock. libusb_handle_events_timeout() itself implements similar
894bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    logic to the above, so be sure not to call it when you are
895bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    "working behind libusb's back", as is the case here.
896bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb_event_handler_active() determines if someone is currently
897bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    holding the events lock
898bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
899bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You might be wondering why there is no function to wake up all threads
900bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * blocked on libusb_wait_for_event(). This is because libusb can do this
901bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * internally: it will wake up all such threads when someone calls
902bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_unlock_events() or when a transfer completes (at the point after its
903bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback has returned).
904bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
905bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection fullstory The full story
906bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
907bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The above explanation should be enough to get you going, but if you're
908bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * really thinking through the issues then you may be left with some more
909bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * questions regarding libusb's internals. If you're curious, read on, and if
910bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * not, skip to the next section to avoid confusing yourself!
911bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
912bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The immediate question that may spring to mind is: what if one thread
913bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * modifies the set of file descriptors that need to be polled while another
914bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * thread is doing event handling?
915bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
916bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * There are 2 situations in which this may happen.
917bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb_open() will add another file descriptor to the poll set,
918bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    therefore it is desirable to interrupt the event handler so that it
919bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    restarts, picking up the new descriptor.
920bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb_close() will remove a file descriptor from the poll set. There
921bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    are all kinds of race conditions that could arise here, so it is
922bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    important that nobody is doing event handling at this time.
923bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
924bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb handles these issues internally, so application developers do not
925bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * have to stop their event handlers while opening/closing devices. Here's how
926bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * it works, focusing on the libusb_close() situation first:
927bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
928bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# During initialization, libusb opens an internal pipe, and it adds the read
929bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    end of this pipe to the set of file descriptors to be polled.
930bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# During libusb_close(), libusb writes some dummy data on this control pipe.
931bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    This immediately interrupts the event handler. libusb also records
932bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    internally that it is trying to interrupt event handlers for this
933bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    high-priority event.
934bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# At this point, some of the functions described above start behaving
935bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    differently:
936bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - libusb_event_handling_ok() starts returning 1, indicating that it is NOT
937bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *     OK for event handling to continue.
938bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - libusb_try_lock_events() starts returning 1, indicating that another
939bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *     thread holds the event handling lock, even if the lock is uncontended.
940bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *   - libusb_event_handler_active() starts returning 1, indicating that
941bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *     another thread is doing event handling, even if that is not true.
942bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The above changes in behaviour result in the event handler stopping and
943bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    giving up the events lock very quickly, giving the high-priority
944bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    libusb_close() operation a "free ride" to acquire the events lock. All
945bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    threads that are competing to do event handling become event waiters.
946bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# With the events lock held inside libusb_close(), libusb can safely remove
947bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    a file descriptor from the poll set, in the safety of knowledge that
948bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    nobody is polling those descriptors or trying to access the poll set.
949bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# After obtaining the events lock, the close operation completes very
950bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    quickly (usually a matter of milliseconds) and then immediately releases
951bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    the events lock.
952bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# At the same time, the behaviour of libusb_event_handling_ok() and friends
953bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    reverts to the original, documented behaviour.
954bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The release of the events lock causes the threads that are waiting for
955bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    events to be woken up and to start competing to become event handlers
956bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    again. One of them will succeed; it will then re-obtain the list of poll
957bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    descriptors, and USB I/O will then continue as normal.
958bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
959bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_open() is similar, and is actually a more simplistic case. Upon a
960bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * call to libusb_open():
961bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
962bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The device is opened and a file descriptor is added to the poll set.
963bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# libusb sends some dummy data on the control pipe, and records that it
964bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    is trying to modify the poll descriptor set.
965bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The event handler is interrupted, and the same behaviour change as for
966bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    libusb_close() takes effect, causing all event handling threads to become
967bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    event waiters.
968bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The libusb_open() implementation takes its free ride to the events lock.
969bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# Happy that it has successfully paused the events handler, libusb_open()
970bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    releases the events lock.
971bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The event waiter threads are all woken up and compete to become event
972bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    handlers again. The one that succeeds will obtain the list of poll
973bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *    descriptors again, which will include the addition of the new device.
974bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
975bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \subsection concl Closing remarks
976bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
977bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The above may seem a little complicated, but hopefully I have made it clear
978bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * why such complications are necessary. Also, do not forget that this only
979bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * applies to applications that take libusb's file descriptors and integrate
980bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * them into their own polling loops.
981bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
982bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You may decide that it is OK for your multi-threaded application to ignore
983bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * some of the rules and locks detailed above, because you don't think that
984bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * two threads can ever be polling the descriptors at the same time. If that
985bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is the case, then that's good news for you because you don't have to worry.
986bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * But be careful here; remember that the synchronous I/O functions do event
987bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * handling internally. If you have one thread doing event handling in a loop
988bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * (without implementing the rules and locking semantics documented above)
989bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and another trying to send a synchronous USB transfer, you will end up with
990bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * two threads monitoring the same descriptors, and the above-described
991bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * undesirable behaviour occuring. The solution is for your polling thread to
992bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * play by the rules; the synchronous I/O functions do so, and this will result
993bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * in them getting along in perfect harmony.
994bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
995bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you do have a dedicated thread doing event handling, it is perfectly
996bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * legal for it to take the event handling lock for long periods of time. Any
997bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * synchronous I/O functions you call from other threads will transparently
998bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * fall back to the "event waiters" mechanism detailed above. The only
999bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * consideration that your event handling thread must apply is the one related
1000bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to libusb_event_handling_ok(): you must call this before every poll(), and
1001bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * give up the events lock if instructed.
1002bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1003bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1004bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevint usbi_io_init(struct libusb_context *ctx)
1005bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1006bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1007bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1008bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_init(&ctx->flying_transfers_lock, NULL);
1009bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_init(&ctx->pollfds_lock, NULL);
1010bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_init(&ctx->pollfd_modify_lock, NULL);
1011bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_init(&ctx->events_lock, NULL);
1012bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_init(&ctx->event_waiters_lock, NULL);
1013bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_cond_init(&ctx->event_waiters_cond, NULL);
1014bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_init(&ctx->flying_transfers);
1015bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_init(&ctx->pollfds);
1016bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1017bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* FIXME should use an eventfd on kernels that support it */
1018bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = pipe(ctx->ctrl_pipe);
1019bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1020bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_OTHER;
1021bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1022bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_add_pollfd(ctx, ctx->ctrl_pipe[0], POLLIN);
1023bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1024bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1025bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1026bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
1027bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(),
1028bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		TFD_NONBLOCK);
1029bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (ctx->timerfd >= 0) {
1030bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("using timerfd for timeouts");
1031bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		r = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN);
1032bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (r < 0) {
1033bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			close(ctx->timerfd);
1034bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return r;
1035bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
1036bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	} else {
1037bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("timerfd not available (code %d error %d)", ctx->timerfd, errno);
1038bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		ctx->timerfd = -1;
1039bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1040bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1041bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1042bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1043bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1044bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1045bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevvoid usbi_io_exit(struct libusb_context *ctx)
1046bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1047bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_remove_pollfd(ctx, ctx->ctrl_pipe[0]);
1048bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	close(ctx->ctrl_pipe[0]);
1049bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	close(ctx->ctrl_pipe[1]);
1050bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
1051bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (usbi_using_timerfd(ctx)) {
1052bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_remove_pollfd(ctx, ctx->timerfd);
1053bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		close(ctx->timerfd);
1054bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1055bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1056bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1057bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1058bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int calculate_timeout(struct usbi_transfer *transfer)
1059bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1060bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1061bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timespec current_time;
1062bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	unsigned int timeout =
1063bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		__USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout;
1064bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1065bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!timeout)
1066bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
1067bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1068bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &current_time);
1069bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0) {
1070bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_err(ITRANSFER_CTX(transfer),
1071bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			"failed to read monotonic clock, errno=%d", errno);
1072bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1073bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1074bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1075bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	current_time.tv_sec += timeout / 1000;
1076bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	current_time.tv_nsec += (timeout % 1000) * 1000000;
1077bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1078bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (current_time.tv_nsec > 1000000000) {
1079bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		current_time.tv_nsec -= 1000000000;
1080bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		current_time.tv_sec++;
1081bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1082bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1083bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	TIMESPEC_TO_TIMEVAL(&transfer->timeout, &current_time);
1084bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1085bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1086bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1087bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* add a transfer to the (timeout-sorted) active transfers list.
1088bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * returns 1 if the transfer has a timeout and it is the timeout next to
1089bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * expire */
1090bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int add_to_flying_list(struct usbi_transfer *transfer)
1091bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1092bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *cur;
1093bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval *timeout = &transfer->timeout;
1094bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_context *ctx = ITRANSFER_CTX(transfer);
1095bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r = 0;
1096bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int first = 1;
1097bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1098bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->flying_transfers_lock);
1099bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* if we have no other flying transfers, start the list with this one */
1101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (list_empty(&ctx->flying_transfers)) {
1102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		list_add(&transfer->list, &ctx->flying_transfers);
1103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (timerisset(timeout))
1104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = 1;
1105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		goto out;
1106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* if we have infinite timeout, append to end of list */
1109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!timerisset(timeout)) {
1110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		list_add_tail(&transfer->list, &ctx->flying_transfers);
1111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		goto out;
1112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* otherwise, find appropriate place in list */
1115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(cur, &ctx->flying_transfers, list) {
1116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* find first timeout that occurs after the transfer in question */
1117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		struct timeval *cur_tv = &cur->timeout;
1118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!timerisset(cur_tv) || (cur_tv->tv_sec > timeout->tv_sec) ||
1120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev				(cur_tv->tv_sec == timeout->tv_sec &&
1121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev					cur_tv->tv_usec > timeout->tv_usec)) {
1122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			list_add_tail(&transfer->list, &cur->list);
1123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = first;
1124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			goto out;
1125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
1126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		first = 0;
1127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* otherwise we need to be inserted at the end */
1130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_add_tail(&transfer->list, &ctx->flying_transfers);
1131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevout:
1132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->flying_transfers_lock);
1133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return r;
1134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup asyncio
1137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Allocate a libusb transfer with a specified number of isochronous packet
1138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * descriptors. The returned transfer is pre-initialized for you. When the new
1139bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfer is no longer needed, it should be freed with
1140bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_free_transfer().
1141bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1142bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Transfers intended for non-isochronous endpoints (e.g. control, bulk,
1143bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * interrupt) should specify an iso_packets count of zero.
1144bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1145bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * For transfers intended for isochronous endpoints, specify an appropriate
1146bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * number of packet descriptors to be allocated as part of the transfer.
1147bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The returned transfer is not specially initialized for isochronous I/O;
1148bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * you are still required to set the
1149bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_transfer::num_iso_packets "num_iso_packets" and
1150bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_transfer::type "type" fields accordingly.
1151bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1152bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * It is safe to allocate a transfer with some isochronous packets and then
1153bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * use it on a non-isochronous endpoint. If you do this, ensure that at time
1154bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * of submission, num_iso_packets is 0 and that type is set appropriately.
1155bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1156bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param iso_packets number of isochronous packet descriptors to allocate
1157bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns a newly allocated transfer, or NULL on error
1158bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1159bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED struct libusb_transfer *libusb_alloc_transfer(int iso_packets)
1160bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1161bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	size_t os_alloc_size = usbi_backend->transfer_priv_size
1162bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		+ (usbi_backend->add_iso_packet_size * iso_packets);
1163bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int alloc_size = sizeof(struct usbi_transfer)
1164bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		+ sizeof(struct libusb_transfer)
1165bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		+ (sizeof(struct libusb_iso_packet_descriptor) * iso_packets)
1166bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		+ os_alloc_size;
1167bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *itransfer = malloc(alloc_size);
1168bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!itransfer)
1169bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return NULL;
1170bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1171bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	memset(itransfer, 0, alloc_size);
1172bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	itransfer->num_iso_packets = iso_packets;
1173bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_init(&itransfer->lock, NULL);
1174bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return __USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1175bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1176bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1177bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup asyncio
1178bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Free a transfer structure. This should be called for all transfers
1179bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * allocated with libusb_alloc_transfer().
1180bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1181bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If the \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER
1182bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * "LIBUSB_TRANSFER_FREE_BUFFER" flag is set and the transfer buffer is
1183bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * non-NULL, this function will also free the transfer buffer using the
1184bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * standard system memory allocator (e.g. free()).
1185bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1186bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * It is legal to call this function with a NULL transfer. In this case,
1187bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the function will simply return safely.
1188bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1189bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * It is not legal to free an active transfer (one which has been submitted
1190bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and has not yet completed).
1191bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1192bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param transfer the transfer to free
1193bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1194bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED void libusb_free_transfer(struct libusb_transfer *transfer)
1195bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1196bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *itransfer;
1197bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!transfer)
1198bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return;
1199bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1200bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (transfer->flags & LIBUSB_TRANSFER_FREE_BUFFER && transfer->buffer)
1201bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		free(transfer->buffer);
1202bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1203bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	itransfer = __LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);
1204bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_destroy(&itransfer->lock);
1205bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	free(itransfer);
1206bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1207bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1208bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup asyncio
1209bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Submit a transfer. This function will fire off the USB transfer and then
1210bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * return immediately.
1211bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1212bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param transfer the transfer to submit
1213bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 on success
1214bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected
1215bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns LIBUSB_ERROR_BUSY if the transfer has already been submitted.
1216bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns another LIBUSB_ERROR code on other failure
1217bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1218bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_submit_transfer(struct libusb_transfer *transfer)
1219bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1220bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_context *ctx = TRANSFER_CTX(transfer);
1221bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *itransfer =
1222bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		__LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);
1223bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1224bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int first;
1225bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1226bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&itransfer->lock);
1227bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	itransfer->transferred = 0;
1228bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	itransfer->flags = 0;
1229bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = calculate_timeout(itransfer);
1230bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0) {
1231bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		r = LIBUSB_ERROR_OTHER;
1232bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		goto out;
1233bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1234bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1235bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	first = add_to_flying_list(itransfer);
1236bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->submit_transfer(itransfer);
1237bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
1238bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_mutex_lock(&ctx->flying_transfers_lock);
1239bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		list_del(&itransfer->list);
1240bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_mutex_unlock(&ctx->flying_transfers_lock);
1241bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1242bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
1243bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	else if (first && usbi_using_timerfd(ctx)) {
1244bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* if this transfer has the lowest timeout of all active transfers,
1245bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		 * rearm the timerfd with this transfer's timeout */
1246bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		const struct itimerspec it = { {0, 0},
1247bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			{ itransfer->timeout.tv_sec, itransfer->timeout.tv_usec * 1000 } };
1248bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("arm timerfd for timeout in %dms (first in line)", transfer->timeout);
1249bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL);
1250bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (r < 0)
1251bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = LIBUSB_ERROR_OTHER;
1252bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1253bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1254bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1255bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevout:
1256bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&itransfer->lock);
1257bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return r;
1258bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1259bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1260bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup asyncio
1261bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Asynchronously cancel a previously submitted transfer.
1262bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function returns immediately, but this does not indicate cancellation
1263bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is complete. Your callback function will be invoked at some later time
1264bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * with a transfer status of
1265bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \ref libusb_transfer_status::LIBUSB_TRANSFER_CANCELLED
1266bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * "LIBUSB_TRANSFER_CANCELLED."
1267bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1268bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param transfer the transfer to cancel
1269bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 on success
1270bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns LIBUSB_ERROR_NOT_FOUND if the transfer is already complete or
1271bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * cancelled.
1272bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns a LIBUSB_ERROR code on failure
1273bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1274bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_cancel_transfer(struct libusb_transfer *transfer)
1275bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1276bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *itransfer =
1277bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		__LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);
1278bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1279bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1280bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("");
1281bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&itransfer->lock);
1282bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->cancel_transfer(itransfer);
1283bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1284bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_err(TRANSFER_CTX(transfer),
1285bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			"cancel transfer failed error %d", r);
1286bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&itransfer->lock);
1287bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return r;
1288bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1289bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1290bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
1291bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int disarm_timerfd(struct libusb_context *ctx)
1292bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1293bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	const struct itimerspec disarm_timer = { { 0, 0 }, { 0, 0 } };
1294bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1295bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1296bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("");
1297bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = timerfd_settime(ctx->timerfd, 0, &disarm_timer, NULL);
1298bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1299bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_OTHER;
1300bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	else
1301bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
1302bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1303bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1304bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* iterates through the flying transfers, and rearms the timerfd based on the
1305bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * next upcoming timeout.
1306bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * must be called with flying_list locked.
1307bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * returns 0 if there was no timeout to arm, 1 if the next timeout was armed,
1308bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or a LIBUSB_ERROR code on failure.
1309bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1310bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int arm_timerfd_for_next_timeout(struct libusb_context *ctx)
1311bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1312bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *transfer;
1313bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1314bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(transfer, &ctx->flying_transfers, list) {
1315bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		struct timeval *cur_tv = &transfer->timeout;
1316bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1317bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* if we've reached transfers of infinite timeout, then we have no
1318bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		 * arming to do */
1319bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!timerisset(cur_tv))
1320bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return 0;
1321bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1322bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* act on first transfer that is not already cancelled */
1323bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!(transfer->flags & USBI_TRANSFER_TIMED_OUT)) {
1324bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			int r;
1325bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			const struct itimerspec it = { {0, 0},
1326bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev				{ cur_tv->tv_sec, cur_tv->tv_usec * 1000 } };
1327bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			usbi_dbg("next timeout originally %dms", __USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout);
1328bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL);
1329bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			if (r < 0)
1330bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev				return LIBUSB_ERROR_OTHER;
1331bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return 1;
1332bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
1333bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1334bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1335bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1336bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1337bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#else
1338bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int disarm_timerfd(struct libusb_context *ctx)
1339bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1340bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1341bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1342bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int arm_timerfd_for_next_timeout(struct libusb_context *ctx)
1343bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1344bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1345bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1346bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1347bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1348bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* Handle completion of a transfer (completion might be an error condition).
1349bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This will invoke the user-supplied callback function, which may end up
1350bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * freeing the transfer. Therefore you cannot use the transfer structure
1351bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * after calling this function, and you should free all backend-specific
1352bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * data before calling it.
1353bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Do not call this function with the usbi_transfer lock held. User-specified
1354bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback functions may attempt to directly resubmit the transfer, which
1355bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * will attempt to take the lock. */
1356bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevint usbi_handle_transfer_completion(struct usbi_transfer *itransfer,
1357bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	enum libusb_transfer_status status)
1358bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1359bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_transfer *transfer =
1360bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		__USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1361bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_context *ctx = TRANSFER_CTX(transfer);
1362bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	uint8_t flags;
1363bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1364bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1365bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* FIXME: could be more intelligent with the timerfd here. we don't need
1366bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * to disarm the timerfd if there was no timer running, and we only need
1367bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * to rearm the timerfd if the transfer that expired was the one with
1368bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * the shortest timeout. */
1369bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1370bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->flying_transfers_lock);
1371bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_del(&itransfer->list);
1372bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = arm_timerfd_for_next_timeout(ctx);
1373bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->flying_transfers_lock);
1374bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1375bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0) {
1376bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1377bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	} else if (r == 0) {
1378bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		r = disarm_timerfd(ctx);
1379bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (r < 0)
1380bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return r;
1381bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1382bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1383bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (status == LIBUSB_TRANSFER_COMPLETED
1384bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			&& transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) {
1385bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		int rqlen = transfer->length;
1386bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL)
1387bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			rqlen -= LIBUSB_CONTROL_SETUP_SIZE;
1388bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (rqlen != itransfer->transferred) {
1389bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			usbi_dbg("interpreting short transfer as error");
1390bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			status = LIBUSB_TRANSFER_ERROR;
1391bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
1392bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1393bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1394bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	flags = transfer->flags;
1395bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	transfer->status = status;
1396bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	transfer->actual_length = itransfer->transferred;
1397bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (transfer->callback)
1398bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		transfer->callback(transfer);
1399bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* transfer might have been freed by the above call, do not use from
1400bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * this point. */
1401bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (flags & LIBUSB_TRANSFER_FREE_TRANSFER)
1402bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_free_transfer(transfer);
1403bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->event_waiters_lock);
1404bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_cond_broadcast(&ctx->event_waiters_cond);
1405bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->event_waiters_lock);
1406bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1407bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1408bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1409bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* Similar to usbi_handle_transfer_completion() but exclusively for transfers
1410bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * that were asynchronously cancelled. The same concerns w.r.t. freeing of
1411bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * transfers exist here.
1412bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Do not call this function with the usbi_transfer lock held. User-specified
1413bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * callback functions may attempt to directly resubmit the transfer, which
1414bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * will attempt to take the lock. */
1415bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevint usbi_handle_transfer_cancellation(struct usbi_transfer *transfer)
1416bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1417bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* if the URB was cancelled due to timeout, report timeout to the user */
1418bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (transfer->flags & USBI_TRANSFER_TIMED_OUT) {
1419bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("detected timeout cancellation");
1420bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_TIMED_OUT);
1421bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1422bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1423bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* otherwise its a normal async cancel */
1424bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_CANCELLED);
1425bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1426bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1427bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1428bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Attempt to acquire the event handling lock. This lock is used to ensure that
1429bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * only one thread is monitoring libusb event sources at any one time.
1430bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1431bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You only need to use this lock if you are developing an application
1432bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * which calls poll() or select() on libusb's file descriptors directly.
1433bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you stick to libusb's event handling loop functions (e.g.
1434bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_handle_events()) then you do not need to be concerned with this
1435bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * locking.
1436bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1437bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * While holding this lock, you are trusted to actually be handling events.
1438bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you are no longer handling events, you must call libusb_unlock_events()
1439bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * as soon as possible.
1440bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1441bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1442bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 if the lock was obtained successfully
1443bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 1 if the lock was not obtained (i.e. another thread holds the lock)
1444bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1445bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1446bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_try_lock_events(libusb_context *ctx)
1447bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1448bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1449bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1450bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1451bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* is someone else waiting to modify poll fds? if so, don't let this thread
1452bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * start event handling */
1453bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfd_modify_lock);
1454bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = ctx->pollfd_modify;
1455bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfd_modify_lock);
1456bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
1457bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("someone else is modifying poll fds");
1458bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 1;
1459bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1460bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1461bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = pthread_mutex_trylock(&ctx->events_lock);
1462bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r)
1463bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 1;
1464bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1465bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->event_handler_active = 1;
1466bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1467bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1468bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1469bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1470bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Acquire the event handling lock, blocking until successful acquisition if
1471bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * it is contended. This lock is used to ensure that only one thread is
1472bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * monitoring libusb event sources at any one time.
1473bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1474bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You only need to use this lock if you are developing an application
1475bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * which calls poll() or select() on libusb's file descriptors directly.
1476bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you stick to libusb's event handling loop functions (e.g.
1477bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_handle_events()) then you do not need to be concerned with this
1478bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * locking.
1479bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1480bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * While holding this lock, you are trusted to actually be handling events.
1481bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you are no longer handling events, you must call libusb_unlock_events()
1482bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * as soon as possible.
1483bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1484bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1485bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1486bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1487bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED void libusb_lock_events(libusb_context *ctx)
1488bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1489bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1490bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->events_lock);
1491bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->event_handler_active = 1;
1492bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1493bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1494bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1495bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Release the lock previously acquired with libusb_try_lock_events() or
1496bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_lock_events(). Releasing this lock will wake up any threads blocked
1497bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * on libusb_wait_for_event().
1498bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1499bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1500bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1501bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1502bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED void libusb_unlock_events(libusb_context *ctx)
1503bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1504bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1505bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->event_handler_active = 0;
1506bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->events_lock);
1507bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1508bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* FIXME: perhaps we should be a bit more efficient by not broadcasting
1509bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * the availability of the events lock when we are modifying pollfds
1510bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * (check ctx->pollfd_modify)? */
1511bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->event_waiters_lock);
1512bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_cond_broadcast(&ctx->event_waiters_cond);
1513bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->event_waiters_lock);
1514bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1515bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1516bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1517bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Determine if it is still OK for this thread to be doing event handling.
1518bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1519bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Sometimes, libusb needs to temporarily pause all event handlers, and this
1520bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * is the function you should use before polling file descriptors to see if
1521bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * this is the case.
1522bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1523bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If this function instructs your thread to give up the events lock, you
1524bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * should just continue the usual logic that is documented in \ref mtasync.
1525bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * On the next iteration, your thread will fail to obtain the events lock,
1526bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and will hence become an event waiter.
1527bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1528bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function should be called while the events lock is held: you don't
1529bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * need to worry about the results of this function if your thread is not
1530bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the current event handler.
1531bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1532bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1533bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 1 if event handling can start or continue
1534bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 if this thread must give up the events lock
1535bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref fullstory "Multi-threaded I/O: the full story"
1536bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1537bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_event_handling_ok(libusb_context *ctx)
1538bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1539bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1540bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1541bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1542bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* is someone else waiting to modify poll fds? if so, don't let this thread
1543bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * continue event handling */
1544bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfd_modify_lock);
1545bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = ctx->pollfd_modify;
1546bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfd_modify_lock);
1547bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
1548bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("someone else is modifying poll fds");
1549bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
1550bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1551bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1552bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 1;
1553bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1554bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1555bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1556bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1557bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Determine if an active thread is handling events (i.e. if anyone is holding
1558bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the event handling lock).
1559bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1560bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1561bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 1 if a thread is handling events
1562bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 if there are no threads currently handling events
1563bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1564bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1565bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_event_handler_active(libusb_context *ctx)
1566bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1567bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1568bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1569bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1570bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* is someone else waiting to modify poll fds? if so, don't let this thread
1571bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * start event handling -- indicate that event handling is happening */
1572bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfd_modify_lock);
1573bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = ctx->pollfd_modify;
1574bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfd_modify_lock);
1575bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
1576bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("someone else is modifying poll fds");
1577bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 1;
1578bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1579bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1580bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return ctx->event_handler_active;
1581bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1582bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1583bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1584bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Acquire the event waiters lock. This lock is designed to be obtained under
1585bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the situation where you want to be aware when events are completed, but
1586bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * some other thread is event handling so calling libusb_handle_events() is not
1587bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * allowed.
1588bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1589bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You then obtain this lock, re-check that another thread is still handling
1590bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * events, then call libusb_wait_for_event().
1591bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1592bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You only need to use this lock if you are developing an application
1593bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * which calls poll() or select() on libusb's file descriptors directly,
1594bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * <b>and</b> may potentially be handling events from 2 threads simultaenously.
1595bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If you stick to libusb's event handling loop functions (e.g.
1596bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_handle_events()) then you do not need to be concerned with this
1597bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * locking.
1598bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1599bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1600bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1601bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1602bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED void libusb_lock_event_waiters(libusb_context *ctx)
1603bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1604bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1605bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->event_waiters_lock);
1606bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1607bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1608bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1609bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Release the event waiters lock.
1610bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1611bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1612bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1613bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED void libusb_unlock_event_waiters(libusb_context *ctx)
1614bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1615bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1616bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->event_waiters_lock);
1617bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1618bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1619bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1620bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Wait for another thread to signal completion of an event. Must be called
1621bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * with the event waiters lock held, see libusb_lock_event_waiters().
1622bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1623bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function will block until any of the following conditions are met:
1624bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# The timeout expires
1625bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# A transfer completes
1626bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * -# A thread releases the event handling lock through libusb_unlock_events()
1627bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1628bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Condition 1 is obvious. Condition 2 unblocks your thread <em>after</em>
1629bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the callback for the transfer has completed. Condition 3 is important
1630bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * because it means that the thread that was previously handling events is no
1631bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * longer doing so, so if any events are to complete, another thread needs to
1632bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * step up and start event handling.
1633bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1634bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function releases the event waiters lock before putting your thread
1635bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to sleep, and reacquires the lock as it is being woken up.
1636bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1637bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1638bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param tv maximum timeout for this blocking function. A NULL value
1639bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * indicates unlimited timeout.
1640bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 after a transfer completes or another thread stops event handling
1641bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 1 if the timeout expired
1642bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
1643bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1644bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_wait_for_event(libusb_context *ctx, struct timeval *tv)
1645bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1646bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timespec timeout;
1647bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1648bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1649bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1650bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (tv == NULL) {
1651bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_cond_wait(&ctx->event_waiters_cond, &ctx->event_waiters_lock);
1652bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
1653bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1654bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1655bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout);
1656bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0) {
1657bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_err(ctx, "failed to read realtime clock, error %d", errno);
1658bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_OTHER;
1659bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1660bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1661bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	timeout.tv_sec += tv->tv_sec;
1662bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	timeout.tv_nsec += tv->tv_usec * 1000;
1663bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (timeout.tv_nsec > 1000000000) {
1664bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		timeout.tv_nsec -= 1000000000;
1665bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		timeout.tv_sec++;
1666bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1667bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1668bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = pthread_cond_timedwait(&ctx->event_waiters_cond,
1669bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		&ctx->event_waiters_lock, &timeout);
1670bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return (r == ETIMEDOUT);
1671bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1672bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1673bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic void handle_timeout(struct usbi_transfer *itransfer)
1674bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1675bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_transfer *transfer =
1676bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		__USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
1677bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1678bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1679bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	itransfer->flags |= USBI_TRANSFER_TIMED_OUT;
1680bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = libusb_cancel_transfer(transfer);
1681bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1682bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_warn(TRANSFER_CTX(transfer),
1683bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			"async cancel failed %d errno=%d", r, errno);
1684bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1685bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1686bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_OS_HANDLES_TIMEOUT
1687bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int handle_timeouts_locked(struct libusb_context *ctx)
1688bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1689bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1690bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1691bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int handle_timeouts(struct libusb_context *ctx)
1692bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1693bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1694bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1695bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#else
1696bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int handle_timeouts_locked(struct libusb_context *ctx)
1697bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1698bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1699bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timespec systime_ts;
1700bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval systime;
1701bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *transfer;
1702bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1703bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (list_empty(&ctx->flying_transfers))
1704bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
1705bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1706bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* get current time */
1707bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts);
1708bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1709bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1710bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1711bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	TIMESPEC_TO_TIMEVAL(&systime, &systime_ts);
1712bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1713bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* iterate through flying transfers list, finding all transfers that
1714bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * have expired timeouts */
1715bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(transfer, &ctx->flying_transfers, list) {
1716bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		struct timeval *cur_tv = &transfer->timeout;
1717bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1718bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* if we've reached transfers of infinite timeout, we're all done */
1719bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!timerisset(cur_tv))
1720bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return 0;
1721bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1722bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* ignore timeouts we've already handled */
1723bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (transfer->flags & USBI_TRANSFER_TIMED_OUT)
1724bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			continue;
1725bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1726bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* if transfer has non-expired timeout, nothing more to do */
1727bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if ((cur_tv->tv_sec > systime.tv_sec) ||
1728bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev				(cur_tv->tv_sec == systime.tv_sec &&
1729bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev					cur_tv->tv_usec > systime.tv_usec))
1730bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return 0;
1731bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1732bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* otherwise, we've got an expired timeout to handle */
1733bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		handle_timeout(transfer);
1734bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1735bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1736bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1737bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1738bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int handle_timeouts(struct libusb_context *ctx)
1739bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1740bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1741bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1742bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->flying_transfers_lock);
1743bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = handle_timeouts_locked(ctx);
1744bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->flying_transfers_lock);
1745bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return r;
1746bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1747bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1748bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1749bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
1750bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int handle_timerfd_trigger(struct libusb_context *ctx)
1751bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1752bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1753bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1754bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = disarm_timerfd(ctx);
1755bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1756bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1757bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1758bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->flying_transfers_lock);
1759bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1760bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* process the timeout that just happened */
1761bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = handle_timeouts_locked(ctx);
1762bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1763bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		goto out;
1764bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1765bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* arm for next timeout*/
1766bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = arm_timerfd_for_next_timeout(ctx);
1767bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1768bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevout:
1769bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->flying_transfers_lock);
1770bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return r;
1771bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1772bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1773bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1774bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* do the actual event handling. assumes that no other thread is concurrently
1775bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * doing the same thing. */
1776bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int handle_events(struct libusb_context *ctx, struct timeval *tv)
1777bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1778bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1779bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_pollfd *ipollfd;
1780bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	nfds_t nfds = 0;
1781bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct pollfd *fds;
1782bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int i = -1;
1783bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int timeout_ms;
1784bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1785bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfds_lock);
1786bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(ipollfd, &ctx->pollfds, list)
1787bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		nfds++;
1788bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1789bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* TODO: malloc when number of fd's changes, not on every poll */
1790bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	fds = malloc(sizeof(*fds) * nfds);
1791bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!fds)
1792bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_NO_MEM;
1793bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1794bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(ipollfd, &ctx->pollfds, list) {
1795bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		struct libusb_pollfd *pollfd = &ipollfd->pollfd;
1796bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		int fd = pollfd->fd;
1797bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		i++;
1798bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		fds[i].fd = fd;
1799bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		fds[i].events = pollfd->events;
1800bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		fds[i].revents = 0;
1801bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1802bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfds_lock);
1803bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1804bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	timeout_ms = (tv->tv_sec * 1000) + (tv->tv_usec / 1000);
1805bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1806bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* round up to next millisecond */
1807bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (tv->tv_usec % 1000)
1808bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		timeout_ms++;
1809bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1810bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms);
1811bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = poll(fds, nfds, timeout_ms);
1812bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("poll() returned %d", r);
1813bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r == 0) {
1814bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		free(fds);
1815bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return handle_timeouts(ctx);
1816bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	} else if (r == -1 && errno == EINTR) {
1817bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		free(fds);
1818bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_INTERRUPTED;
1819bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	} else if (r < 0) {
1820bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		free(fds);
1821bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_err(ctx, "poll failed %d err=%d\n", r, errno);
1822bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_IO;
1823bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1824bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1825bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* fd[0] is always the ctrl pipe */
1826bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (fds[0].revents) {
1827bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* another thread wanted to interrupt event handling, and it succeeded!
1828bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		 * handle any other events that cropped up at the same time, and
1829bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		 * simply return */
1830bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("caught a fish on the control pipe");
1831bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1832bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (r == 1) {
1833bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = 0;
1834bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			goto handled;
1835bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		} else {
1836bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			/* prevent OS backend from trying to handle events on ctrl pipe */
1837bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			fds[0].revents = 0;
1838bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r--;
1839bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
1840bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1841bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1842bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifdef USBI_TIMERFD_AVAILABLE
1843bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* on timerfd configurations, fds[1] is the timerfd */
1844bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (usbi_using_timerfd(ctx) && fds[1].revents) {
1845bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* timerfd indicates that a timeout has expired */
1846bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		int ret;
1847bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("timerfd triggered");
1848bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1849bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		ret = handle_timerfd_trigger(ctx);
1850bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (ret < 0) {
1851bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			/* return error code */
1852bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = ret;
1853bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			goto handled;
1854bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		} else if (r == 1) {
1855bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			/* no more active file descriptors, nothing more to do */
1856bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r = 0;
1857bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			goto handled;
1858bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		} else {
1859bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			/* more events pending...
1860bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			 * prevent OS backend from trying to handle events on timerfd */
1861bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			fds[1].revents = 0;
1862bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			r--;
1863bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
1864bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1865bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
1866bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1867bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->handle_events(ctx, fds, nfds, r);
1868bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r)
1869bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_err(ctx, "backend handle_events failed with error %d", r);
1870bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1871bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevhandled:
1872bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	free(fds);
1873bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return r;
1874bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1875bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1876bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* returns the smallest of:
1877bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  1. timeout of next URB
1878bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *  2. user-supplied timeout
1879bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * returns 1 if there is an already-expired timeout, otherwise returns 0
1880bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and populates out
1881bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1882bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevstatic int get_next_timeout(libusb_context *ctx, struct timeval *tv,
1883bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval *out)
1884bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1885bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval timeout;
1886bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r = libusb_get_next_timeout(ctx, &timeout);
1887bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
1888bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* timeout already expired? */
1889bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!timerisset(&timeout))
1890bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			return 1;
1891bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1892bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* choose the smallest of next URB timeout or user specified timeout */
1893bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (timercmp(&timeout, tv, <))
1894bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			*out = timeout;
1895bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		else
1896bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			*out = *tv;
1897bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	} else {
1898bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		*out = *tv;
1899bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1900bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
1901bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1902bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1903bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1904bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Handle any pending events.
1905bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1906bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb determines "pending events" by checking if any timeouts have expired
1907bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and by checking the set of file descriptors for activity.
1908bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1909bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If a zero timeval is passed, this function will handle any already-pending
1910bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * events and then immediately return in non-blocking style.
1911bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1912bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * If a non-zero timeval is passed and no events are currently pending, this
1913bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * function will block waiting for events to handle up until the specified
1914bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * timeout. If an event arrives or a signal is raised, this function will
1915bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * return early.
1916bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1917bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1918bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param tv the maximum time to block waiting for events, or zero for
1919bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * non-blocking mode
1920bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 on success, or a LIBUSB_ERROR code on failure
1921bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1922bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_handle_events_timeout(libusb_context *ctx,
1923bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval *tv)
1924bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1925bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
1926bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval poll_timeout;
1927bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1928bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
1929bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = get_next_timeout(ctx, tv, &poll_timeout);
1930bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
1931bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* timeout already expired */
1932bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return handle_timeouts(ctx);
1933bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1934bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1935bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevretry:
1936bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (libusb_try_lock_events(ctx) == 0) {
1937bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* we obtained the event lock: do our own event handling */
1938bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		r = handle_events(ctx, &poll_timeout);
1939bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_unlock_events(ctx);
1940bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1941bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1942bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1943bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* another thread is doing event handling. wait for pthread events that
1944bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * notify event completion. */
1945bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_lock_event_waiters(ctx);
1946bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1947bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!libusb_event_handler_active(ctx)) {
1948bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* we hit a race: whoever was event handling earlier finished in the
1949bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		 * time it took us to reach this point. try the cycle again. */
1950bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		libusb_unlock_event_waiters(ctx);
1951bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("event handler was active but went away, retrying");
1952bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		goto retry;
1953bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
1954bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1955bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("another thread is doing event handling");
1956bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = libusb_wait_for_event(ctx, &poll_timeout);
1957bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_unlock_event_waiters(ctx);
1958bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1959bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0)
1960bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return r;
1961bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	else if (r == 1)
1962bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return handle_timeouts(ctx);
1963bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	else
1964bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
1965bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1966bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1967bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1968bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Handle any pending events in blocking mode. There is currently a timeout
1969bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * hardcoded at 60 seconds but we plan to make it unlimited in future. For
1970bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * finer control over whether this function is blocking or non-blocking, or
1971bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * for control over the timeout, use libusb_handle_events_timeout() instead.
1972bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1973bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1974bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 on success, or a LIBUSB_ERROR code on failure
1975bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
1976bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_handle_events(libusb_context *ctx)
1977bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
1978bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval tv;
1979bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	tv.tv_sec = 60;
1980bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	tv.tv_usec = 0;
1981bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return libusb_handle_events_timeout(ctx, &tv);
1982bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
1983bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
1984bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
1985bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Handle any pending events by polling file descriptors, without checking if
1986bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * any other threads are already doing so. Must be called with the event lock
1987bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * held, see libusb_lock_events().
1988bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1989bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function is designed to be called under the situation where you have
1990bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * taken the event lock and are calling poll()/select() directly on libusb's
1991bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * file descriptors (as opposed to using libusb_handle_events() or similar).
1992bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You detect events on libusb's descriptors, so you then call this function
1993bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * with a zero timeout value (while still holding the event lock).
1994bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
1995bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
1996bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param tv the maximum time to block waiting for events, or zero for
1997bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * non-blocking mode
1998bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 on success, or a LIBUSB_ERROR code on failure
1999bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref mtasync
2000bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
2001bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_handle_events_locked(libusb_context *ctx,
2002bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval *tv)
2003bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2004bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
2005bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval poll_timeout;
2006bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2007bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
2008bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = get_next_timeout(ctx, tv, &poll_timeout);
2009bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r) {
2010bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		/* timeout already expired */
2011bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return handle_timeouts(ctx);
2012bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2013bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2014bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return handle_events(ctx, &poll_timeout);
2015bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2016bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2017bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
2018bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Determines whether your application must apply special timing considerations
2019bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * when monitoring libusb's file descriptors.
2020bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2021bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function is only useful for applications which retrieve and poll
2022bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb's file descriptors in their own main loop (\ref pollmain).
2023bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2024bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Ordinarily, libusb's event handler needs to be called into at specific
2025bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * moments in time (in addition to times when there is activity on the file
2026bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * descriptor set). The usual approach is to use libusb_get_next_timeout()
2027bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * to learn about when the next timeout occurs, and to adjust your
2028bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * poll()/select() timeout accordingly so that you can make a call into the
2029bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * library at that time.
2030bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2031bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Some platforms supported by libusb do not come with this baggage - any
2032bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * events relevant to timing will be represented by activity on the file
2033bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * descriptor set, and libusb_get_next_timeout() will always return 0.
2034bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function allows you to detect whether you are running on such a
2035bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * platform.
2036bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2037bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Since v1.0.5.
2038bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2039bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
2040bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 if you must call into libusb at times determined by
2041bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_get_next_timeout(), or 1 if all timeout events are handled internally
2042bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or through regular activity on the file descriptors.
2043bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \see \ref pollmain "Polling libusb file descriptors for event handling"
2044bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
2045bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_pollfds_handle_timeouts(libusb_context *ctx)
2046bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2047bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#if defined(USBI_OS_HANDLES_TIMEOUT)
2048bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 1;
2049bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#elif defined(USBI_TIMERFD_AVAILABLE)
2050bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
2051bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return usbi_using_timerfd(ctx);
2052bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#else
2053bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
2054bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
2055bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2056bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2057bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
2058bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Determine the next internal timeout that libusb needs to handle. You only
2059bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * need to use this function if you are calling poll() or select() or similar
2060bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * on libusb's file descriptors yourself - you do not need to use it if you
2061bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * are calling libusb_handle_events() or a variant directly.
2062bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2063bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * You should call this function in your main loop in order to determine how
2064bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * long to wait for select() or poll() to return results. libusb needs to be
2065bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * called into at this timeout, so you should use it as an upper bound on
2066bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * your select() or poll() call.
2067bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2068bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * When the timeout has expired, call into libusb_handle_events_timeout()
2069bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * (perhaps in non-blocking mode) so that libusb can handle the timeout.
2070bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2071bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * This function may return 1 (success) and an all-zero timeval. If this is
2072bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * the case, it indicates that libusb has a timeout that has already expired
2073bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * so you should call libusb_handle_events_timeout() or similar immediately.
2074bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * A return code of 0 indicates that there are no pending timeouts.
2075bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2076bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * On some platforms, this function will always returns 0 (no pending
2077bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * timeouts). See \ref polltime.
2078bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2079bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
2080bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param tv output location for a relative time against the current
2081bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * clock in which libusb must be called into in order to process timeout events
2082bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns 0 if there are no pending timeouts, 1 if a timeout was returned,
2083bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * or LIBUSB_ERROR_OTHER on failure
2084bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
2085bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED int libusb_get_next_timeout(libusb_context *ctx,
2086bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval *tv)
2087bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2088bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifndef USBI_OS_HANDLES_TIMEOUT
2089bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *transfer;
2090bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timespec cur_ts;
2091bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval cur_tv;
2092bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct timeval *next_timeout;
2093bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int r;
2094bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int found = 0;
2095bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2096bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
2097bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (usbi_using_timerfd(ctx))
2098bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
2099bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->flying_transfers_lock);
2101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (list_empty(&ctx->flying_transfers)) {
2102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_mutex_unlock(&ctx->flying_transfers_lock);
2103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("no URBs, no timeout!");
2104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
2105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* find next transfer which hasn't already been processed as timed out */
2108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(transfer, &ctx->flying_transfers, list) {
2109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!(transfer->flags & USBI_TRANSFER_TIMED_OUT)) {
2110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			found = 1;
2111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			break;
2112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
2113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->flying_transfers_lock);
2115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!found) {
2117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("all URBs have already been processed for timeouts");
2118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
2119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	next_timeout = &transfer->timeout;
2122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* no timeout for next transfer */
2124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!timerisset(next_timeout)) {
2125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("no URBs with timeouts, no timeout!");
2126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return 0;
2127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts);
2130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (r < 0) {
2131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_err(ctx, "failed to read monotonic clock, errno=%d", errno);
2132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_OTHER;
2133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts);
2135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (timercmp(&cur_tv, next_timeout, >=)) {
2137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("first timeout already expired");
2138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		timerclear(tv);
2139bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	} else {
2140bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		timersub(next_timeout, &cur_tv, tv);
2141bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("next timeout in %d.%06ds", tv->tv_sec, tv->tv_usec);
2142bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2143bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2144bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 1;
2145bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#else
2146bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
2147bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif
2148bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2149bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2150bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
2151bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Register notification functions for file descriptor additions/removals.
2152bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * These functions will be invoked for every new or removed file descriptor
2153bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * that libusb uses as an event source.
2154bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2155bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * To remove notifiers, pass NULL values for the function pointers.
2156bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2157bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Note that file descriptors may have been added even before you register
2158bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * these notifiers (e.g. at libusb_init() time).
2159bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2160bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Additionally, note that the removal notifier may be called during
2161bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * libusb_exit() (e.g. when it is closing file descriptors that were opened
2162bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * and added to the poll set at libusb_init() time). If you don't want this,
2163bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * remove the notifiers immediately before calling libusb_exit().
2164bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2165bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
2166bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param added_cb pointer to function for addition notifications
2167bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param removed_cb pointer to function for removal notifications
2168bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param user_data User data to be passed back to callbacks (useful for
2169bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * passing context information)
2170bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
2171bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED void libusb_set_pollfd_notifiers(libusb_context *ctx,
2172bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,
2173bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	void *user_data)
2174bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2175bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
2176bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->fd_added_cb = added_cb;
2177bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->fd_removed_cb = removed_cb;
2178bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ctx->fd_cb_user_data = user_data;
2179bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2180bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2181bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* Add a file descriptor to the list of file descriptors to be monitored.
2182bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * events should be specified as a bitmask of events passed to poll(), e.g.
2183bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * POLLIN and/or POLLOUT. */
2184bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevint usbi_add_pollfd(struct libusb_context *ctx, int fd, short events)
2185bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2186bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_pollfd *ipollfd = malloc(sizeof(*ipollfd));
2187bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!ipollfd)
2188bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return LIBUSB_ERROR_NO_MEM;
2189bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2190bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("add fd %d events %d", fd, events);
2191bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ipollfd->pollfd.fd = fd;
2192bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ipollfd->pollfd.events = events;
2193bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfds_lock);
2194bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_add_tail(&ipollfd->list, &ctx->pollfds);
2195bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfds_lock);
2196bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2197bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (ctx->fd_added_cb)
2198bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data);
2199bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return 0;
2200bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2201bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2202bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* Remove a file descriptor from the list of file descriptors to be polled. */
2203bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevvoid usbi_remove_pollfd(struct libusb_context *ctx, int fd)
2204bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2205bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_pollfd *ipollfd;
2206bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	int found = 0;
2207bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2208bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("remove fd %d", fd);
2209bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfds_lock);
2210bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(ipollfd, &ctx->pollfds, list)
2211bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (ipollfd->pollfd.fd == fd) {
2212bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			found = 1;
2213bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			break;
2214bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		}
2215bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2216bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!found) {
2217bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_dbg("couldn't find fd %d to remove", fd);
2218bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_mutex_unlock(&ctx->pollfds_lock);
2219bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		return;
2220bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2221bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2222bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_del(&ipollfd->list);
2223bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfds_lock);
2224bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	free(ipollfd);
2225bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (ctx->fd_removed_cb)
2226bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		ctx->fd_removed_cb(fd, ctx->fd_cb_user_data);
2227bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2228bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2229bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/** \ingroup poll
2230bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * Retrieve a list of file descriptors that should be polled by your main loop
2231bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * as libusb event sources.
2232bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2233bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The returned list is NULL-terminated and should be freed with free() when
2234bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * done. The actual list contents must not be touched.
2235bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev *
2236bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \param ctx the context to operate on, or NULL for the default context
2237bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * \returns a NULL-terminated list of libusb_pollfd structures, or NULL on
2238bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * error
2239bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
2240bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor GoulishevAPI_EXPORTED const struct libusb_pollfd **libusb_get_pollfds(
2241bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	libusb_context *ctx)
2242bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2243bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct libusb_pollfd **ret = NULL;
2244bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_pollfd *ipollfd;
2245bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	size_t i = 0;
2246bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	size_t cnt = 0;
2247bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	USBI_GET_CONTEXT(ctx);
2248bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2249bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_lock(&ctx->pollfds_lock);
2250bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(ipollfd, &ctx->pollfds, list)
2251bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		cnt++;
2252bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2253bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ret = calloc(cnt + 1, sizeof(struct libusb_pollfd *));
2254bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	if (!ret)
2255bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		goto out;
2256bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2257bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	list_for_each_entry(ipollfd, &ctx->pollfds, list)
2258bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		ret[i++] = (struct libusb_pollfd *) ipollfd;
2259bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	ret[cnt] = NULL;
2260bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2261bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevout:
2262bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	pthread_mutex_unlock(&ctx->pollfds_lock);
2263bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	return (const struct libusb_pollfd **) ret;
2264bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2265bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2266bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/* Backends call this from handle_events to report disconnection of a device.
2267bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev * The transfers get cancelled appropriately.
2268bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev */
2269bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevvoid usbi_handle_disconnect(struct libusb_device_handle *handle)
2270bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev{
2271bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *cur;
2272bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	struct usbi_transfer *to_cancel;
2273bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2274bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	usbi_dbg("device %d.%d",
2275bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		handle->dev->bus_number, handle->dev->device_address);
2276bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2277bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	/* terminate all pending transfers with the LIBUSB_TRANSFER_NO_DEVICE
2278bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * status code.
2279bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 *
2280bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * this is a bit tricky because:
2281bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * 1. we can't do transfer completion while holding flying_transfers_lock
2282bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * 2. the transfers list can change underneath us - if we were to build a
2283bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 *    list of transfers to complete (while holding look), the situation
2284bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 *    might be different by the time we come to free them
2285bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 *
2286bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * so we resort to a loop-based approach as below
2287bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 * FIXME: is this still potentially racy?
2288bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	 */
2289bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2290bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	while (1) {
2291bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_mutex_lock(&HANDLE_CTX(handle)->flying_transfers_lock);
2292bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		to_cancel = NULL;
2293bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		list_for_each_entry(cur, &HANDLE_CTX(handle)->flying_transfers, list)
2294bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			if (__USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == handle) {
2295bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev				to_cancel = cur;
2296bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev				break;
2297bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			}
2298bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		pthread_mutex_unlock(&HANDLE_CTX(handle)->flying_transfers_lock);
2299bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2300bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		if (!to_cancel)
2301bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev			break;
2302bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2303bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_backend->clear_transfer_priv(to_cancel);
2304bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev		usbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE);
2305bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev	}
2306bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2307bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}
2308bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev
2309