Changeset 1412

Show
Ignore:
Timestamp:
11/02/08 02:35:35 (12 years ago)
Author:
ppalmers
Message:

recover more gracely from errors (instead of abort). not 100% fixed yet.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/libffado-2.0/src/libcontrol/Element.cpp

    r1385 r1412  
    9292} 
    9393 
     94bool 
     95Element::isControlLocked() 
     96{ 
     97    return getLock().isLocked(); 
     98} 
     99 
    94100Util::Mutex& 
    95101Element::getLock() 
  • branches/libffado-2.0/src/libcontrol/Element.h

    r1385 r1412  
    9090    virtual void lockControl(); 
    9191    virtual void unlockControl(); 
     92    virtual bool isControlLocked(); 
    9293 
    9394    /** 
  • branches/libffado-2.0/support/dbus/controlserver.cpp

    r1385 r1412  
    8787    } else { 
    8888        m_UpdateLock->Unlock(); 
     89    } 
     90} 
     91 
     92bool 
     93Element::isLocked() 
     94{ 
     95    if(m_Parent) { 
     96        return m_Parent->isLocked(); 
     97    } else { 
     98        return m_UpdateLock->isLocked(); 
    8999    } 
    90100} 
     
    347357    debugOutput( DEBUG_LEVEL_VERBOSE, "Creating handler for '%s'\n", 
    348358                 e.getName().c_str() ); 
    349                   
    350     if (dynamic_cast<Control::Container *>(&e) != NULL) { 
    351         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Container\n"); 
     359    try { 
     360        if (dynamic_cast<Control::Container *>(&e) != NULL) { 
     361            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Container\n"); 
     362             
     363            return new Container(conn(), std::string(path()+"/"+e.getName()),  
     364                parent, *dynamic_cast<Control::Container *>(&e)); 
     365        } 
    352366         
    353         return new Container(conn(), std::string(path()+"/"+e.getName()),  
    354             parent, *dynamic_cast<Control::Container *>(&e)); 
    355     } 
    356      
    357     if (dynamic_cast<Control::Continuous *>(&e) != NULL) { 
    358         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Continuous\n"); 
     367        if (dynamic_cast<Control::Continuous *>(&e) != NULL) { 
     368            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Continuous\n"); 
     369             
     370            return new Continuous(conn(), std::string(path()+"/"+e.getName()), 
     371                parent, *dynamic_cast<Control::Continuous *>(&e)); 
     372        } 
    359373         
    360         return new Continuous(conn(), std::string(path()+"/"+e.getName()), 
    361             parent, *dynamic_cast<Control::Continuous *>(&e)); 
    362     } 
    363      
    364     if (dynamic_cast<Control::Discrete *>(&e) != NULL) { 
    365         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Discrete\n"); 
     374        if (dynamic_cast<Control::Discrete *>(&e) != NULL) { 
     375            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Discrete\n"); 
     376             
     377            return new Discrete(conn(), std::string(path()+"/"+e.getName()), 
     378                parent, *dynamic_cast<Control::Discrete *>(&e)); 
     379        } 
    366380         
    367         return new Discrete(conn(), std::string(path()+"/"+e.getName()), 
    368             parent, *dynamic_cast<Control::Discrete *>(&e)); 
    369     } 
    370      
    371     if (dynamic_cast<Control::Text *>(&e) != NULL) { 
    372         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Text\n"); 
     381        if (dynamic_cast<Control::Text *>(&e) != NULL) { 
     382            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Text\n"); 
     383             
     384            return new Text(conn(), std::string(path()+"/"+e.getName()), 
     385                parent, *dynamic_cast<Control::Text *>(&e)); 
     386        } 
     387     
     388        if (dynamic_cast<Control::Register *>(&e) != NULL) { 
     389            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Register\n"); 
     390             
     391            return new Register(conn(), std::string(path()+"/"+e.getName()), 
     392                parent, *dynamic_cast<Control::Register *>(&e)); 
     393        } 
     394     
     395        // note that we have to check this before checking the Enum, 
     396        // since Enum is a base class 
     397        if (dynamic_cast<Control::AttributeEnum *>(&e) != NULL) { 
     398            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::AttributeEnum\n"); 
     399             
     400            return new AttributeEnum(conn(), std::string(path()+"/"+e.getName()), 
     401                parent, *dynamic_cast<Control::AttributeEnum *>(&e)); 
     402        } 
    373403         
    374         return new Text(conn(), std::string(path()+"/"+e.getName()), 
    375             parent, *dynamic_cast<Control::Text *>(&e)); 
    376     } 
    377  
    378     if (dynamic_cast<Control::Register *>(&e) != NULL) { 
    379         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Register\n"); 
     404        if (dynamic_cast<Control::Enum *>(&e) != NULL) { 
     405            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Enum\n"); 
     406             
     407            return new Enum(conn(), std::string(path()+"/"+e.getName()), 
     408                parent, *dynamic_cast<Control::Enum *>(&e)); 
     409        } 
    380410         
    381         return new Register(conn(), std::string(path()+"/"+e.getName()), 
    382             parent, *dynamic_cast<Control::Register *>(&e)); 
    383     } 
    384  
    385     // note that we have to check this before checking the Enum, 
    386     // since Enum is a base class 
    387     if (dynamic_cast<Control::AttributeEnum *>(&e) != NULL) { 
    388         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::AttributeEnum\n"); 
     411        if (dynamic_cast<ConfigRom *>(&e) != NULL) { 
     412            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a ConfigRom\n"); 
     413             
     414            return new ConfigRomX(conn(), std::string(path()+"/"+e.getName()), 
     415                parent, *dynamic_cast<ConfigRom *>(&e)); 
     416        } 
    389417         
    390         return new AttributeEnum(conn(), std::string(path()+"/"+e.getName()), 
    391             parent, *dynamic_cast<Control::AttributeEnum *>(&e)); 
    392     } 
    393      
    394     if (dynamic_cast<Control::Enum *>(&e) != NULL) { 
    395         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Enum\n"); 
     418        if (dynamic_cast<Control::MatrixMixer *>(&e) != NULL) { 
     419            debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::MatrixMixer\n"); 
     420             
     421            return new MatrixMixer(conn(), std::string(path()+"/"+e.getName()), 
     422                parent, *dynamic_cast<Control::MatrixMixer *>(&e)); 
     423        } 
    396424         
    397         return new Enum(conn(), std::string(path()+"/"+e.getName()), 
    398             parent, *dynamic_cast<Control::Enum *>(&e)); 
    399     } 
    400      
    401     if (dynamic_cast<ConfigRom *>(&e) != NULL) { 
    402         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a ConfigRom\n"); 
    403          
    404         return new ConfigRomX(conn(), std::string(path()+"/"+e.getName()), 
    405             parent, *dynamic_cast<ConfigRom *>(&e)); 
    406     } 
    407      
    408     if (dynamic_cast<Control::MatrixMixer *>(&e) != NULL) { 
    409         debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::MatrixMixer\n"); 
    410          
    411         return new MatrixMixer(conn(), std::string(path()+"/"+e.getName()), 
    412             parent, *dynamic_cast<Control::MatrixMixer *>(&e)); 
    413     } 
    414      
    415     debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Element\n"); 
    416     return new Element(conn(), std::string(path()+"/"+e.getName()), parent, e); 
     425        debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Element\n"); 
     426        return new Element(conn(), std::string(path()+"/"+e.getName()), parent, e); 
     427    } catch (...) { 
     428        debugWarning("Could not register %s\n", std::string(path()+"/"+e.getName()).c_str()); 
     429        if(e.isControlLocked()) { 
     430            e.unlockControl(); 
     431        } 
     432        if(isLocked()) { 
     433            Unlock(); 
     434        } 
     435        return NULL; 
     436    }; 
    417437} 
    418438 
  • branches/libffado-2.0/support/dbus/controlserver.h

    r1385 r1412  
    102102, public DBus::ObjectAdaptor 
    103103{ 
    104 friend class Container; // This should not be necessary since Container derives from Element 
     104friend class Container; // required to have container access other slave elements 
    105105public: 
    106106 
     
    122122    void Lock(); 
    123123    void Unlock(); 
     124    bool isLocked(); 
    124125    Util::Mutex* getLock(); 
    125126 
     
    137138class Container 
    138139: public org::ffado::Control::Element::Container 
    139 , public Element 
     140, public DBusControl::Element 
    140141{ 
    141142public: