aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cores/arduino/PluggableUSB.cpp8
-rw-r--r--cores/arduino/PluggableUSB.h5
-rw-r--r--cores/arduino/USBCore.cpp6
-rw-r--r--libraries/HID/HID.cpp8
-rw-r--r--libraries/HID/HID.h5
5 files changed, 24 insertions, 8 deletions
diff --git a/cores/arduino/PluggableUSB.cpp b/cores/arduino/PluggableUSB.cpp
index acc6276..582379a 100644
--- a/cores/arduino/PluggableUSB.cpp
+++ b/cores/arduino/PluggableUSB.cpp
@@ -25,8 +25,6 @@
extern uint8_t _initEndpoints[];
-PluggableUSB_ PluggableUSB;
-
int PluggableUSB_::getInterface(uint8_t* interfaceNum)
{
int sent = 0;
@@ -90,6 +88,12 @@ bool PluggableUSB_::plug(PUSBListNode *node)
// restart USB layer???
}
+PluggableUSB_& PluggableUSB()
+{
+ static PluggableUSB_ obj;
+ return obj;
+}
+
PluggableUSB_::PluggableUSB_() : lastIf(CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT),
lastEp(CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT),
rootNode(NULL)
diff --git a/cores/arduino/PluggableUSB.h b/cores/arduino/PluggableUSB.h
index 824440a..b0668f4 100644
--- a/cores/arduino/PluggableUSB.h
+++ b/cores/arduino/PluggableUSB.h
@@ -66,7 +66,10 @@ private:
PUSBListNode* rootNode;
};
-extern PluggableUSB_ PluggableUSB;
+// Replacement for global singleton.
+// This function prevents static-initialization-order-fiasco
+// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
+PluggableUSB_& PluggableUSB();
#endif
diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp
index ebdce36..5db9f52 100644
--- a/cores/arduino/USBCore.cpp
+++ b/cores/arduino/USBCore.cpp
@@ -362,7 +362,7 @@ bool ClassInterfaceRequest(USBSetup& setup)
return CDC_Setup(setup);
#ifdef PLUGGABLE_USB_ENABLED
- return PluggableUSB.setup(setup, i);
+ return PluggableUSB().setup(setup, i);
#endif
return false;
}
@@ -440,7 +440,7 @@ static u8 SendInterfaces()
CDC_GetInterface(&interfaces);
#ifdef PLUGGABLE_USB_ENABLED
- PluggableUSB.getInterface(&interfaces);
+ PluggableUSB().getInterface(&interfaces);
#endif
return interfaces;
@@ -476,7 +476,7 @@ bool SendDescriptor(USBSetup& setup)
InitControl(setup.wLength);
#ifdef PLUGGABLE_USB_ENABLED
- ret = PluggableUSB.getDescriptor(t);
+ ret = PluggableUSB().getDescriptor(t);
if (ret != 0) {
return (ret > 0 ? true : false);
}
diff --git a/libraries/HID/HID.cpp b/libraries/HID/HID.cpp
index b7aab6c..ff8e67b 100644
--- a/libraries/HID/HID.cpp
+++ b/libraries/HID/HID.cpp
@@ -21,7 +21,11 @@
#if defined(USBCON)
-HID_ HID;
+HID_& HID()
+{
+ static HID_ obj;
+ return obj;
+}
int HID_::getInterface(uint8_t* interfaceNum)
{
@@ -113,7 +117,7 @@ HID_::HID_(void) : PUSBListNode(1, 1, epType),
protocol(1), idle(1)
{
epType[0] = EP_TYPE_INTERRUPT_IN;
- PluggableUSB.plug(this);
+ PluggableUSB().plug(this);
}
int HID_::begin(void)
diff --git a/libraries/HID/HID.h b/libraries/HID/HID.h
index 2cd0f4a..a7f5c68 100644
--- a/libraries/HID/HID.h
+++ b/libraries/HID/HID.h
@@ -93,6 +93,11 @@ private:
uint8_t idle;
};
+// Replacement for global singleton.
+// This function prevents static-initialization-order-fiasco
+// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
+HID_& HID();
+
#define D_HIDREPORT(length) { 9, 0x21, 0x01, 0x01, 0, 1, 0x22, lowByte(length), highByte(length) }
#endif // USBCON