(svn r10471) -Codechange: implement driver probing priority so that 'preferred' drivers are loaded first
This commit is contained in:
38
src/driver.h
38
src/driver.h
@@ -16,8 +16,6 @@ int GetDriverParamInt(const char* const* parm, const char* name, int def);
|
||||
|
||||
class Driver {
|
||||
public:
|
||||
virtual bool CanProbe() = 0;
|
||||
|
||||
virtual const char *Start(const char * const *parm) = 0;
|
||||
|
||||
virtual void Stop() = 0;
|
||||
@@ -40,6 +38,7 @@ class DriverFactoryBase {
|
||||
private:
|
||||
Driver::Type type;
|
||||
char *name;
|
||||
int priority;
|
||||
typedef std::map<std::string, DriverFactoryBase *> Drivers;
|
||||
|
||||
static Drivers &GetDrivers()
|
||||
@@ -66,13 +65,14 @@ protected:
|
||||
* @param name the name of the driver.
|
||||
* @note an assert() will be trigger if 2 driver with the same name try to register.
|
||||
*/
|
||||
void RegisterDriver(const char *name, Driver::Type type)
|
||||
void RegisterDriver(const char *name, Driver::Type type, int priority)
|
||||
{
|
||||
/* Don't register nameless Drivers */
|
||||
if (name == NULL) return;
|
||||
|
||||
this->name = strdup(name);
|
||||
this->type = type;
|
||||
this->priority = priority;
|
||||
|
||||
/* Prefix the name with driver type to make it unique */
|
||||
char buf[32];
|
||||
@@ -101,17 +101,16 @@ public:
|
||||
|
||||
if (*name == '\0') {
|
||||
/* Probe for this driver */
|
||||
Drivers::iterator it = GetDrivers().begin();
|
||||
for (; it != GetDrivers().end(); ++it) {
|
||||
DriverFactoryBase *d = (*it).second;
|
||||
for (int priority = 10; priority >= 0; priority--) {
|
||||
Drivers::iterator it = GetDrivers().begin();
|
||||
for (; it != GetDrivers().end(); ++it) {
|
||||
DriverFactoryBase *d = (*it).second;
|
||||
|
||||
/* Check driver type */
|
||||
if (d->type != type) continue;
|
||||
/* Check driver type */
|
||||
if (d->type != type) continue;
|
||||
if (d->priority != priority) continue;
|
||||
|
||||
Driver *newd = d->CreateInstance();
|
||||
if (!newd->CanProbe()) {
|
||||
DEBUG(driver, 1, "Skipping probe of driver '%s'", d->name);
|
||||
} else {
|
||||
Driver *newd = d->CreateInstance();
|
||||
const char *err = newd->Start(NULL);
|
||||
if (err == NULL) {
|
||||
DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name);
|
||||
@@ -121,9 +120,8 @@ public:
|
||||
}
|
||||
|
||||
DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err);
|
||||
delete newd;
|
||||
}
|
||||
|
||||
delete newd;
|
||||
}
|
||||
error("Couldn't find any suitable %s driver", GetDriverTypeName(type));
|
||||
} else {
|
||||
@@ -185,10 +183,14 @@ public:
|
||||
for (Driver::Type type = Driver::DT_BEGIN; type != Driver::DT_END; type++) {
|
||||
p += snprintf(p, last - p, "List of %s drivers:\n", GetDriverTypeName(type));
|
||||
|
||||
Drivers::iterator it = GetDrivers().begin();
|
||||
for (; it != GetDrivers().end(); it++) {
|
||||
DriverFactoryBase *d = (*it).second;
|
||||
if (d->type == type) p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription());
|
||||
for (int priority = 10; priority >= 0; priority--) {
|
||||
Drivers::iterator it = GetDrivers().begin();
|
||||
for (; it != GetDrivers().end(); it++) {
|
||||
DriverFactoryBase *d = (*it).second;
|
||||
if (d->type != type) continue;
|
||||
if (d->priority != priority) continue;
|
||||
p += snprintf(p, last - p, "%18s: %s\n", d->name, d->GetDescription());
|
||||
}
|
||||
}
|
||||
|
||||
p += snprintf(p, last - p, "\n");
|
||||
|
Reference in New Issue
Block a user