aboutsummaryrefslogtreecommitdiff
path: root/libusb/libusbi.h
diff options
context:
space:
mode:
Diffstat (limited to 'libusb/libusbi.h')
-rw-r--r--libusb/libusbi.h48
1 files changed, 35 insertions, 13 deletions
diff --git a/libusb/libusbi.h b/libusb/libusbi.h
index b1fc88c..3b0c610 100644
--- a/libusb/libusbi.h
+++ b/libusb/libusbi.h
@@ -73,7 +73,7 @@
#endif
/* The following is used to silence warnings for unused variables */
-#if defined(UNREFERENCED_PARAMETER)
+#if defined(UNREFERENCED_PARAMETER) && !defined(__GNUC__)
#define UNUSED(var) UNREFERENCED_PARAMETER(var)
#else
#define UNUSED(var) do { (void)(var); } while(0)
@@ -128,6 +128,7 @@ typedef atomic_long usbi_atomic_t;
* return_type LIBUSB_CALL function_name(params);
*/
#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY
+#define API_EXPORTEDV LIBUSB_CALLV DEFAULT_VISIBILITY
#ifdef __cplusplus
extern "C" {
@@ -321,10 +322,10 @@ void usbi_log(struct libusb_context *ctx, enum libusb_log_level level,
#else /* ENABLE_LOGGING */
-#define usbi_err(ctx, ...) UNUSED(ctx)
-#define usbi_warn(ctx, ...) UNUSED(ctx)
-#define usbi_info(ctx, ...) UNUSED(ctx)
-#define usbi_dbg(ctx, ...) do {} while (0)
+#define usbi_err(ctx, ...) do { (void)(ctx); } while(0)
+#define usbi_warn(ctx, ...) do { (void)(ctx); } while(0)
+#define usbi_info(ctx, ...) do { (void)(ctx); } while(0)
+#define usbi_dbg(ctx, ...) do { (void)(ctx); } while(0)
#endif /* ENABLE_LOGGING */
@@ -379,7 +380,7 @@ struct libusb_context {
struct list_head flying_transfers;
/* Note paths taking both this and usbi_transfer->lock must always
* take this lock first */
- usbi_mutex_t flying_transfers_lock;
+ usbi_mutex_t flying_transfers_lock; /* for flying_transfers and timeout_flags */
#if !defined(PLATFORM_WINDOWS)
/* user callbacks for pollfd changes */
@@ -533,7 +534,7 @@ static inline void usbi_localize_device_descriptor(struct libusb_device_descript
desc->bcdDevice = libusb_le16_to_cpu(desc->bcdDevice);
}
-#ifdef HAVE_CLOCK_GETTIME
+#if defined(HAVE_CLOCK_GETTIME) && !defined(__APPLE__)
static inline void usbi_get_monotonic_time(struct timespec *tp)
{
ASSERT_EQ(clock_gettime(CLOCK_MONOTONIC, tp), 0);
@@ -562,8 +563,11 @@ void usbi_get_real_time(struct timespec *tp);
* 2. struct usbi_transfer
* 3. struct libusb_transfer (which includes iso packets) [variable size]
*
- * from a libusb_transfer, you can get the usbi_transfer by rewinding the
- * appropriate number of bytes.
+ * You can convert between them with the macros:
+ * TRANSFER_PRIV_TO_USBI_TRANSFER
+ * USBI_TRANSFER_TO_TRANSFER_PRIV
+ * USBI_TRANSFER_TO_LIBUSB_TRANSFER
+ * LIBUSB_TRANSFER_TO_USBI_TRANSFER
*/
struct usbi_transfer {
@@ -574,7 +578,7 @@ struct usbi_transfer {
int transferred;
uint32_t stream_id;
uint32_t state_flags; /* Protected by usbi_transfer->lock */
- uint32_t timeout_flags; /* Protected by the flying_stransfers_lock */
+ uint32_t timeout_flags; /* Protected by the flying_transfers_lock */
/* The device reference is held until destruction for logging
* even after dev_handle is set to NULL. */
@@ -616,10 +620,21 @@ enum usbi_transfer_timeout_flags {
USBI_TRANSFER_TIMED_OUT = 1U << 2,
};
+#define TRANSFER_PRIV_TO_USBI_TRANSFER(transfer_priv) \
+ ((struct usbi_transfer *) \
+ ((unsigned char *)(transfer_priv) \
+ + PTR_ALIGN(sizeof(*transfer_priv))))
+
+#define USBI_TRANSFER_TO_TRANSFER_PRIV(itransfer) \
+ ((unsigned char *) \
+ ((unsigned char *)(itransfer) \
+ - PTR_ALIGN(usbi_backend.transfer_priv_size)))
+
#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer) \
((struct libusb_transfer *) \
((unsigned char *)(itransfer) \
+ PTR_ALIGN(sizeof(struct usbi_transfer))))
+
#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \
((struct usbi_transfer *) \
((unsigned char *)(transfer) \
@@ -678,7 +693,7 @@ struct usbi_interface_descriptor {
struct usbi_string_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
- uint16_t wData[ZERO_SIZED_ARRAY];
+ uint16_t wData[LIBUSB_FLEXIBLE_ARRAY];
} LIBUSB_PACKED;
struct usbi_bos_descriptor {
@@ -813,6 +828,7 @@ struct usbi_option {
int is_set;
union {
int ival;
+ libusb_log_cb log_cbval;
} arg;
};
@@ -891,7 +907,7 @@ static inline void *usbi_get_transfer_priv(struct usbi_transfer *itransfer)
struct discovered_devs {
size_t len;
size_t capacity;
- struct libusb_device *devices[ZERO_SIZED_ARRAY];
+ struct libusb_device *devices[LIBUSB_FLEXIBLE_ARRAY];
};
struct discovered_devs *discovered_devs_append(
@@ -1180,6 +1196,8 @@ struct usbi_os_backend {
* claiming, no other drivers/applications can use the interface because
* we now "own" it.
*
+ * This function gets called with dev_handle->lock locked!
+ *
* Return:
* - 0 on success
* - LIBUSB_ERROR_NOT_FOUND if the interface does not exist
@@ -1199,6 +1217,8 @@ struct usbi_os_backend {
* You will only ever be asked to release an interface which was
* successfully claimed earlier.
*
+ * This function gets called with dev_handle->lock locked!
+ *
* Return:
* - 0 on success
* - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it
@@ -1335,7 +1355,7 @@ struct usbi_os_backend {
*
* This function must not block.
*
- * This function gets called with the flying_transfers_lock locked!
+ * This function gets called with itransfer->lock locked!
*
* Return:
* - 0 on success
@@ -1349,6 +1369,8 @@ struct usbi_os_backend {
* This function must not block. The transfer cancellation must complete
* later, resulting in a call to usbi_handle_transfer_cancellation()
* from the context of handle_events.
+ *
+ * This function gets called with itransfer->lock locked!
*/
int (*cancel_transfer)(struct usbi_transfer *itransfer);