diff options
| author | Patrick Mochel <mochel@osdl.org> | 2002-10-29 01:19:51 -0800 |
|---|---|---|
| committer | Patrick Mochel <mochel@osdl.org> | 2002-10-29 01:19:51 -0800 |
| commit | 736c7efc7075a7b1a3ee31895af7347278d345e8 (patch) | |
| tree | 7d60f9237e2cb92c90f10118cdac2eddcdc575c3 /lib/kobject.c | |
| parent | 117dbfb1902a24f941ca4721b4f1769b5c3a3bc9 (diff) | |
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.
Diffstat (limited to 'lib/kobject.c')
| -rw-r--r-- | lib/kobject.c | 98 |
1 files changed, 98 insertions, 0 deletions
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 <linux/kobject.h> +#include <linux/module.h> +#include <linux/stat.h> + +/** + * 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); |
