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