Add locks around references to included static variables.

This commit is contained in:
mbanth
2022-01-05 14:58:04 +00:00
parent cd0248c162
commit 3988906e39

View File

@@ -228,7 +228,10 @@ unsigned hidGetNextReportTime( const unsigned id )
unsigned hidIsReportDescriptorPrepared( void ) unsigned hidIsReportDescriptorPrepared( void )
{ {
return s_hidReportDescriptorPrepared; hwlock_acquire(hidStaticVarLock);
unsigned retVal = s_hidReportDescriptorPrepared;
hwlock_release(hidStaticVarLock);
return retVal;
} }
unsigned char* hidGetReportDescriptor( void ) unsigned char* hidGetReportDescriptor( void )
@@ -255,25 +258,31 @@ size_t hidGetReportDescriptorLength( void )
unsigned hidGetReportIdLimit ( void ) { unsigned hidGetReportIdLimit ( void ) {
unsigned retVal = 0U; unsigned retVal = 0U;
hwlock_acquire(hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) { for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location ); unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
if( reportId >= retVal ) { if( reportId >= retVal ) {
retVal = reportId + 1; retVal = reportId + 1;
} }
} }
hwlock_release(hidStaticVarLock);
return retVal; return retVal;
} }
unsigned hidIsReportIdInUse ( void ) { unsigned hidIsReportIdInUse ( void ) {
hwlock_acquire(hidStaticVarLock);
if ( hidGetElementReportId( hidReports[ 0 ]->location ) ) { if ( hidGetElementReportId( hidReports[ 0 ]->location ) ) {
hwlock_release(hidStaticVarLock);
return 1; return 1;
} }
hwlock_release(hidStaticVarLock);
return 0; return 0;
} }
unsigned hidIsReportIdValid ( unsigned id ) { unsigned hidIsReportIdValid ( unsigned id ) {
size_t retVal = 0; size_t retVal = 0;
hwlock_acquire(hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) { for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location ); unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
if( reportId == id ) { if( reportId == id ) {
@@ -282,12 +291,14 @@ unsigned hidIsReportIdValid ( unsigned id ) {
} }
} }
hwlock_release(hidStaticVarLock);
return retVal; return retVal;
} }
unsigned hidGetNextValidReportId ( unsigned idPrev ) { unsigned hidGetNextValidReportId ( unsigned idPrev ) {
size_t retIndex = 0; size_t retIndex = 0;
hwlock_acquire(hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) { for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx ) {
unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location ); unsigned reportId = hidGetElementReportId( hidReports[ idx ]->location );
if( reportId == idPrev ) { if( reportId == idPrev ) {
@@ -296,7 +307,9 @@ unsigned hidGetNextValidReportId ( unsigned idPrev ) {
} }
} }
return hidGetElementReportId( hidReports[ retIndex ]->location ); unsigned retVal = hidGetElementReportId( hidReports[ retIndex ]->location );
hwlock_release(hidStaticVarLock);
return retVal;
} }
#define HID_CONFIGURABLE_ELEMENT_COUNT ( sizeof hidConfigurableElements / sizeof ( USB_HID_Report_Element_t* )) #define HID_CONFIGURABLE_ELEMENT_COUNT ( sizeof hidConfigurableElements / sizeof ( USB_HID_Report_Element_t* ))
@@ -311,7 +324,10 @@ unsigned hidGetReportItem(
{ {
unsigned retVal = HID_STATUS_BAD_ID; unsigned retVal = HID_STATUS_BAD_ID;
for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) { for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
hwlock_acquire(hidStaticVarLock);
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ]; USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
hwlock_release(hidStaticVarLock);
unsigned bBit = hidGetElementBitLocation( element.location ); unsigned bBit = hidGetElementBitLocation( element.location );
unsigned bByte = hidGetElementByteLocation( element.location ); unsigned bByte = hidGetElementByteLocation( element.location );
unsigned bId = hidGetElementReportId( element.location ); unsigned bId = hidGetElementReportId( element.location );
@@ -374,6 +390,7 @@ unsigned hidGetReportTime( const unsigned id )
retVal = s_hidReportTime[ idx ]; retVal = s_hidReportTime[ idx ];
} }
} }
hwlock_release(hidStaticVarLock); hwlock_release(hidStaticVarLock);
return retVal; return retVal;
} }
@@ -381,19 +398,24 @@ unsigned hidGetReportTime( const unsigned id )
static unsigned hidGetUsagePage( const unsigned id ) static unsigned hidGetUsagePage( const unsigned id )
{ {
unsigned retVal = 0U; unsigned retVal = 0U;
hwlock_acquire(hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) { for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == hidGetElementReportId( hidReports[ idx ]->location )) { if( id == hidGetElementReportId( hidReports[ idx ]->location )) {
retVal = hidReports[ idx ]->item.data[ 0 ]; retVal = hidReports[ idx ]->item.data[ 0 ];
break; break;
} }
} }
hwlock_release(hidStaticVarLock);
return retVal; return retVal;
} }
unsigned hidIsChangePending( const unsigned id ) unsigned hidIsChangePending( const unsigned id )
{ {
hwlock_acquire(hidStaticVarLock);
unsigned retVal = 0U; unsigned retVal = 0U;
hwlock_acquire(hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) { for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == 0U && s_hidChangePending[ idx ] != 0U ) { if( id == 0U && s_hidChangePending[ idx ] != 0U ) {
retVal = 1; retVal = 1;
@@ -402,18 +424,19 @@ unsigned hidIsChangePending( const unsigned id )
break; break;
} }
} }
hwlock_release(hidStaticVarLock); hwlock_release(hidStaticVarLock);
return retVal; return retVal;
} }
unsigned hidIsIdleActive( const unsigned id ) unsigned hidIsIdleActive( const unsigned id )
{ {
hwlock_acquire(hidStaticVarLock);
unsigned retVal = 0U; unsigned retVal = 0U;
if( 0U == id ) { if( 0U == id ) {
retVal = 1U; retVal = 1U;
} }
hwlock_acquire(hidStaticVarLock);
for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) { for( size_t idx = 0U; idx < HID_REPORT_COUNT; ++idx) {
if( id == 0U ) { if( id == 0U ) {
retVal &= ( s_hidIdleActive[ idx ] != 0U ); retVal &= ( s_hidIdleActive[ idx ] != 0U );
@@ -520,7 +543,10 @@ unsigned hidSetReportItem(
retVal = HID_STATUS_BAD_HEADER; retVal = HID_STATUS_BAD_HEADER;
} else { } else {
for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) { for( size_t elementIdx = 0U; elementIdx < HID_CONFIGURABLE_ELEMENT_COUNT; ++elementIdx ) {
hwlock_acquire(hidStaticVarLock);
USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ]; USB_HID_Report_Element_t element = *hidConfigurableElements[ elementIdx ];
hwlock_release(hidStaticVarLock);
unsigned bBit = hidGetElementBitLocation( element.location ); unsigned bBit = hidGetElementBitLocation( element.location );
unsigned bByte = hidGetElementByteLocation( element.location ); unsigned bByte = hidGetElementByteLocation( element.location );
unsigned bId = hidGetElementReportId( element.location ); unsigned bId = hidGetElementReportId( element.location );
@@ -543,7 +569,9 @@ unsigned hidSetReportItem(
element.item.data[ dataIdx ] = 0U; element.item.data[ dataIdx ] = 0U;
} }
hwlock_acquire(hidStaticVarLock);
*hidConfigurableElements[ elementIdx ] = element; *hidConfigurableElements[ elementIdx ] = element;
hwlock_release(hidStaticVarLock);
retVal = HID_STATUS_GOOD; retVal = HID_STATUS_GOOD;
break; break;
} }