diff options
| author | Felix Geyer <debfx-pkg@fobos.de> | 2009-08-07 22:19:59 +0200 |
|---|---|---|
| committer | Felix Geyer <debfx-pkg@fobos.de> | 2009-08-07 22:19:59 +0200 |
| commit | fd321f7f2afeecd1066ed399b8c33aed3964b228 (patch) | |
| tree | e7ece73572e464e47857a6b4c40b7b6b082c28f0 /src/VBox/HostServices/SharedOpenGL/crserverlib | |
| parent | 29554628c63e586eb33ca746e8bdfadcc285b43d (diff) | |
| download | virtualbox-fd321f7f2afeecd1066ed399b8c33aed3964b228.tar.gz | |
Imported Upstream version 3.0.4-dfsgupstream/3.0.4-dfsg
Diffstat (limited to 'src/VBox/HostServices/SharedOpenGL/crserverlib')
3 files changed, 109 insertions, 8 deletions
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c index a7267323c..aaf1760b2 100644 --- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c +++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c @@ -143,6 +143,36 @@ crServerDispatchDestroyContext( GLint ctx ) cr_server.curClient->contextList[pos] = 0; break; } + + /*Some application call destroy context not in a thread where it was created...have do deal with it.*/ + if (CR_MAX_CONTEXTS==pos) + { + int32_t client; + + for (client=0; client<cr_server.numClients; ++client) + { + if (cr_server.clients[client]==cr_server.curClient) + continue; + + for (pos = 0; pos < CR_MAX_CONTEXTS; ++pos) + if (cr_server.clients[client]->contextList[pos] == ctx) + { + cr_server.clients[client]->contextList[pos] = 0; + break; + } + + if (pos<CR_MAX_CONTEXTS) + { + if (cr_server.clients[client]->currentCtx == crCtx) + { + cr_server.clients[client]->currentContextNumber = -1; + cr_server.clients[client]->currentCtx = cr_server.DummyContext; + } + break; + } + } + } + CRASSERT(pos<CR_MAX_CONTEXTS); } } diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c index d36acb001..f7b6be15a 100644 --- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c +++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c @@ -318,10 +318,16 @@ GLboolean crVBoxServerInit(void) return GL_TRUE; } -void crVBoxServerAddClient(uint32_t u32ClientID) +int32_t crVBoxServerAddClient(uint32_t u32ClientID) { - CRClient *newClient = (CRClient *) crCalloc(sizeof(CRClient)); - + CRClient *newClient; + + if (cr_server.numClients>=CR_MAX_CLIENTS) + { + return VERR_MAX_THRDS_REACHED; + } + + newClient = (CRClient *) crCalloc(sizeof(CRClient)); crDebug("crServer: AddClient u32ClientID=%d", u32ClientID); newClient->spu_id = 0; @@ -335,6 +341,8 @@ void crVBoxServerAddClient(uint32_t u32ClientID) cr_server.clients[cr_server.numClients++] = newClient; crServerAddToRunQueue(newClient); + + return VINF_SUCCESS; } void crVBoxServerRemoveClient(uint32_t u32ClientID) @@ -362,7 +370,7 @@ void crVBoxServerRemoveClient(uint32_t u32ClientID) crServerDeleteClient(pClient); } -void crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer) +int32_t crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cbBuffer) { CRClient *pClient; int32_t i; @@ -380,6 +388,8 @@ void crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cb pClient = cr_server.clients[i]; CRASSERT(pClient); + if (!pClient->conn->vMajor) return VERR_NOT_SUPPORTED; + CRASSERT(pBuffer); /* This should never fire unless we start to multithread */ @@ -435,6 +445,8 @@ void crVBoxServerClientWrite(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t cb crStateResetCurrentPointers(&cr_server.current); CRASSERT(!pClient->conn->allow_redir_ptr || crNetNumMessages(pClient->conn)==0); + + return VINF_SUCCESS; } int32_t crVBoxServerClientRead(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t *pcbBuffer) @@ -455,6 +467,8 @@ int32_t crVBoxServerClientRead(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t pClient = cr_server.clients[i]; CRASSERT(pClient); + if (!pClient->conn->vMajor) return VERR_NOT_SUPPORTED; + if (pClient->conn->cbHostBuffer > *pcbBuffer) { crDebug("crServer: [%lx] ClientRead u32ClientID=%d FAIL, host buffer too small %d of %d", @@ -479,6 +493,33 @@ int32_t crVBoxServerClientRead(uint32_t u32ClientID, uint8_t *pBuffer, uint32_t return VINF_SUCCESS; } +int32_t crVBoxServerClientSetVersion(uint32_t u32ClientID, uint32_t vMajor, uint32_t vMinor) +{ + CRClient *pClient; + int32_t i; + + for (i = 0; i < cr_server.numClients; i++) + { + if (cr_server.clients[i] && cr_server.clients[i]->conn + && cr_server.clients[i]->conn->u32ClientID==u32ClientID) + { + break; + } + } + pClient = cr_server.clients[i]; + CRASSERT(pClient); + + pClient->conn->vMajor = vMajor; + pClient->conn->vMinor = vMinor; + + if (vMajor != CR_PROTOCOL_VERSION_MAJOR + || vMinor != CR_PROTOCOL_VERSION_MINOR) + { + return VERR_NOT_SUPPORTED; + } + else return VINF_SUCCESS; +} + int CRServerMain(int argc, char *argv[]) { diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c index 6e837ab95..277fdc6af 100644 --- a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c +++ b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c @@ -143,19 +143,49 @@ crServerDispatchWindowDestroy( GLint window ) if (cr_server.curClient) { + if (cr_server.curClient->currentMural == mural) + { + cr_server.curClient->currentMural = NULL; + cr_server.curClient->currentWindow = -1; + } + for (pos = 0; pos < CR_MAX_WINDOWS; ++pos) if (cr_server.curClient->windowList[pos] == window) { cr_server.curClient->windowList[pos] = 0; break; } - CRASSERT(pos<CR_MAX_WINDOWS); - if (cr_server.curClient->currentMural == mural) + /*Same as with contexts, some apps destroy it not in a thread where it was created*/ + if (CR_MAX_WINDOWS==pos) { - cr_server.curClient->currentMural = NULL; - cr_server.curClient->currentWindow = -1; + int32_t client; + + for (client=0; client<cr_server.numClients; ++client) + { + if (cr_server.clients[client]==cr_server.curClient) + continue; + + for (pos = 0; pos < CR_MAX_WINDOWS; ++pos) + if (cr_server.clients[client]->windowList[pos] == window) + { + cr_server.clients[client]->windowList[pos] = 0; + break; + } + + if (pos<CR_MAX_WINDOWS) + { + if (cr_server.clients[client]->currentMural == mural) + { + cr_server.clients[client]->currentMural = NULL; + cr_server.clients[client]->currentWindow = -1; + } + break; + } + } } + + CRASSERT(pos<CR_MAX_WINDOWS); } if (cr_server.currentWindow == window) |
