Author: sewardj
Date: 2008-03-09 20:44:20 +0000 (Sun, 09 Mar 2008)
New Revision: 7624

Log:
Remove the .mbHasShared hint bits SecMaps.  They are now pointless.
Removing them also reduces the cost of writing cache lines back to the
backing store (cacheline_wback).



Modified:
   branches/HGDEV/helgrind/hg_main.c


Modified: branches/HGDEV/helgrind/hg_main.c
===================================================================
--- branches/HGDEV/helgrind/hg_main.c   2008-03-09 20:20:37 UTC (rev 7623)
+++ branches/HGDEV/helgrind/hg_main.c   2008-03-09 20:44:20 UTC (rev 7624)
@@ -47,6 +47,21 @@
 
    - Have something like mk_SHVAL_fail instead of merely asserting
 
+   - More comments re deletion of memory containing Locks.
+
+     New proposal: Locks are never deleted, and entries never removed
+     from map_locks.  Instead have a .dormant bit in Lock indicating
+     that they are have been freed by the user.
+
+     (Later): remove map_locks.  Instead, on each SecMap have a set of
+     Locks which are known to live, or have lived, in that SecMap
+     (that is, their GA is in that SecMap).
+
+     This effectively means that we allocate one Lock entry for every
+     address that the client uses for a lock, and remember it forever.
+
+   - Fix command line ordering assumptions for --ignore-i= vs --ignore-n=
+
    STUFF I DON'T UNDERSTAND:
 
    Make sense of ignore-n/ignore-i.  What exactly does this do?
