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$
   27  */
   28 
   29 #ifndef _SYS_KOBJ_H_
   30 #define _SYS_KOBJ_H_
   31 
   32 /*
   33  * Forward declarations
   34  */
   35 typedef struct kobj             *kobj_t;
   36 typedef struct kobj_class       *kobj_class_t;
   37 typedef struct kobj_method      kobj_method_t;
   38 typedef int                     (*kobjop_t)(void);
   39 typedef struct kobj_ops         *kobj_ops_t;
   40 typedef struct kobjop_desc      *kobjop_desc_t;
   41 struct malloc_type;
   42 
   43 struct kobj_method {
   44         kobjop_desc_t   desc;
   45         kobjop_t        func;
   46 };
   47 
   48 /*
   49  * A class is simply a method table and a sizeof value. When the first
   50  * instance of the class is created, the method table will be compiled
   51  * into a form more suited to efficient method dispatch. This compiled
   52  * method table is always the first field of the object.
   53  */
   54 #define KOBJ_CLASS_FIELDS                                               \
   55         const char      *name;          /* class name */                \
   56         kobj_method_t   *methods;       /* method table */              \
   57         size_t          size;           /* object size */               \
   58         u_int           refs;           /* reference count */           \
   59         kobj_ops_t      ops             /* compiled method table */
   60 
   61 struct kobj_class {
   62         KOBJ_CLASS_FIELDS;
   63 };
   64 
   65 /*
   66  * Implementation of kobj.
   67  */
   68 #define KOBJ_FIELDS                             \
   69         kobj_ops_t      ops
   70 
   71 struct kobj {
   72         KOBJ_FIELDS;
   73 };
   74 
   75 /*
   76  * The ops table is used as a cache of results from kobj_lookup_method().
   77  */
   78 
   79 #define KOBJ_CACHE_SIZE 256
   80 
   81 struct kobj_ops {
   82         kobj_method_t   cache[KOBJ_CACHE_SIZE];
   83         kobj_class_t    cls;
   84 };
   85 
   86 struct kobjop_desc {
   87         unsigned int    id;     /* unique ID */
   88         kobjop_t        deflt;  /* default implementation */
   89 };
   90 
   91 /*
   92  * Shorthand for constructing method tables.
   93  */
   94 #define KOBJMETHOD(NAME, FUNC) { &NAME##_desc, (kobjop_t) FUNC }
   95 
   96 #define DEFINE_CLASS(name, methods, size)       \
   97                                                 \
   98 struct kobj_class name ## _class = {            \
   99         #name, methods, size                    \
  100 }
  101 
  102 /*
  103  * Compile the method table in a class.
  104  */
  105 void            kobj_class_compile(kobj_class_t cls);
  106 
  107 /*
  108  * Compile the method table, with the caller providing the space for
  109  * the ops table.(for use before malloc is initialised).
  110  */
  111 void            kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);
  112 
  113 /*
  114  * Free the compiled method table in a class.
  115  */
  116 void            kobj_class_free(kobj_class_t cls);
  117 
  118 /*
  119  * Allocate memory for and initalise a new object.
  120  */
  121 kobj_t          kobj_create(kobj_class_t cls,
  122                             struct malloc_type *mtype,
  123                             int mflags);
  124 
  125 /*
  126  * Initialise a pre-allocated object.
  127  */
  128 void            kobj_init(kobj_t obj, kobj_class_t cls);
  129 
  130 /*
  131  * Delete an object. If mtype is non-zero, free the memory.
  132  */
  133 void            kobj_delete(kobj_t obj, struct malloc_type *mtype);
  134 
  135 /*
  136  * Maintain stats on hits/misses in lookup caches.
  137  */
  138 #ifdef KOBJ_STATS
  139 extern int kobj_lookup_hits;
  140 extern int kobj_lookup_misses;
  141 #define KOBJOPHIT       do { kobj_lookup_hits++; } while (0)
  142 #define KOBJOPMISS      do { kobj_lookup_misses++; } while (0)
  143 #else
  144 #define KOBJOPHIT       do { } while (0)
  145 #define KOBJOPMISS      do { } while (0)
  146 #endif
  147 
  148 /*
  149  * Lookup the method in the cache and if it isn't there look it up the
  150  * slow way.
  151  */
  152 #define KOBJOPLOOKUP(OPS,OP) do {                                       \
  153         kobjop_desc_t _desc = &OP##_##desc;                             \
  154         kobj_method_t *_ce =                                            \
  155             &OPS->cache[_desc->id & (KOBJ_CACHE_SIZE-1)];               \
  156         if (_ce->desc != _desc) {                                       \
  157                 KOBJOPMISS;                                             \
  158                 kobj_lookup_method(OPS->cls->methods, _ce, _desc);      \
  159         } else {                                                        \
  160                 KOBJOPHIT;                                              \
  161         }                                                               \
  162         _m = _ce->func;                                                 \
  163 } while(0)
  164 
  165 void kobj_lookup_method(kobj_method_t *methods,
  166                         kobj_method_t *ce,
  167                         kobjop_desc_t desc);
  168 
  169 #endif /* !_SYS_KOBJ_H_ */

Cache object: bb508866195a7aafe7cff691e2447714


[ 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.