Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
KOBJ(9)			   Kernel Developer's Manual		       KOBJ(9)

NAME
       kobj -- a kernel	object system for FreeBSD

SYNOPSIS
       #include	<sys/param.h>
       #include	<sys/kobj.h>

       void
       kobj_class_compile(kobj_class_t cls);

       void
       kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);

       void
       kobj_class_free(kobj_class_t cls);

       kobj_t
       kobj_create(kobj_class_t	cls, struct malloc_type	*mtype,	int mflags);

       void
       kobj_init(kobj_t	obj, kobj_class_t cls);

       void
       kobj_init_static(kobj_t obj, kobj_class_t cls);

       void
       kobj_delete(kobj_t obj, struct malloc_type *mtype);

       DEFINE_CLASS(name, kobj_method_t	*methods, size_t size);

DESCRIPTION
       The kernel object system	implements an object-oriented programming sys-
       tem  in the FreeBSD kernel.  The	system is based	around the concepts of
       interfaces, which are descriptions of sets of methods;  classes,	 which
       are  lists  of functions	implementing certain methods from those	inter-
       faces; and objects, which combine a class with a	structure in memory.

       Methods are called using	a dynamic method dispatching  algorithm	 which
       is  designed  to	allow new interfaces and classes to be introduced into
       the system at runtime.  The method dispatch algorithm is	designed to be
       both fast and robust and	is only	slightly more expensive	than a	direct
       function	 call, making kernel objects suitable for performance-critical
       algorithms.

       Suitable	uses for kernel	objects	are any	 algorithms  which  need  some
       kind of polymorphism (i.e., many	different objects which	can be treated
       in a uniform way).  The common behaviour	of the objects is described by
       a  suitable  interface and each different type of object	is implemented
       by a suitable class.

       The simplest way	to create a kernel object  is  to  call	 kobj_create()
       with  a	suitable class,	malloc type and	flags (see malloc(9) for a de-
       scription of the	malloc type and	flags).	 This will allocate memory for
       the object based	on the object size specified by	 the  class  and  ini-
       tialise it by zeroing the memory	and installing a pointer to the	class'
       method  dispatch	table.	Objects	created	in this	way should be freed by
       calling kobj_delete().

       Clients which would like	to manage the allocation of memory  themselves
       should  call  kobj_init()  or  kobj_init_static() with a	pointer	to the
       memory for the object and the class which implements it.	  It  is  also
       possible	 to use	kobj_init() and	kobj_init_static() to change the class
       for an object.  This should be done with	care as	the classes must agree
       on the layout of	the object.  The device	framework uses this feature to
       associate drivers with devices.

       The  functions  kobj_class_compile(),  kobj_class_compile_static()  and
       kobj_class_free()  are  used  to	 process  a  class description to make
       method dispatching efficient.  A	client should  not  normally  need  to
       call  these since a class will automatically be compiled	the first time
       it is used.  If a class is to be	used before malloc(9) and mutex(9) are
       initialised, then kobj_class_compile_static() should be called with the
       class and a pointer to a	statically allocated kobj_ops structure	before
       the class is used to  initialise	 any  objects.	 In  that  case,  also
       kobj_init_static() should be used instead of kobj_init().

       To  define a class, first define	a simple array of kobj_method_t.  Each
       method which the	class implements should	be entered into	the table  us-
       ing  the	macro KOBJMETHOD() which takes the name	of the method (includ-
       ing its interface) and a	pointer	to a  function	which  implements  it.
       The   table   should   be   terminated	with  two  zeros.   The	 macro
       DEFINE_CLASS() can then be used to initialise a kobj_class_t structure.
       The size	argument to DEFINE_CLASS() specifies how much memory should be
       allocated for each object.

HISTORY
       Some of the concepts for	this interface appeared	in the	device	frame-
       work  used  for	the  alpha  port  of  FreeBSD  3.0  and	more widely in
       FreeBSD 4.0.

AUTHORS
       This manual page	was written by Doug Rabson.

FreeBSD	14.3		       November	14, 2011		       KOBJ(9)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=kobj_create&sektion=9&manpath=FreeBSD+14.3-RELEASE+and+Ports>

home | help