summaryrefslogtreecommitdiff
path: root/src/VBox/HostServices/SharedOpenGL/crserverlib
diff options
context:
space:
mode:
authorFelix Geyer <debfx-pkg@fobos.de>2009-08-07 22:19:59 +0200
committerFelix Geyer <debfx-pkg@fobos.de>2009-08-07 22:19:59 +0200
commitfd321f7f2afeecd1066ed399b8c33aed3964b228 (patch)
treee7ece73572e464e47857a6b4c40b7b6b082c28f0 /src/VBox/HostServices/SharedOpenGL/crserverlib
parent29554628c63e586eb33ca746e8bdfadcc285b43d (diff)
downloadvirtualbox-fd321f7f2afeecd1066ed399b8c33aed3964b228.tar.gz
Imported Upstream version 3.0.4-dfsgupstream/3.0.4-dfsg
Diffstat (limited to 'src/VBox/HostServices/SharedOpenGL/crserverlib')
-rw-r--r--src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c30
-rw-r--r--src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c49
-rw-r--r--src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c38
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)