@@ -487,7 +502,6 @@
    struct {
       UInt magic;
       Bool mbHasLocks;  /* hint: any locks in range?  safe: True */
-      Bool mbHasShared; /* hint: any ShM/ShR states in range?  safe: True */
       CacheLineZ  linesZ[N_SECMAP_ZLINES];
       CacheLineF* linesF;
       UInt linesF_size;
@@ -2602,7 +2616,6 @@
    tl_assert(sm);
    sm->magic       = SecMap_MAGIC;
    sm->mbHasLocks  = False; /* dangerous */
-   sm->mbHasShared = False; /* dangerous */
    for (i = 0; i < N_SECMAP_ZLINES; i++) {
       sm->linesZ[i].dict[0] = SHVAL_New;
       sm->linesZ[i].dict[1] = 0; /* completely invalid SHVAL */
@@ -2675,27 +2688,7 @@
    sm->mbHasLocks = b;
 }
 
-static void shmem__set_mbHasShared ( Addr a, Bool b )
-{
-   SecMap* sm;
-   Addr aKey = shmem__round_to_SecMap_base(a);
-   tl_assert(b == False || b == True);
-   // avoid creating a SecMap for memory that we ignore.
-   if (b == False && clo_ignore_n != 1 && address_may_be_ignored(a)) return;
 
-   if (HG_(lookupFM)( map_shmem,
-                      NULL/*keyP*/, (Word*)&sm, (Word)aKey )) {
-      /* Found; address of SecMap is in sm */
-   } else {
-      /* create a new one */
-      sm = shmem__alloc_SecMap();
-      tl_assert(sm);
-      HG_(addToFM)( map_shmem, (Word)aKey, (Word)sm );
-   }
-   sm->mbHasShared = b;
-}
-
-
 /*----------------------------------------------------------------*/
 /*--- Sanity checking the data structures                      ---*/
 /*----------------------------------------------------------------*/
@@ -2956,7 +2949,7 @@
    while (HG_(nextIterFM)( map_shmem, &smga, (Word*)&sm )) {
       SecMapIter itr;
       SVal*      sv_p = NULL;
-      Bool       mbHasShared = False;
+      //Bool       mbHasShared = False;
       //Bool       allNoAccess = True;
       if (!is_sane_SecMap(sm)) BAD("1");
       // sm properly aligned
@@ -2965,8 +2958,8 @@
       initSecMapIter( &itr );
       while (stepSecMapIter( &sv_p, &itr, sm )) {
          SVal sv = *sv_p;
-         if (is_SHVAL_Shared(sv)) 
-            mbHasShared = True;
+         //if (is_SHVAL_Shared(sv)) 
+         //   mbHasShared = True;
          //if (!is_SHVAL_NoAccess(sv))
          //   allNoAccess = False;
 
@@ -3004,7 +2997,7 @@
          }
       } /* iterating over a SecMap */
       // Check essential safety property
-      if (mbHasShared && !sm->mbHasShared) BAD("13");
+      //if (mbHasShared && !sm->mbHasShared) BAD("13");
       // This is optional - check that destroyed memory has its hint
       // bits cleared.  NB won't work properly unless full, eager
       // GCing of SecMaps is implemented
@@ -4114,12 +4107,11 @@
 typedef struct { UChar count; SVal sval; } CountedSVal;
 
 static
-Bool sequentialise_CacheLine ( /*OUT*/CountedSVal* dst,
+void sequentialise_CacheLine ( /*OUT*/CountedSVal* dst,
                                /*OUT*/Word* dstUsedP,
                                Word nDst, CacheLine* src )
 {
    Word  tno, cloff, dstUsed;
-   Bool  anyShared = False;
 
    tl_assert(nDst == N_LINE_ARANGE);
    dstUsed = 0;
@@ -4130,9 +4122,7 @@
 
       /* sequentialise the tree described by (descr,tree). */
 #     define PUT(_n,_v)                                \
-         do { if (is_SHVAL_Shared(_v))                 \
-                 anyShared = True;                     \
-              dst[dstUsed  ].count = (_n);             \
+         do { dst[dstUsed  ].count = (_n);             \
               dst[dstUsed++].sval  = (_v);             \
          } while (0)
 
@@ -4168,7 +4158,6 @@
    tl_assert(dstUsed <= nDst);
 
    *dstUsedP = dstUsed;
-   return anyShared;
 }
 
 /* Write the cacheline 'wix' to backing store.  Where it ends up
@@ -4176,7 +4165,6 @@
 static __attribute__((noinline)) void cacheline_wback ( UWord wix )
 {
    Word        i, j, k, m;
-   Bool        anyShared = False;
    Addr        tag;
    SecMap*     sm;
    CacheLine*  cl;
@@ -4214,8 +4202,8 @@
       tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
 
    csvalsUsed = -1;
-   anyShared = sequentialise_CacheLine( csvals, &csvalsUsed, 
-                                        N_LINE_ARANGE, cl );
+   sequentialise_CacheLine( csvals, &csvalsUsed, 
+                            N_LINE_ARANGE, cl );
    tl_assert(csvalsUsed >= 1 && csvalsUsed <= N_LINE_ARANGE);
    if (0) VG_(printf)("%lu ", csvalsUsed);
 
@@ -4284,8 +4272,8 @@
       stats__cache_F_wbacks++;
    }
 
-   if (anyShared)
-      sm->mbHasShared = True;
+   //if (anyShared)
+   //   sm->mbHasShared = True;
 
    /* mb_tidy_one_cacheline(); */
 }
@@ -5320,7 +5308,7 @@
       if (firstA <= sma && sma + N_SECMAP_ARANGE - 1 <= lastA) {
          /* Yes.  Clear the hint bits. */
          shmem__set_mbHasLocks( sma, False );
-         shmem__set_mbHasShared( sma, False );
+         //shmem__set_mbHasShared( sma, False );
       }
    }
 
@@ -8971,13 +8959,17 @@
    else if (VG_CLO_STREQ(arg, "--happens-before=all"))
       clo_happens_before = 2;
 
+   /* FIXME this is bad.  It assumes that --ignore-n= occurs before
+      --ignore-i= on the command line. */
    else if (VG_CLO_STREQN(11, arg, "--ignore-n=")) {
       clo_ignore_n = VG_(atoll)(&arg[11]);
-      tl_assert(clo_ignore_n == 0 || (clo_ignore_n > 0 && clo_ignore_i < 
clo_ignore_n));
+      tl_assert(clo_ignore_n == 0 || (clo_ignore_n > 0 
+                                      && clo_ignore_i < clo_ignore_n));
    }
    else if (VG_CLO_STREQN(11, arg, "--ignore-i=")) {
       clo_ignore_i = VG_(atoll)(&arg[11]);
-      tl_assert(clo_ignore_n == 0 || (clo_ignore_n > 0 && clo_ignore_i < 
clo_ignore_n));
+      tl_assert(clo_ignore_n == 0 || (clo_ignore_n > 0 
+                                      && clo_ignore_i < clo_ignore_n));
    }
 
    else if (VG_CLO_STREQ(arg, "--gen-vcg=no"))


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to