[apparmor] [PATCH 2/9] Embedded the temporary computed nodes as part of the state
Steve Beattie
steve at nxnw.org
Thu Nov 11 00:24:24 GMT 2010
On Wed, Nov 10, 2010 at 02:02:23PM -0800, John Johansen wrote:
> Embedding the nodes are part of the state gives fast back reference from
> the state to the nodes that created it. This is useful for the state to
> nodes mapping dump as it lets us output the states in order. It will also
> let us avoid certain nodemap lookup in the future.
>
> Overlay the nodes field (used only in dfa construction) with the partition
> field which is only used during dfa minimization to avoid making the state
> any larger.
>
> Signed-off-by: John Johansen <john.johansen at canonical.com>
> ---
> parser/libapparmor_re/regexp.y | 21 +++++++++++++++------
> 1 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/parser/libapparmor_re/regexp.y b/parser/libapparmor_re/regexp.y
> index 82e9bb5..f866b78 100644
> --- a/parser/libapparmor_re/regexp.y
> +++ b/parser/libapparmor_re/regexp.y
> @@ -1403,7 +1403,10 @@ class State {
> public:
> State() : label (0), audit(0), accept(0), cases() { }
> int label;
> - Partition *partition;
> + union {
> + Partition *partition;
> + NodeSet *nodes;
> + };
Should the union have an initializer? Can you document the field in the
comment header for the State class?
> @@ -1421,6 +1424,7 @@ typedef map<pair<unsigned long, NodeSet *>, State *, deref_less_than > NodeMap;
> /* Transitions in the DFA. */
>
> class DFA {
> + void dump_node_to_dfa(void);
> public:
> DFA(Node *root, dfaflags_t flags);
> virtual ~DFA();
> @@ -1454,6 +1458,7 @@ do { \
> */ \
> TARGET = new State(); \
> (TARGET)->label = nodemap.size(); \
> + (TARGET)->nodes = (NODES); \
> states.push_back(TARGET); \
> nodemap.insert(make_pair(index, TARGET)); \
> work_queue.push_back(NODES); \
> @@ -1468,14 +1473,16 @@ do { \
> } \
> } while (0)
>
> -static void dump_node_to_dfa(NodeMap &nodemap)
> +/* WARNING: This routine can only be called from within DFA creation as
> + * the nodes value is only valid during dfa construction.
> + */
> +void DFA::dump_node_to_dfa(void)
> {
> cerr << "Mapping of States to expr nodes\n"
> " State <= Nodes\n"
> "-------------------\n";
> - for (NodeMap::iterator i = nodemap.begin(); i != nodemap.end(); i++)
> - cerr << " " << i->second->label << " <= " << *i->first.second << "\n";
> -
> + for (Partition::iterator i = states.begin(); i != states.end(); i++)
> + cerr << " " << (*i)->label << " <= " << *(*i)->nodes << "\n";
> }
>
> /**
> @@ -1505,6 +1512,7 @@ DFA::DFA(Node *root, dfaflags_t flags) : root(root)
> nonmatching = new State;
> states.push_back(nonmatching);
> NodeSet *emptynode = new NodeSet;
> + nonmatching->nodes = emptynode;
> nodemap.insert(make_pair(make_pair(hash_NodeSet(emptynode), emptynode), nonmatching));
> /* there is no nodemapping for the nonmatching state */
>
> @@ -1515,6 +1523,7 @@ DFA::DFA(Node *root, dfaflags_t flags) : root(root)
> start->label = 1;
> states.push_back(start);
> NodeSet *first = new NodeSet(root->firstpos);
> + start->nodes = first;
> nodemap.insert(make_pair(make_pair(hash_NodeSet(first), first), start));
>
> /* the work_queue contains the proto-states (set of nodes that is
> @@ -1594,7 +1603,7 @@ DFA::DFA(Node *root, dfaflags_t flags) : root(root)
> }
>
> if (flags & DFA_DUMP_NODE_TO_DFA)
> - dump_node_to_dfa(nodemap);
> + dump_node_to_dfa();
>
> for (NodeMap::iterator i = nodemap.begin(); i != nodemap.end(); i++)
> delete i->first.second;
Otherwise, ACK.
--
Steve Beattie
<sbeattie at ubuntu.com>
http://NxNW.org/~steve/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
Url : https://lists.ubuntu.com/archives/apparmor/attachments/20101110/e6e2ff40/attachment-0001.pgp
More information about the AppArmor
mailing list