[PUSB] Fix static initialization order fiasco
For details see: https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
This commit is contained in:
parent
a185073969
commit
a6c4a6395e
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue