diff options
author | dfr <dfr@FreeBSD.org> | 2000-05-01 10:45:15 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2000-05-01 10:45:15 +0000 |
commit | 14185daa26ace1f11639608f6b655cf2c7cc4e27 (patch) | |
tree | a07a912eede7bd97ce3020b8d02e94959f5760fb /sys/kern/subr_bus.c | |
parent | 4c69e0f4d7e4fad2294ba277c71c27ae4fb5534a (diff) | |
download | FreeBSD-src-14185daa26ace1f11639608f6b655cf2c7cc4e27.zip FreeBSD-src-14185daa26ace1f11639608f6b655cf2c7cc4e27.tar.gz |
* Move the driver_t::refs field to kobj_t to replace kobj_t::instances.
* Back out a couple of workarounds for the confusion between
kobj_t::instances and driver_t::refs.
Diffstat (limited to 'sys/kern/subr_bus.c')
-rw-r--r-- | sys/kern/subr_bus.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 22ad812..de36141 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -162,7 +162,10 @@ devclass_add_driver(devclass_t dc, driver_t *driver) bzero(dl, sizeof *dl); /* - * Compile the driver's methods. + * Compile the driver's methods. Also increase the reference count + * so that the class doesn't get freed when the last instance + * goes. This means we can safely use static methods and avoids a + * double-free in devclass_delete_driver. */ kobj_class_compile((kobj_class_t) driver); @@ -986,7 +989,6 @@ device_set_driver(device_t dev, driver_t *driver) return ENOMEM; } bzero(dev->softc, driver->size); - driver->refs++; } else kobj_init((kobj_t) dev, &null_class); return 0; @@ -1843,11 +1845,6 @@ bus_generic_driver_added(device_t dev, driver_t *driver) { device_t child; - /* - * Make sure the class has a valid ops table. - */ - kobj_class_compile((kobj_class_t) driver); - DEVICE_IDENTIFY(driver, dev); for (child = TAILQ_FIRST(&dev->children); child; child = TAILQ_NEXT(child, link)) |