Пример #1
0
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;
}
Пример #2
0
    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);
    }
Пример #3
0
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;
}