forked from PAWPAW-Mirror/lib_xua
Add locks around references to included static variables.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user