e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchBarrierCreateCR( GLuint name, GLuint count )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.BarrierCreateCR( name, count );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync barrier = (CRServerBarrier *) crHashtableSearch( cr_server.barriers, name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sprintf( debug_buf, "BarrierCreateCR( %d, %d )", name, count );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sprintf( debug_buf, "changing count to %d", count );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we use maxBarrierCount in Clear() and SwapBuffers() and also use it
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * in __getNextClient() for deadlock detection. The issue is that all
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * the existing clients may be blocked, but we might soon get another
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * client connection to break the apparent deadlock.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync barrier = (CRServerBarrier *) crAlloc( sizeof(*barrier) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd( cr_server.barriers, name, barrier );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* HACK -- this allows everybody to create a barrier, and all
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync but the first creation are ignored, assuming the count
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sprintf( debug_buf, "I already knew about this barrier." );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sprintf( debug_buf, "And someone messed up the count!." );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "Barrier name=%u created with count=%u, but already "
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "exists with count=%u", name, count, barrier->count );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: BarrierCreate(id=%d, count=%d)", name, barrier->count);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchBarrierDestroyCR( GLuint name )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.BarrierDestroyCR( name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "NO BARRIER DESTROY FOR YOU! (name=%u)", name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchBarrierExecCR( GLuint name )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.BarrierExecCR( name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync barrier = (CRServerBarrier *) crHashtableSearch( cr_server.barriers, name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError( "crServerDispatchBarrierExec: No such barrier: %d", name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sprintf( debug_buf, "num_waiting = %d", barrier->num_waiting );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.ChromiumParametervCR( GL_PRINT_STRING_CR, GL_UNSIGNED_BYTE, sizeof(debug_buf), debug_buf );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync barrier->waiting[barrier->num_waiting++] = cr_server.run_queue;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: BarrierExec(client=%p, id=%d, num_waiting=%d/%d) - release",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: BarrierExec(client=%p, id=%d, num_waiting=%d/%d) - block",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSemaphoreCreateCR( GLuint name, GLuint count )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.SemaphoreCreateCR( name, count );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sema = crHashtableSearch(cr_server.semaphores, name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return; /* already created */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sema = (CRServerSemaphore *) crAlloc( sizeof( *sema ) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd( cr_server.semaphores, name, sema );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: SemaphoreCreate(id=%d, count=%d)", name, count);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSemaphoreDestroyCR( GLuint name )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.SemaphoreDestroyCR( name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Semaphore wait */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSemaphorePCR( GLuint name )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.SemaphorePCR( name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sema = (CRServerSemaphore *) crHashtableSearch( cr_server.semaphores, name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: SemaphoreP(client=%p, id=%d, count=%d) decrement to %d",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.curClient, name, sema->count, sema->count - 1);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* block */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: SemaphoreP(client=%p, id=%d, count=%d) - block.",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Semaphore signal */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchSemaphoreVCR( GLuint name )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_server.head_spu->dispatch_table.SemaphoreVCR( name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync sema = (CRServerSemaphore *) crHashtableSearch( cr_server.semaphores, name );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: SemaphoreV(client=%p, id=%d, count=%d) - unblock.",
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* unblock one waiter */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* nobody's waiting */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("crserver: SemaphoreV(client=%p, id=%d, count=%d) - increment to %d",