Index: include/valgrind.h
===================================================================
RCS file: /cvsroot/valgrind/valgrind/include/valgrind.h,v
retrieving revision 1.7
diff -u -r1.7 valgrind.h
--- include/valgrind.h	2 Oct 2002 13:26:34 -0000	1.7
+++ include/valgrind.h	11 Oct 2002 05:46:10 -0000
@@ -118,6 +118,9 @@
    form 0x1000 + small_number.
 */
 
+#define VG_USERREQ_SKIN_BASE(a,b)	((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
+#define VG_IS_SKIN_USERREQ(a, b, v)	(VG_USERREQ_SKIN_BASE(a,b) == ((v) & 0xff00))
+
 typedef
    enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
           VG_USERREQ__DISCARD_TRANSLATIONS,
Index: coregrind/vg_default.c
===================================================================
RCS file: /cvsroot/valgrind/valgrind/coregrind/vg_default.c,v
retrieving revision 1.7
diff -u -r1.7 vg_default.c
--- coregrind/vg_default.c	3 Oct 2002 14:05:49 -0000	1.7
+++ coregrind/vg_default.c	11 Oct 2002 05:46:10 -0000
@@ -179,7 +179,7 @@
    ------------------------------------------------------------------ */
 
 __attribute__ ((weak))
-UInt SK_(handle_client_request)(ThreadState* tst, UInt* arg_block)
+Bool SK_(handle_client_request)(ThreadState* tst, UInt* arg_block, UInt *ret)
 {
    non_fund_panic("SK_(handle_client_request)");
 }
Index: coregrind/vg_scheduler.c
===================================================================
RCS file: /cvsroot/valgrind/valgrind/coregrind/vg_scheduler.c,v
retrieving revision 1.87
diff -u -r1.87 vg_scheduler.c
--- coregrind/vg_scheduler.c	5 Oct 2002 15:34:38 -0000	1.87
+++ coregrind/vg_scheduler.c	11 Oct 2002 05:46:21 -0000
@@ -3440,20 +3440,24 @@
 
       default:
          if (VG_(needs).client_requests) {
+	    UInt ret;
+
             if (VG_(clo_verbosity) > 2)
                VG_(printf)("client request: code %d,  addr %p,  len %d\n",
                            arg[0], (void*)arg[1], arg[2] );
 
-            SET_EDX(tid,
-                    SK_(handle_client_request) ( &VG_(threads)[tid], arg )
-            );
+	    if (SK_(handle_client_request) ( &VG_(threads)[tid], arg, &ret ))
+		SET_EDX(tid, ret);
          } else {
-            VG_(printf)("\nError:\n"
-                        "  unhandled client request: 0x%x.  Perhaps\n" 
-                        "  VG_(needs).client_requests should be set?\n",
-                        arg[0]);
-            VG_(core_panic)("do_client_request: unknown request");
-            /*NOTREACHED*/
+	    static Bool whined = False;
+
+	    if (!whined) {
+	       VG_(message)(Vg_UserMsg, "Warning:\n"
+			    "  unhandled client request: 0x%x.  Perhaps\n" 
+			    "  VG_(needs).client_requests should be set?\n",
+			    arg[0]);
+	       whined = True;
+	    }
          }
          break;
    }
Index: memcheck/memcheck.h
===================================================================
RCS file: /cvsroot/valgrind/valgrind/memcheck/memcheck.h,v
retrieving revision 1.4
diff -u -r1.4 memcheck.h
--- memcheck/memcheck.h	2 Oct 2002 13:26:35 -0000	1.4
+++ memcheck/memcheck.h	11 Oct 2002 05:46:22 -0000
@@ -72,7 +72,7 @@
 
 typedef
    enum { 
-      VG_USERREQ__MAKE_NOACCESS = VG_USERREQ__FINAL_DUMMY_CLIENT_REQUEST + 1, 
+      VG_USERREQ__MAKE_NOACCESS = VG_USERREQ_SKIN_BASE('M','C'),
       VG_USERREQ__MAKE_WRITABLE,
       VG_USERREQ__MAKE_READABLE,
       VG_USERREQ__DISCARD,
Index: memcheck/mc_clientreqs.c
===================================================================
RCS file: /cvsroot/valgrind/valgrind/memcheck/mc_clientreqs.c,v
retrieving revision 1.5
diff -u -r1.5 mc_clientreqs.c
--- memcheck/mc_clientreqs.c	2 Oct 2002 13:26:34 -0000	1.5
+++ memcheck/mc_clientreqs.c	11 Oct 2002 05:46:23 -0000
@@ -288,29 +288,35 @@
 }
 
 
