Hi friends,
    I find my vbox will hanging after a short while playing Android
    games. Then I use debugger and figure out linux kernel driver of
    intel ac97 is dead looping. And this is result from the
    multithreading data inconsistency.
    So I use my patch:
diff --git a/include/iprt/AutoLock.h b/include/iprt/AutoLock.h
new file mode 100644
index 0000000..c15a19b
--- /dev/null
+++ b/include/iprt/AutoLock.h
@@ -0,0 +1,48 @@
+#ifndef __XX_AUTOLOCK__
+#define __XX_AUTOLOCK__
+#include <iprt/critsect.h>
+
+class CLock
+{
+public:
+       CLock(void){
+               Init();
+       }
+       ~CLock(){
+               Close();
+       }
+       void Lock(){
+               RTCritSectEnter(&m_lock);
+       }
+       void UnLock(){
+               RTCritSectLeave(&m_lock);
+       }
+private:
+       RTCRITSECT m_lock;
+       void Init(){
+               RTCritSectInit(&m_lock);
+       }
+       void Close(){
+               RTCritSectDelete(&m_lock);
+       }
+};
+
+class CAutoLock{
+public:
+       CAutoLock(CLock *pLock){
+               m_pLock=pLock;
+               if (NULL!=m_pLock)
+               {
+                       m_pLock->Lock();
+               }
+       }
+       ~CAutoLock(){
+               if (NULL!=m_pLock)
+               {
+                       m_pLock->UnLock();
+               }
+       }
+private:
+       CLock * m_pLock;
+};
+#endif
\ No newline at end of file
diff --git a/src/VBox/Devices/Audio/DevIchAc97.cpp 
b/src/VBox/Devices/Audio/DevIchAc97.cpp
index 84ac678..ddc199b 100644
--- a/src/VBox/Devices/Audio/DevIchAc97.cpp
+++ b/src/VBox/Devices/Audio/DevIchAc97.cpp
@@ -24,6 +24,8 @@
 #include <iprt/uuid.h>
 #include <iprt/string.h>
 
+#include <iprt/AutoLock.h>
+
 #include "VBoxDD.h"
 
 extern "C" {
@@ -186,7 +188,7 @@ typedef struct AC97BusMasterRegs
 } AC97BusMasterRegs;
 /** Pointer to a AC97 bus master register. */
 typedef AC97BusMasterRegs *PAC97BMREG;
-
+static CLock g_alock;
 typedef struct AC97STATE
 {
     /** The PCI device state. */
@@ -743,6 +745,7 @@ static int read_audio(PAC97STATE pThis, PAC97BMREG pReg, 
int max, int *stop)
 
 static void transfer_audio(PAC97STATE pThis, int index, int elapsed)
 {
+       CAutoLock alock(&g_alock);
     PAC97BMREG pReg = &pThis->bm_regs[index];
     int written = 0;
     int stop = 0;
@@ -853,6 +856,7 @@ static void po_callback(void *opaque, int free)
  */
 static DECLCALLBACK(int) ichac97IOPortNABMRead(PPDMDEVINS pDevIns, void 
*pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
 {
+       CAutoLock alock(&g_alock);
     PAC97STATE pThis = (PAC97STATE)pvUser;
 
     switch (cb)
@@ -1013,6 +1017,7 @@ static DECLCALLBACK(int) ichac97IOPortNABMRead(PPDMDEVINS 
pDevIns, void *pvUser,
  */
 static DECLCALLBACK(int) ichac97IOPortNABMWrite(PPDMDEVINS pDevIns, void 
*pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
 {
+       CAutoLock alock(&g_alock);
     PAC97STATE pThis = (PAC97STATE)pvUser;
 
     switch (cb)
@@ -1151,6 +1156,7 @@ static DECLCALLBACK(int) 
ichac97IOPortNABMWrite(PPDMDEVINS pDevIns, void *pvUser
  */
 static DECLCALLBACK(int) ichac97IOPortNAMRead(PPDMDEVINS pDevIns, void 
*pvUser, RTIOPORT Port, uint32_t *pu32, unsigned cb)
 {
+       CAutoLock alock(&g_alock);
     PAC97STATE pThis = (PAC97STATE)pvUser;
 
     switch (cb)
@@ -1197,6 +1203,7 @@ static DECLCALLBACK(int) ichac97IOPortNAMRead(PPDMDEVINS 
pDevIns, void *pvUser,
  */
 static DECLCALLBACK(int) ichac97IOPortNAMWrite(PPDMDEVINS pDevIns, void 
*pvUser, RTIOPORT Port, uint32_t u32, unsigned cb)
 {
+       CAutoLock alock(&g_alock);
     PAC97STATE pThis = (PAC97STATE)pvUser;
 
     switch (cb)
@@ -1457,6 +1464,7 @@ static DECLCALLBACK(void *) ichac97QueryInterface(struct 
PDMIBASE *pInterface, c
  */
 static DECLCALLBACK(void)  ac97Reset(PPDMDEVINS pDevIns)
 {
+       CAutoLock alock(&g_alock);
     PAC97STATE pThis = PDMINS_2_DATA(pDevIns, AC97STATE *);
 
     /*

     The patch is mean to protect the data accessing from different
     thread between CPU thread which is invoking timer and
     the CPU thread which is runing Linux intel ac97 drivers.
--
Lin Zuojian

_______________________________________________
vbox-dev mailing list
[email protected]
https://www.virtualbox.org/mailman/listinfo/vbox-dev

Reply via email to