- Implemented ordering checks. Need some test to validate this though.
This commit is contained in:
		
							parent
							
								
									957b920b98
								
							
						
					
					
						commit
						4f534410bd
					
				@ -4,12 +4,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "list.h"
 | 
					#include "list.h"
 | 
				
			||||||
#include "role.h"
 | 
					#include "role.h"
 | 
				
			||||||
 | 
					#include "label.h"
 | 
				
			||||||
#include "system.h"
 | 
					#include "system.h"
 | 
				
			||||||
#include "binding.h"
 | 
					#include "binding.h"
 | 
				
			||||||
#include "warshall.h"
 | 
					#include "warshall.h"
 | 
				
			||||||
#include "memory.h"
 | 
					#include "memory.h"
 | 
				
			||||||
#include "debug.h"
 | 
					#include "debug.h"
 | 
				
			||||||
#include "term.h"
 | 
					#include "term.h"
 | 
				
			||||||
 | 
					#include "termmap.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static System sys;
 | 
					static System sys;
 | 
				
			||||||
static int *graph;
 | 
					static int *graph;
 | 
				
			||||||
@ -342,6 +344,58 @@ goal_unbind (const Binding b)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//! Determine whether some label set is ordered w.r.t. send/read order.
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Assumes all these labels exist in the system, within length etc, and that the run mappings are valid.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					labels_ordered (Termmap runs, Termlist labels)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  goal_graph_create ();
 | 
				
			||||||
 | 
					  while (labels != NULL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      // Given this label, and the mapping of runs, we want to know if the order is okay. Thus, we need to know sendrole and readrole
 | 
				
			||||||
 | 
					      Labelinfo linfo;
 | 
				
			||||||
 | 
					      int send_run, send_ev, read_run, read_ev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int get_index (const int run)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
						Roledef rd;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i = 0;
 | 
				
			||||||
 | 
						rd = sys->runs[run].start;
 | 
				
			||||||
 | 
						while (rd != NULL && !isTermEqual (rd->label, labels->term))
 | 
				
			||||||
 | 
						  {
 | 
				
			||||||
 | 
						    rd = rd->next;
 | 
				
			||||||
 | 
						    i++;
 | 
				
			||||||
 | 
						  }
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						if (rd == NULL)
 | 
				
			||||||
 | 
						  error
 | 
				
			||||||
 | 
						    ("Could not locate send or read for label, after niagree holds, to test for order.");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						return i;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      linfo = label_find (sys->labellist, labels->term);
 | 
				
			||||||
 | 
					      send_run = termmapGet (runs, linfo->sendrole);
 | 
				
			||||||
 | 
					      read_run = termmapGet (runs, linfo->readrole);
 | 
				
			||||||
 | 
					      send_ev = get_index (send_run);
 | 
				
			||||||
 | 
					      read_ev = get_index (read_run);
 | 
				
			||||||
 | 
					      if (graph[graph_nodes (nodes, send_run, send_ev, read_run, read_ev)] ==
 | 
				
			||||||
 | 
						  0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  // Not ordered; false
 | 
				
			||||||
 | 
						  return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Proceed
 | 
				
			||||||
 | 
					      labels = labels->next;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//! Prune invalid state w.r.t. <=C minimal requirement
 | 
					//! Prune invalid state w.r.t. <=C minimal requirement
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Intuition says this can be done a lot more efficient. Luckily this is the prototype.
 | 
					 * Intuition says this can be done a lot more efficient. Luckily this is the prototype.
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
#define BINDINGS
 | 
					#define BINDINGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "term.h"
 | 
					#include "term.h"
 | 
				
			||||||
 | 
					#include "termmap.h"
 | 
				
			||||||
#include "system.h"
 | 
					#include "system.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@ -41,6 +42,7 @@ void goal_add (Term term, const int run, const int ev, const int level);
 | 
				
			|||||||
void goal_remove_last ();
 | 
					void goal_remove_last ();
 | 
				
			||||||
int goal_bind (const Binding b, const int run, const int ev);
 | 
					int goal_bind (const Binding b, const int run, const int ev);
 | 
				
			||||||
void goal_unbind (const Binding b);
 | 
					void goal_unbind (const Binding b);
 | 
				
			||||||
 | 
					int labels_ordered (Termmap runs, Termlist labels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int bindings_c_minimal ();
 | 
					int bindings_c_minimal ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										54
									
								
								src/claim.c
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								src/claim.c
									
									
									
									
									
								
							@ -4,6 +4,7 @@
 | 
				
			|||||||
#include "label.h"
 | 
					#include "label.h"
 | 
				
			||||||
#include "error.h"
 | 
					#include "error.h"
 | 
				
			||||||
#include "debug.h"
 | 
					#include "debug.h"
 | 
				
			||||||
 | 
					#include "binding.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MATCH_NONE 0
 | 
					#define MATCH_NONE 0
 | 
				
			||||||
#define MATCH_ORDER 1
 | 
					#define MATCH_ORDER 1
 | 
				
			||||||
@ -475,7 +476,8 @@ check_claim_niagree (const System sys, const int i)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//! Check generic agree claim for a given set of runs, arachne style
 | 
					//! Check generic agree claim for a given set of runs, arachne style
 | 
				
			||||||
int arachne_runs_agree (const System sys, const Claimlist cl, const Termmap runs)
 | 
					int
 | 
				
			||||||
 | 
					arachne_runs_agree (const System sys, const Claimlist cl, const Termmap runs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Termlist labels;
 | 
					  Termlist labels;
 | 
				
			||||||
  int flag;
 | 
					  int flag;
 | 
				
			||||||
@ -506,7 +508,7 @@ int arachne_runs_agree (const System sys, const Claimlist cl, const Termmap runs
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	run = termmapGet (runs, role);
 | 
						run = termmapGet (runs, role);
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
	  if (run < 0 || run >= sys->maxruns )
 | 
						if (run < 0 || run >= sys->maxruns)
 | 
				
			||||||
	  {
 | 
						  {
 | 
				
			||||||
	    globalError++;
 | 
						    globalError++;
 | 
				
			||||||
	    eprintf ("Run mapping %i out of bounds for role ", run);
 | 
						    eprintf ("Run mapping %i out of bounds for role ", run);
 | 
				
			||||||
@ -567,12 +569,14 @@ int arachne_runs_agree (const System sys, const Claimlist cl, const Termmap runs
 | 
				
			|||||||
  return flag;
 | 
					  return flag;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//! Check arachne agreement claim
 | 
					//! Check arachne authentications claim
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Per default, occurs in run 0, but for generality we have left the run parameter in.
 | 
					 * Per default, occurs in run 0, but for generality we have left the run parameter in.
 | 
				
			||||||
 *@returns 1 if the claim is true, 0 if it is not.
 | 
					 *@returns 1 if the claim is true, 0 if it is not.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int arachne_claim_niagree (const System sys, const int claim_run, const int claim_index)
 | 
					int
 | 
				
			||||||
 | 
					arachne_claim_authentications (const System sys, const int claim_run,
 | 
				
			||||||
 | 
								       const int claim_index, const int require_order)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  Claimlist cl;
 | 
					  Claimlist cl;
 | 
				
			||||||
  Roledef rd;
 | 
					  Roledef rd;
 | 
				
			||||||
@ -584,7 +588,24 @@ int arachne_claim_niagree (const System sys, const int claim_run, const int clai
 | 
				
			|||||||
    if (roles_tofill == NULL)
 | 
					    if (roles_tofill == NULL)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
	// All roles have been chosen
 | 
						// All roles have been chosen
 | 
				
			||||||
	  return arachne_runs_agree (sys, cl, runs_involved);
 | 
						if (arachne_runs_agree (sys, cl, runs_involved))
 | 
				
			||||||
 | 
						  {
 | 
				
			||||||
 | 
						    // niagree holds
 | 
				
			||||||
 | 
						    if (!require_order)
 | 
				
			||||||
 | 
						      {
 | 
				
			||||||
 | 
							return 1;
 | 
				
			||||||
 | 
						      }
 | 
				
			||||||
 | 
						    else
 | 
				
			||||||
 | 
						      {
 | 
				
			||||||
 | 
							// Stronger claim: nisynch. Test for ordering as well.
 | 
				
			||||||
 | 
							return labels_ordered (runs_involved, cl->prec);
 | 
				
			||||||
 | 
						      }
 | 
				
			||||||
 | 
						  }
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  {
 | 
				
			||||||
 | 
						    // niagree does not hold
 | 
				
			||||||
 | 
						    return 0;
 | 
				
			||||||
 | 
						  }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@ -600,10 +621,12 @@ int arachne_claim_niagree (const System sys, const int claim_run, const int clai
 | 
				
			|||||||
	    if (sys->runs[run].protocol == cl->protocol)
 | 
						    if (sys->runs[run].protocol == cl->protocol)
 | 
				
			||||||
	      {
 | 
						      {
 | 
				
			||||||
		// Has to be the right name
 | 
							// Has to be the right name
 | 
				
			||||||
		  if (isTermEqual (sys->runs[run].role->nameterm, roles_tofill->term))
 | 
							if (isTermEqual
 | 
				
			||||||
 | 
							    (sys->runs[run].role->nameterm, roles_tofill->term))
 | 
				
			||||||
		  {
 | 
							  {
 | 
				
			||||||
		    // Choose, iterate
 | 
							    // Choose, iterate
 | 
				
			||||||
		      runs_involved = termmapSet (runs_involved, roles_tofill->term, run);
 | 
							    runs_involved =
 | 
				
			||||||
 | 
							      termmapSet (runs_involved, roles_tofill->term, run);
 | 
				
			||||||
		    flag = flag || fill_roles (roles_tofill->next);
 | 
							    flag = flag || fill_roles (roles_tofill->next);
 | 
				
			||||||
		  }
 | 
							  }
 | 
				
			||||||
	      }
 | 
						      }
 | 
				
			||||||
@ -634,9 +657,18 @@ int arachne_claim_niagree (const System sys, const int claim_run, const int clai
 | 
				
			|||||||
  return flag;
 | 
					  return flag;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//! Test nisynch
 | 
					//! Test niagree
 | 
				
			||||||
int arachne_claim_nisynch (const System sys, const int claim_run, const int claim_index)
 | 
					int
 | 
				
			||||||
 | 
					arachne_claim_niagree (const System sys, const int claim_run,
 | 
				
			||||||
 | 
							       const int claim_index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  //!@todo For now, only agreement claim
 | 
					  return arachne_claim_authentications (sys, claim_run, claim_index, 0);
 | 
				
			||||||
  return arachne_claim_niagree (sys, claim_run, claim_index);
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//! Test nisynch
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					arachne_claim_nisynch (const System sys, const int claim_run,
 | 
				
			||||||
 | 
							       const int claim_index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return arachne_claim_authentications (sys, claim_run, claim_index, 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user