struct AHI_AudioDatabase * LockDatabaseWrite(void) { struct AHI_AudioDatabase *audiodb; Forbid(); audiodb = (struct AHI_AudioDatabase *) FindSemaphore(ADB_NAME); if(audiodb != NULL) { ObtainSemaphore((struct SignalSemaphore *) audiodb); } else { audiodb = (struct AHI_AudioDatabase *) AllocVec(sizeof(struct AHI_AudioDatabase), MEMF_PUBLIC|MEMF_CLEAR); if(audiodb != NULL) { NewList( (struct List *) &audiodb->ahidb_AudioModes); audiodb->ahidb_Semaphore.ss_Link.ln_Name = audiodb->ahidb_Name; audiodb->ahidb_Semaphore.ss_Link.ln_Pri = 20; strcpy(audiodb->ahidb_Semaphore.ss_Link.ln_Name, ADB_NAME); AddSemaphore((struct SignalSemaphore *) audiodb); ObtainSemaphore((struct SignalSemaphore *) audiodb); } } Permit(); return audiodb; }
const Signals::SemaphorePtr Signals::SignalTable::GetSemaphore(const ConnectionId & connection) { { boost::shared_lock<SignalsLock> guard(m_lock); Semaphores::iterator findIt = m_semaphores.find(connection.m_id); if (findIt != m_semaphores.end()) { return findIt->second; } } //Did not find the semaphore, we need to get write access. //first get an upgrade lock, which is only a read lock, but stops new //readers from getting in, so we will never be starved. boost::upgrade_lock<SignalsLock> readGuard(m_lock); //someone else may have gotten in and added the semaphore, so we check. Semaphores::iterator findIt = m_semaphores.find(connection.m_id); if (findIt != m_semaphores.end()) { return findIt->second; } //ok, now we upgrade and add. boost::upgrade_to_unique_lock<SignalsLock> writeGuard(readGuard); return AddSemaphore(connection); }
BOOL DriverInit( struct DriverBase* ahisubbase ) { struct EMU10kxBase* EMU10kxBase = (struct EMU10kxBase*) ahisubbase; struct pci_dev* dev; int card_no; /*** Libraries etc. ********************************************************/ AHIsubBase = ahisubbase; DOSBase = (struct DosLibrary*) OpenLibrary( DOSNAME, 37 ); OpenPciBase = OpenLibrary( "openpci.library", 1 ); if( DOSBase == NULL ) { Req( "Unable to open 'dos.library' version 37.\n" ); return FALSE; } if( OpenPciBase == NULL ) { Req( "Unable to open 'openpci.library' version 1.\n" ); return FALSE; } InitSemaphore( &EMU10kxBase->semaphore ); /*** Count cards ***********************************************************/ EMU10kxBase->cards_found = 0; dev = NULL; while( ( dev = pci_find_device( PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1, dev ) ) != NULL ) { ++EMU10kxBase->cards_found; } // Fail if no hardware (prevents the audio modes form being added to // the database if the driver cannot be used). if( EMU10kxBase->cards_found == 0 ) { Req( "No SoundBlaster Live! card present.\n" ); return FALSE; } /*** CAMD ******************************************************************/ InitSemaphore( &EMU10kxBase->camd.Semaphore ); EMU10kxBase->camd.Semaphore.ss_Link.ln_Pri = 0; EMU10kxBase->camd.Semaphore.ss_Link.ln_Name = EMU10KX_CAMD_SEMAPHORE; AddSemaphore( &EMU10kxBase->camd.Semaphore ); EMU10kxBase->camd.Cards = EMU10kxBase->cards_found; EMU10kxBase->camd.Version = VERSION; EMU10kxBase->camd.Revision = REVISION; EMU10kxBase->camd.OpenPortFunc.h_Entry = HookEntry; EMU10kxBase->camd.OpenPortFunc.h_SubEntry = OpenCAMDPort; EMU10kxBase->camd.OpenPortFunc.h_Data = NULL; EMU10kxBase->camd.ClosePortFunc.h_Entry = HookEntry; EMU10kxBase->camd.ClosePortFunc.h_SubEntry = (HOOKFUNC) CloseCAMDPort; EMU10kxBase->camd.ClosePortFunc.h_Data = NULL; EMU10kxBase->camd.ActivateXmitFunc.h_Entry = HookEntry; EMU10kxBase->camd.ActivateXmitFunc.h_SubEntry = (HOOKFUNC) ActivateCAMDXmit; EMU10kxBase->camd.ActivateXmitFunc.h_Data = NULL; /*** Allocate and init all cards *******************************************/ EMU10kxBase->driverdatas = AllocVec( sizeof( *EMU10kxBase->driverdatas ) * EMU10kxBase->cards_found, MEMF_PUBLIC ); if( EMU10kxBase->driverdatas == NULL ) { Req( "Out of memory." ); return FALSE; } card_no = 0; while( ( dev = pci_find_device( PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1, dev ) ) != NULL ) { EMU10kxBase->driverdatas[ card_no ] = AllocDriverData( dev, AHIsubBase ); ++card_no; } return TRUE; }