From 736c7efc7075a7b1a3ee31895af7347278d345e8 Mon Sep 17 00:00:00 2001 From: Patrick Mochel Date: Tue, 29 Oct 2002 01:19:51 -0800 Subject: introduce struct kobject: simple, generic object for embedding in other structures. This is not meant to be fancy; just something simple for which we can control the refcount and other common functionality using common code. The basic operations for registration and reference count manipulation are included. --- lib/Makefile | 5 +-- lib/kobject.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 lib/kobject.c (limited to 'lib') diff --git a/lib/Makefile b/lib/Makefile index 9bbb27efb10a..fa1a42d86abe 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -9,10 +9,11 @@ L_TARGET := lib.a export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o \ - crc32.o rbtree.o radix-tree.o + crc32.o rbtree.o radix-tree.o kobject.o obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \ - bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o + bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ + kobject.o obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o diff --git a/lib/kobject.c b/lib/kobject.c new file mode 100644 index 000000000000..48e950c9e4ce --- /dev/null +++ b/lib/kobject.c @@ -0,0 +1,98 @@ +/* + * kobject.c - library routines for handling generic kernel objects + */ + +#define DEBUG 1 + +#include +#include +#include + +/** + * kobject_init - initialize object. + * @kobj: object in question. + */ + +void kobject_init(struct kobject * kobj) +{ + atomic_set(&kobj->refcount,1); + INIT_LIST_HEAD(&kobj->entry); +} + +/** + * kobject_register - register an object. + * @kobj: object in question. + * + * For now, fill in the replicated fields in the object's + * directory entry, and create a dir in sysfs. + * This stuff should go away in the future, as we move + * more implicit things to sysfs. + */ + +int kobject_register(struct kobject * kobj) +{ + pr_debug("kobject %s: registering\n",kobj->name); + if (kobj->parent) + kobject_get(kobj->parent); + return 0; +} + +/** + * kobject_unregister - unlink an object. + * @kobj: object going away. + * + * The device has been told to be removed, but may + * not necessarily be disappearing from the kernel. + * So, we remove the directory and decrement the refcount + * that we set with kobject_register(). + * + * Eventually (maybe now), the refcount will hit 0, and + * put_device() will clean the device up. + */ + +void kobject_unregister(struct kobject * kobj) +{ + pr_debug("kobject %s: unregistering\n",kobj->name); + kobject_put(kobj); +} + +/** + * kobject_get - increment refcount for object. + * @kobj: object. + */ + +struct kobject * kobject_get(struct kobject * kobj) +{ + struct kobject * ret = kobj; + if (atomic_read(&kobj->refcount) > 0) + atomic_inc(&kobj->refcount); + else + ret = NULL; + return ret; +} + +/** + * kobject_put - decrement refcount for object. + * @kobj: object. + * + * Decrement the refcount, and check if 0. If it is, then + * we're gonna need to clean it up, and decrement the refcount + * of its parent. + */ + +void kobject_put(struct kobject * kobj) +{ + struct kobject * parent = kobj->parent; + + if (!atomic_dec_and_test(&kobj->refcount)) + return; + pr_debug("kobject %s: cleaning up\n",kobj->name); + if (parent) + kobject_put(parent); +} + +EXPORT_SYMBOL(kobject_init); +EXPORT_SYMBOL(kobject_register); +EXPORT_SYMBOL(kobject_unregister); +EXPORT_SYMBOL(kobject_get); +EXPORT_SYMBOL(kobject_put); -- cgit v1.2.3