diff options
author | Richard Braun <rbraun@sceen.net> | 2014-09-20 02:26:06 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2014-09-20 02:26:06 +0200 |
commit | 600f0097618e9085fabf6f7ecc0283a5bb9f044d (patch) | |
tree | 28cf0f93671a6d02631be2d279a24e6197e305db /kern/sref_i.h | |
parent | 65c9a187a9926181534939480a4034b06b10b71e (diff) |
kern/sref: new module
This module provides multiprocessor scalable reference counters, based
on Refcache, as described in the RadixVM paper.
Diffstat (limited to 'kern/sref_i.h')
-rw-r--r-- | kern/sref_i.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/kern/sref_i.h b/kern/sref_i.h new file mode 100644 index 00000000..158ad429 --- /dev/null +++ b/kern/sref_i.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014 Richard Braun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _KERN_SREF_I_H +#define _KERN_SREF_I_H + +#include <kern/spinlock.h> +#include <kern/work.h> + +#define SREF_QUEUED 0x1 +#define SREF_DIRTY 0x2 + +/* + * Scalable reference counter. + * + * It's tempting to merge the flags into the next member, but since they're + * not protected by the same lock, store them separately. + */ +struct sref_counter { + sref_noref_fn_t noref_fn; + + union { + struct { + struct sref_counter *next; + struct spinlock lock; + int flags; + unsigned long value; + }; + + struct work work; + }; +}; + +#endif /* _KERN_SREF_I_H */ |