-UInt SK_(handle_client_request) ( ThreadState* tst, UInt* arg_block )
+Bool SK_(handle_client_request) ( ThreadState* tst, UInt* arg_block, UInt *ret )
 {
    Int   i;
    Bool  ok;
    Addr  bad_addr;
    UInt* arg = arg_block;
 
+   if (!VG_IS_SKIN_USERREQ('M','C',arg[0]))
+      return False;
+
    switch (arg[0]) {
       case VG_USERREQ__CHECK_WRITABLE: /* check writable */
          ok = SK_(check_writable) ( arg[1], arg[2], &bad_addr );
          if (!ok)
             SK_(record_user_error) ( tst, bad_addr, True );
-         return ok ? (UInt)NULL : bad_addr;
+         *ret = ok ? (UInt)NULL : bad_addr;
+	 break;
 
       case VG_USERREQ__CHECK_READABLE: /* check readable */
          ok = SK_(check_readable) ( arg[1], arg[2], &bad_addr );
          if (!ok)
             SK_(record_user_error) ( tst, bad_addr, False );
-         return ok ? (UInt)NULL : bad_addr;
+         *ret = ok ? (UInt)NULL : bad_addr;
+	 break;
 
       case VG_USERREQ__DO_LEAK_CHECK:
          SK_(detect_memory_leaks)();
-         return 0; /* return value is meaningless */
+	 *ret = 0; /* return value is meaningless */
+	 break;
 
       case VG_USERREQ__MAKE_NOACCESS: /* make no access */
          i = vg_alloc_client_block();
@@ -320,7 +326,8 @@
          vg_cgbs[i].size  = arg[2];
          vg_cgbs[i].where = VG_(get_ExeContext) ( tst );
          SK_(make_noaccess) ( arg[1], arg[2] );
-         return i;
+	 *ret = i;
+	 break;
 
       case VG_USERREQ__MAKE_WRITABLE: /* make writable */
          i = vg_alloc_client_block();
@@ -329,7 +336,8 @@
          vg_cgbs[i].size  = arg[2];
          vg_cgbs[i].where = VG_(get_ExeContext) ( tst );
          SK_(make_writable) ( arg[1], arg[2] );
-         return i;
+         *ret = i;
+	 break;
 
       case VG_USERREQ__MAKE_READABLE: /* make readable */
          i = vg_alloc_client_block();
@@ -338,8 +346,9 @@
          vg_cgbs[i].size  = arg[2];
          vg_cgbs[i].where = VG_(get_ExeContext) ( tst );
          SK_(make_readable) ( arg[1], arg[2] );
-         return i;
-         
+	 *ret = i;
+         break;
+
       case VG_USERREQ__DISCARD: /* discard */
          if (vg_cgbs == NULL 
              || arg[2] >= vg_cgb_used || vg_cgbs[arg[2]].kind == CG_NotInUse)
@@ -347,18 +356,21 @@
          sk_assert(arg[2] >= 0 && arg[2] < vg_cgb_used);
          vg_cgbs[arg[2]].kind = CG_NotInUse;
          vg_cgb_discards++;
-         return 0;
+	 *ret = 0;
+	 break;
 
       case VG_USERREQ__MAKE_NOACCESS_STACK: /* make noaccess stack block */
          vg_add_client_stack_block ( tst, arg[1], arg[2] );
-         return 0;
+	 *ret = 0;
+	 break;
 
       default:
          VG_(message)(Vg_UserMsg, 
                       "Warning: unknown memcheck client request code %d",
                       arg[0]);
-         return 1;
+         return False;
    }
+   return True;
 }
 
 
