generalizing fd allocation code to id allocation
Andriy Gapon
avg at icyb.net.ua
Wed Feb 11 05:09:50 PST 2009
My nose has just been rubbed into alloc_unr(9) :)
Thanks, Roman!
on 11/02/2009 14:53 Andriy Gapon said the following:
> Guys,
>
> anybody has ideas (or code) for generalizing code in
> sys/kern/kern_descrip.c for managing fd-s ("small" integer numbers)?
>
> I mean divorcing that code from filedesc and making it re-usable
> wherever we need some (constrained) id allocation.
> By constrained I mean that either ids are allocated from a sufficiently
> small limited pool or it is desirable to keep ids at small values.
>
> I needed this in a small driver that I am slowly writing and here's some
> bits from it:
>
> #define NDSLOTTYPE uint64_t
> #define NDSLOTSIZE sizeof(NDSLOTTYPE)
> #define NDENTRIES (NDSLOTSIZE * __CHAR_BIT)
> #define NDSLOT(x) ((x) / NDENTRIES)
> #define NDBIT(x) ((NDSLOTTYPE)1 << ((x) % NDENTRIES))
> #define NDSLOTS(x) (((x) + NDENTRIES - 1) / NDENTRIES)
> ...
> /* XXX ugly */
> NDSLOTTYPE host_addr_map[NDSLOTS(sizeof(uint8_t) * __CHAR_BIT)];
> ...
> static uint8_t alloc_host_addr(struct heci_softc *sc)
> {
> static const int maxoff = sizeof(sc->host_addr_map) /
> sizeof(sc->host_addr_map[0]);
> NDSLOTTYPE *map = sc->host_addr_map;
> int off;
>
> for (off = 0; off < maxoff; ++off) {
> if (map[off] != ~0UL) {
> uint8_t addr = off * NDENTRIES + ffsl(~map[off])
> - 1;
> map[NDSLOT(addr)] |= NDBIT(addr);
> return (addr);
> }
> }
>
> /* XXX what to return if all addresses are in use? */
> /* use the fact that zero is a reserved address */
> return 0;
> }
>
> static void
> release_host_addr(struct heci_softc *sc, uint8_t addr)
> {
> NDSLOTTYPE *map = sc->host_addr_map;
> if (!(map[NDSLOT(addr)] & NDBIT(addr))) /* XXX make KASSERT? */
> device_printf(sc->dev, "release for unused host addr
> 0x%02x\n", addr);
> map[NDSLOT(addr)] &= ~NDBIT(addr);
> }
>
>
> Essentially this is almost a copy/paste.
>
>
--
Andriy Gapon
More information about the freebsd-hackers
mailing list