VirtualBox

Ignore:
Timestamp:
Jul 14, 2009 12:29:26 PM (15 years ago)
Author:
vboxsync
Message:

crOpenGL: fix deadlocks and context/window tracking for multithreaded apps(public #3922)

Location:
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c

    r21127 r21576  
    144144                break;
    145145            }
     146
     147        /*Some application call destroy context not in a thread where it was created...have do deal with it.*/
     148        if (CR_MAX_CONTEXTS==pos)
     149        {
     150            int32_t client;
     151
     152            for (client=0; client<cr_server.numClients; ++client)
     153            {
     154                if (cr_server.clients[client]==cr_server.curClient)
     155                    continue;
     156
     157                for (pos = 0; pos < CR_MAX_CONTEXTS; ++pos)
     158                    if (cr_server.clients[client]->contextList[pos] == ctx)
     159                    {
     160                        cr_server.clients[client]->contextList[pos] = 0;
     161                        break;
     162                    }
     163
     164                if (pos<CR_MAX_CONTEXTS)
     165                {
     166                    if (cr_server.clients[client]->currentCtx == crCtx)
     167                    {
     168                        cr_server.clients[client]->currentContextNumber = -1;
     169                        cr_server.clients[client]->currentCtx = cr_server.DummyContext;
     170                    }
     171                    break;
     172                }
     173            }
     174        }
     175
    146176        CRASSERT(pos<CR_MAX_CONTEXTS);
    147177    }
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c

    r21380 r21576  
    144144    if (cr_server.curClient)
    145145    {
     146        if (cr_server.curClient->currentMural == mural)
     147        {
     148            cr_server.curClient->currentMural = NULL;
     149            cr_server.curClient->currentWindow = -1;
     150        }
     151
    146152        for (pos = 0; pos < CR_MAX_WINDOWS; ++pos)
    147153            if (cr_server.curClient->windowList[pos] == window)
     
    150156                break;
    151157            }
     158
     159        /*Same as with contexts, some apps destroy it not in a thread where it was created*/
     160        if (CR_MAX_WINDOWS==pos)
     161        {
     162            int32_t client;
     163
     164            for (client=0; client<cr_server.numClients; ++client)
     165            {
     166                if (cr_server.clients[client]==cr_server.curClient)
     167                    continue;
     168
     169                for (pos = 0; pos < CR_MAX_WINDOWS; ++pos)
     170                    if (cr_server.clients[client]->windowList[pos] == window)
     171                    {
     172                        cr_server.clients[client]->windowList[pos] = 0;
     173                        break;
     174                    }
     175
     176                if (pos<CR_MAX_WINDOWS)
     177                {
     178                    if (cr_server.clients[client]->currentMural == mural)
     179                    {
     180                        cr_server.clients[client]->currentMural = NULL;
     181                        cr_server.clients[client]->currentWindow = -1;
     182                    }
     183                    break;
     184                }
     185            }
     186        }
     187
    152188        CRASSERT(pos<CR_MAX_WINDOWS);
    153 
    154         if (cr_server.curClient->currentMural == mural)
    155         {
    156             cr_server.curClient->currentMural = NULL;
    157             cr_server.curClient->currentWindow = -1;
    158         }
    159189    }
    160190
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette