The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/kobj.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2000 Doug Rabson
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  *
   26  * $FreeBSD: src/sys/sys/kobj.h,v 1.8 2003/09/22 21:32:49 peter Exp $
   27  */
   28 
   29 #ifndef _SYS_KOBJ_H_
   30 #define _SYS_KOBJ_H_
   31 
   32 #ifndef _SYS_TYPES_H_
   33 #include <sys/types.h>
   34 #endif
   35 
   36 #if !defined(_KERNEL) && !defined(_KERNEL_STRUCTURES)
   37 #error "This file should not be included by userland programs."
   38 #endif
   39 
   40 /*
   41  * Forward declarations
   42  */
   43 typedef struct kobj             *kobj_t;
   44 typedef struct kobj_class       *kobj_class_t;
   45 typedef const struct kobj_method kobj_method_t;
   46 typedef int                     (*kobjop_t)(void);
   47 typedef struct kobj_ops         *kobj_ops_t;
   48 typedef struct kobjop_desc      *kobjop_desc_t;
   49 struct malloc_type;
   50 
   51 struct kobj_method {
   52         kobjop_desc_t   desc;
   53         kobjop_t        func;
   54 };
   55 
   56 /*
   57  * A class is simply a method table and a sizeof value. When the first
   58  * instance of the class is created, the method table will be compiled
   59  * into a form more suited to efficient method dispatch. This compiled
   60  * method table is always the first field of the object.
   61  */
   62 #define KOBJ_CLASS_FIELDS                                               \
   63         const char      *name;          /* class name */                \
   64         kobj_method_t   *methods;       /* method table */              \
   65         size_t          size;           /* object size */               \
   66         kobj_class_t    *baseclasses;   /* base classes */              \
   67         u_int           refs;           /* reference count */           \
   68         kobj_ops_t      ops             /* compiled method table */
   69 
   70 struct kobj_class {
   71         KOBJ_CLASS_FIELDS;
   72 };
   73 
   74 /*
   75  * Implementation of kobj.
   76  */
   77 #define KOBJ_FIELDS                             \
   78         kobj_ops_t      ops
   79 
   80 struct kobj {
   81         KOBJ_FIELDS;
   82 };
   83 
   84 /*
   85  * The ops table is used as a cache of results from kobj_lookup_method().
   86  */
   87 
   88 #define KOBJ_CACHE_SIZE 256
   89 
   90 struct kobj_ops {
   91         kobj_method_t   *cache[KOBJ_CACHE_SIZE];
   92         kobj_class_t    cls;
   93 };
   94 
   95 struct kobjop_desc {
   96         unsigned int    id;     /* unique ID */
   97         kobj_method_t   deflt;  /* default implementation */
   98 };
   99 
  100 /*
  101  * Shorthand for constructing method tables.
  102  */
  103 #define KOBJMETHOD(NAME, FUNC) { &NAME##_desc, (kobjop_t) FUNC }
  104 #define KOBJMETHOD_END  { NULL, NULL }
  105 
  106 /*
  107  * Declare a class (which should be defined in another file.
  108  */
  109 #define DECLARE_CLASS(name) extern struct kobj_class name
  110 
  111 /*
  112  * Define a class with no base classes (api backward-compatible. with
  113  * FreeBSD-5.1 and earlier).
  114  */
  115 #define DEFINE_CLASS(name, methods, size)               \
  116 DEFINE_CLASS_0(name, name ## _class, methods, size)
  117 
  118 /*
  119  * Define a class with no base classes. Use like this:
  120  *
  121  * DEFINE_CLASS_0(foo, foo_class, foo_methods, sizeof(foo_softc));
  122  */
  123 #define DEFINE_CLASS_0(name, classvar, methods, size)   \
  124                                                         \
  125 struct kobj_class classvar = {                          \
  126         #name, methods, size, NULL, 0, NULL             \
  127 }
  128 
  129 /*
  130  * Define a class with no base classes using the named structure
  131  * as an extension of the kobj_class structure.
  132  */
  133 #define DEFINE_CLASS_EXT(name, classvar, methods, size, extname)        \
  134                                                         \
  135 struct extname classvar = {                             \
  136         #name, methods, size, NULL, 0, NULL             \
  137 }
  138 
  139 /*
  140  * Define a class inheriting a single base class. Use like this:
  141  *
  142  * DEFINE_CLASS1(foo, foo_class, foo_methods, sizeof(foo_softc),
  143  *                        bar);
  144  */
  145 #define DEFINE_CLASS_1(name, classvar, methods, size,   \
  146                        base1)                           \
  147                                                         \
  148 static kobj_class_t name ## _baseclasses[] = {          \
  149         &base1, 0                                       \
  150 };                                                      \
  151 struct kobj_class classvar = {                          \
  152         #name, methods, size, name ## _baseclasses      \
  153 }
  154 
  155 /*
  156  * Define a class inheriting two base classes. Use like this:
  157  *
  158  * DEFINE_CLASS2(foo, foo_class, foo_methods, sizeof(foo_softc),
  159  *                        bar, baz);
  160  */
  161 #define DEFINE_CLASS_2(name, methods, size,             \
  162                        base1, base2)                    \
  163                                                         \
  164 static kobj_class_t name ## _baseclasses[] = {          \
  165         &base1,                                         \
  166         &base2, 0                                       \
  167 };                                                      \
  168 struct kobj_class name ## _class = {                    \
  169         #name, methods, size, name ## _baseclasses      \
  170 }
  171  
  172 /*
  173  * Define a class inheriting three base classes. Use like this:
  174  *
  175  * DEFINE_CLASS3(foo, foo_class, foo_methods, sizeof(foo_softc),
  176  *                        bar, baz, foobar);
  177  */
  178 #define DEFINE_CLASS_3(name, methods, size,             \
  179                        base1, base2, base3)             \
  180                                                         \
  181 static kobj_class_t name ## _baseclasses[] = {          \
  182         &base1,                                         \
  183         &base2,                                         \
  184         &base3, 0                                       \
  185 };                                                      \
  186 struct kobj_class name ## _class = {                    \
  187         #name, methods, size, name ## _baseclasses      \
  188 }
  189 
  190 #ifdef _KERNEL
  191 
  192 /*
  193  * Compile class for the first instance and add a reference.
  194  */
  195 void            kobj_class_instantiate(kobj_class_t cls);
  196 
  197 /*
  198  * Remove a reference and free method table with the last instance.
  199  */
  200 void            kobj_class_uninstantiate(kobj_class_t cls);
  201 
  202 /*
  203  * Allocate memory for and initialise a new object.
  204  */
  205 kobj_t          kobj_create(kobj_class_t cls,
  206                             struct malloc_type *mtype,
  207                             int mflags);
  208 
  209 /*
  210  * Initialise a pre-allocated object.
  211  */
  212 void            kobj_init(kobj_t obj, kobj_class_t cls);
  213 
  214 /*
  215  * Delete an object. If mtype is non-zero, free the memory.
  216  */
  217 void            kobj_delete(kobj_t obj, struct malloc_type *mtype);
  218 
  219 /*
  220  * Lookup the method in the cache and if it isn't there look it up the
  221  * slow way.
  222  *
  223  * We do the cache inside kobj_lookup_method() now, we don't try to
  224  * expand it because it's really silly.  These lookups are not in the
  225  * critical path.
  226  */
  227 
  228 #define KOBJOPLOOKUP(OPS,OP) do {                                       \
  229         _m = kobj_lookup_method_cache(OPS->cls, &OPS->cache[0],         \
  230                                        &OP##_##desc);                   \
  231 } while(0)
  232 
  233 kobj_method_t *kobj_lookup_method(kobj_class_t cls,
  234                                   kobj_method_t **cep,
  235                                   kobjop_desc_t desc);
  236 
  237 kobjop_t kobj_lookup_method_cache(kobj_class_t cls,
  238                                   kobj_method_t **cep,
  239                                   kobjop_desc_t desc);
  240 
  241 /*
  242  * Default method implementation. Returns ENXIO.
  243  */
  244 int kobj_error_method(void);
  245 
  246 #endif /* _KERNEL */
  247 
  248 #endif /* !_SYS_KOBJ_H_ */

Cache object: a801f9501c7071bd5421c7999d5671f0


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.