Adjust method dispatch to ensure that default methods are called properly.

This commit is contained in:
Doug Rabson 1999-05-14 09:13:43 +00:00
parent 992109823e
commit 454a0546ba
2 changed files with 18 additions and 9 deletions

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: subr_bus.c,v 1.20 1999/05/08 21:59:35 dfr Exp $
* $Id: subr_bus.c,v 1.21 1999/05/10 17:06:14 dfr Exp $
*/
#include <sys/param.h>
@ -93,6 +93,7 @@ static void device_unregister_oids(device_t dev);
/*
* Method table handling
*/
static int error_method(void);
static int next_method_offset = 1;
LIST_HEAD(methodlist, method) methods;
@ -114,6 +115,12 @@ register_method(struct device_op_desc *desc)
return;
}
/*
* Make sure that desc->deflt is always valid to simplify dispatch.
*/
if (!desc->deflt)
desc->deflt = error_method;
for (m = LIST_FIRST(&methods); m; m = LIST_NEXT(m, link)) {
if (!strcmp(m->name, desc->name)) {
desc->offset = m->offset;

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: bus_private.h,v 1.6 1999/04/16 21:22:54 peter Exp $
* $Id: bus_private.h,v 1.7 1999/05/10 17:06:11 dfr Exp $
*/
#ifndef _SYS_BUS_PRIVATE_H_
@ -93,15 +93,17 @@ struct device_ops {
*/
#define DEVOPDESC(OP) (&OP##_##desc)
#define DEVOPOFF(OPS, OP) \
((DEVOPDESC(OP)->offset >= OPS->maxoffset \
|| !OPS->methods[DEVOPDESC(OP)->offset]) \
? 0 : DEVOPDESC(OP)->offset)
#define DEVOPS(DEV) (DEV->ops)
#define DEVOPMETH(DEV, OP) (DEVOPS(DEV)->methods[DEVOPOFF(DEVOPS(DEV), OP)])
#define DEVOPMETH(DEV, OP) \
((DEVOPDESC(OP)->offset >= DEVOPS(DEV)->maxoffset) \
? DEVOPDESC(OP)->deflt \
: DEVOPS(DEV)->methods[DEVOPDESC(OP)->offset])
#define DRVOPS(DRV) ((struct device_ops *)DRV->ops)
#define DRVOPMETH(DRV, OP) (DRVOPS(DRV)->methods[DEVOPOFF(DRVOPS(DRV), OP)])
#define DRVOPMETH(DRV, OP) \
((DEVOPDESC(OP)->offset >= DRVOPS(DRV)->maxoffset) \
? DEVOPDESC(OP)->deflt \
: DRVOPS(DRV)->methods[DEVOPDESC(OP)->offset])
/*
* Implementation of device.