A question about codes in mdb_flush(...)

"Yan Zheng" <[email protected]>
Newsgroups gmane.comp.micro-kernel.l4.l4ka.general
Message-ID <[email protected]>
Hi all.

In file kernel/src/generic/mapping.cc line 514.

-- code --
	else // when nroot is null
	{
	    if (nmap)
	    {
		if (pmap)
		    f_pg = nmap->get_pgent (pmap);
		else
		    f_pg = nmap->get_pgent (proot);
		f_map = nmap;
	    }
	    else if ((f_pgsize < t_pgsize)  && root)
	    {
		// Recurse up from subarray
		if (fp.is_rwx ())
		{
		    // Revoke all access rights (i.e., remove subtree)
		    root -= mdb_arraysize (f_pgsize) - 1;
		    mdb_free_buffer ((addr_t) root,
				     mdb_arraysize (f_pgsize) *
				     sizeof (rootnode_t));
		}

		ASSERT (f_pgsize < mapnode_t::size_max);
		f_map = r_nmap[f_pgsize];
		root  = r_root[f_pgsize];
		rcnt  = r_rcnt[f_pgsize];
		if (r_prev[f_pgsize] & 1)
		{
		    proot = NULL;
		    pmap = (mapnode_t *) (r_prev[f_pgsize] & ~1UL);
		    if (f_map)
			f_pg = f_map->get_pgent (pmap);
		}
		else
		{
		    proot = (rootnode_t *) r_prev[f_pgsize];
		    pmap = NULL;
		    if (f_map)
			f_pg = f_map->get_pgent (proot);
		}

		f_pgsize++;
	    }
-- code --

When nmap is null and the test at line 514 returns true,  it recurse
up from subarray.  (I think) this doesn't ensure that it has already
traversed all nodes of the subarray. (for example, f_map is a child of
a node in the middle of subarray)  Maybe it also needs test rcnt equal
to zero at line 514 .


Thanks for reading.

Regards.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.