Diff for /src/sys/sys/kobj.h between versions 1.6 and 1.7

version 1.6, 2004/04/01 08:41:24 version 1.7, 2004/04/14 18:28:29
Line 56  struct kobj_method { Line 56  struct kobj_method {
         const char      *name;          /* class name */                \          const char      *name;          /* class name */                \
         kobj_method_t   *methods;       /* method table */              \          kobj_method_t   *methods;       /* method table */              \
         size_t          size;           /* object size */               \          size_t          size;           /* object size */               \
           kobj_class_t    *baseclasses;   /* base classes */              \
         u_int           refs;           /* reference count */           \          u_int           refs;           /* reference count */           \
         kobj_ops_t      ops             /* compiled method table */          kobj_ops_t      ops             /* compiled method table */
   
Line 80  struct kobj { Line 81  struct kobj {
 #define KOBJ_CACHE_SIZE 256  #define KOBJ_CACHE_SIZE 256
   
 struct kobj_ops {  struct kobj_ops {
        kobj_method_t   cache[KOBJ_CACHE_SIZE];        kobj_method_t   *cache[KOBJ_CACHE_SIZE];
         kobj_class_t    cls;          kobj_class_t    cls;
 };  };
   
 struct kobjop_desc {  struct kobjop_desc {
         unsigned int    id;     /* unique ID */          unsigned int    id;     /* unique ID */
        kobjop_t        deflt;  /* default implementation */        kobj_method_t       *deflt;  /* default implementation */
 };  };
   
 /*  /*
Line 94  struct kobjop_desc { Line 95  struct kobjop_desc {
  */   */
 #define KOBJMETHOD(NAME, FUNC) { &NAME##_desc, (kobjop_t) FUNC }  #define KOBJMETHOD(NAME, FUNC) { &NAME##_desc, (kobjop_t) FUNC }
   
#define DEFINE_CLASS(name, methods, size)       \/*
                                                \ * Declare a class (which should be defined in another file.
struct kobj_class name ## _class = {            \ */
        #name, methods, size                    \#define DECLARE_CLASS(name) extern struct kobj_class name
 
 /*
  * Define a class with no base classes (api backward-compatible. with
  * FreeBSD-5.1 and earlier).
  */
 #define DEFINE_CLASS(name, methods, size)               \
 DEFINE_CLASS_0(name, name ## _class, methods, size)
 
 /*
  * Define a class with no base classes. Use like this:
  *
  * DEFINE_CLASS_0(foo, foo_class, foo_methods, sizeof(foo_softc));
  */
 #define DEFINE_CLASS_0(name, classvar, methods, size)   \
                                                         \
 struct kobj_class classvar = {                          \
         #name, methods, size, 0                         \
 }
 
 /*
  * Define a class inheriting a single base class. Use like this:
  *
  * DEFINE_CLASS1(foo, foo_class, foo_methods, sizeof(foo_softc),
  *                        bar);
  */
 #define DEFINE_CLASS_1(name, classvar, methods, size,   \
                        base1)                           \
                                                         \
 static kobj_class_t name ## _baseclasses[] = {          \
         &base1, 0                                       \
 };                                                      \
 struct kobj_class classvar = {                          \
         #name, methods, size, name ## _baseclasses      \
 }
 
 /*
  * Define a class inheriting two base classes. Use like this:
  *
  * DEFINE_CLASS2(foo, foo_class, foo_methods, sizeof(foo_softc),
  *                        bar, baz);
  */
 #define DEFINE_CLASS_2(name, methods, size,             \
                        base1, base2)                    \
                                                         \
 static kobj_class_t name ## _baseclasses[] = {          \
         &base1,                                         \
         &base2, 0                                       \
 };                                                        \
 struct kobj_class name ## _class = {                    \
         #name, methods, size, name ## _baseclasses  \
 }
  
 /*
  * Define a class inheriting three base classes. Use like this:
  *
  * DEFINE_CLASS3(foo, foo_class, foo_methods, sizeof(foo_softc),
  *                        bar, baz, foobar);
  */
 #define DEFINE_CLASS_3(name, methods, size,             \
                        base1, base2, base3)             \
                                                         \
 static kobj_class_t name ## _baseclasses[] = {          \
         &base1,                                         \
         &base2,                                         \
         &base3, 0                                       \
 };                                                      \
 struct kobj_class name ## _class = {                    \
         #name, methods, size, name ## _baseclasses      \
 }  }
   
 /*  /*
Line 142  extern u_int kobj_lookup_misses; Line 211  extern u_int kobj_lookup_misses;
 #ifdef KOBJ_STATS  #ifdef KOBJ_STATS
 #define KOBJOPLOOKUP(OPS,OP) do {                                       \  #define KOBJOPLOOKUP(OPS,OP) do {                                       \
         kobjop_desc_t _desc = &OP##_##desc;                             \          kobjop_desc_t _desc = &OP##_##desc;                             \
        kobj_method_t *_ce =                                              \        kobj_method_t **_cep =                                              \
             &OPS->cache[_desc->id & (KOBJ_CACHE_SIZE-1)];               \              &OPS->cache[_desc->id & (KOBJ_CACHE_SIZE-1)];               \
        if (_ce->desc != _desc) {                                        \        kobj_method_t *_ce = *_cep;                                     \
                kobj_lookup_misses++;                                   \        kobj_lookup_hits++; /* assume hit */                            \
                kobj_lookup_method(OPS->cls->methods, _ce, _desc);       \        if (_ce->desc != _desc)                                         \
        } else {                                                        \                _ce = kobj_lookup_method(OPS->cls,                       \
                kobj_lookup_hits++;                                     \                                         _cep, _desc);                       \
        }                                                               \ 
         _m = _ce->func;                                                 \          _m = _ce->func;                                                 \
 } while(0)  } while(0)
 #else  #else
 #define KOBJOPLOOKUP(OPS,OP) do {                                       \  #define KOBJOPLOOKUP(OPS,OP) do {                                       \
         kobjop_desc_t _desc = &OP##_##desc;                             \          kobjop_desc_t _desc = &OP##_##desc;                             \
        kobj_method_t *_ce = &OPS->cache[_desc->id & (KOBJ_CACHE_SIZE-1)]; \        kobj_method_t **_cep =                                         \
             &OPS->cache[_desc->id & (KOBJ_CACHE_SIZE-1)];               \
         kobj_method_t *_ce = *_cep;                                     \
         if (_ce->desc != _desc)                                         \          if (_ce->desc != _desc)                                         \
                kobj_lookup_method(OPS->cls->methods, _ce, _desc);       \                _ce = kobj_lookup_method(OPS->cls,                       \
                _m = _ce->func;                                         \                                         _cep, _desc);                       \
        } while(0)        _m = _ce->func;                                                 \
#endif /* !KOBJ_STATS */} while(0)
#endif
void kobj_lookup_method(kobj_method_t *methods,
                        kobj_method_t *ce,kobj_method_t *kobj_lookup_method(kobj_class_t cls,
                        kobjop_desc_t desc);                                  kobj_method_t **cep,
                                   kobjop_desc_t desc);
 
 /*
  * Default method implementation. Returns ENXIO.
  */
 int kobj_error_method(void);
   
 #endif /* !_SYS_KOBJ_H_ */  #endif /* !_SYS_KOBJ_H_ */

Removed from v.1.6  
changed lines
  Added in v.1.7