* \brief Region handling
*/
/*
- * (c) 2008-2009 Technische Universität Dresden
+ * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
+ * Alexander Warg <warg@os.inf.tu-dresden.de>,
+ * Björn Döbel <doebel@os.inf.tu-dresden.de>
+ * economic rights: Technische Universität Dresden (Germany)
+ *
* This file is part of TUD:OS and distributed under the terms of the
* GNU General Public License 2.
* Please see the COPYING-GPL-2 file for details.
if (!n)
return Node();
- if (!n->first.contains(key))
- return Node();
+ // 'find' should find any region overlapping with the searched one, the
+ // caller should check for further requirements
+ if (0)
+ if (!n->first.contains(key))
+ return Node();
return n;
}
return L4_INVALID_ADDR;
- if (flags & Search)
+ Region c;
+
+ if (!(flags & Search))
+ {
+ c = Region(addr, addr + size - 1);
+ Node r = _am.find_node(c);
+ if (r)
+ return L4_INVALID_ADDR;
+ }
+
+ while (flags & Search)
{
if (addr < min_addr() || (addr + size - 1) > max_addr())
addr = min_addr();
addr = find_free(addr, max_addr(), size, align, flags);
if (addr == L4_INVALID_ADDR)
return L4_INVALID_ADDR;
- }
- Region c(addr, addr + size - 1);
- Node r = _am.find_node(c);
- if (r)
- return L4_INVALID_ADDR;
+ c = Region(addr, addr + size - 1);
+ Node r = _am.find_node(c);
+ if (!r)
+ break;
+
+ if (r->first.end() >= max_addr())
+ return L4_INVALID_ADDR;
+
+ addr = r->first.end() + 1;
+ }
if (_am.insert(c, Hdlr(typename Hdlr::Dataspace(), 0, flags)).second == 0)
return addr;