Subversion Repositories

?revision_form?Rev ?revision_input??revision_submit??revision_endform?

Rev 108 | Blame | Compare with Previous | Last modification | View Log | RSS feed

From: Martin Stjernholm <mast@roxen.com>
Subject: Encode references to all ex-masters as if they are to the current master.

That since we cannot hope to eradicate all references to the old
master when replacing it, and in any case the decoder cannot hope to
find the same ex-master again.

If this creates a problem for someone using replace_master then it's
always possible to clear the is_pike_master variable in the old
master.

--- trunk/lib/master.pike.in    28 Jul 2010 10:29:59 -0000      1.474
+++ cvs/lib/master.pike.in      28 Jul 2010 22:58:01 -0000      1.476
@@ -85,6 +85,13 @@
 //!
 int show_if_constant_errors = 0;
 
+int is_pike_master = 0;
+// This integer variable should exist in any object that aspires to be
+// the master. It gets set to 1 when the master is installed, and is
+// therefore set in any object that is or has been the master. That
+// makes the Encoder class encode references to the master and all
+// ex-masters as references to the current master object.
+
 // ---  Functions begin here.
 
 // Have to access some stuff without going through the resolver.
@@ -5092,6 +5099,11 @@
        }
       }
 
+      else if (what->is_pike_master) {
+       ENC_MSG ("  is a master object\n");
+       ENC_RETURN ("o/master");
+      }
+
       program prog;
       if ((prog = objects_reverse_lookup (what)))
        ENC_MSG ("  found program in objects: %O\n", prog);
--- trunk/src/builtin_functions.c       27 Jul 2010 16:46:01 -0000      1.704
+++ cvs/src/builtin_functions.c 28 Jul 2010 22:51:00 -0000      1.705
@@ -7364,22 +7364,28 @@
  */
 PMOD_EXPORT void f_replace_master(INT32 args)
 {
+  struct object *new_master;
   ASSERT_SECURITY_ROOT("replace_master");
 
   if(!args)
     SIMPLE_TOO_FEW_ARGS_ERROR("replace_master", 1);
   if(Pike_sp[-args].type != T_OBJECT)
     SIMPLE_BAD_ARG_ERROR("replace_master", 1, "object");
-  if(!Pike_sp[-args].u.object->prog)
+  new_master = Pike_sp[-args].u.object;
+  if(!new_master->prog)
     bad_arg_error("replace_master", Pike_sp-args, args, 1, "object", Pike_sp-args,
                  "Called with destructed object.\n");
 
   if (Pike_sp[-args].subtype)
     bad_arg_error("replace_master", Pike_sp-args, args, 1, "object", Pike_sp-args,
                  "Subtyped master objects are not supported yet.\n");
-    
+
+  push_constant_text ("is_pike_master");
+  args++;
+  object_set_index (new_master, 0, Pike_sp - 1, &svalue_int_one);
+
   free_object(master_object);
-  master_object=Pike_sp[-args].u.object;
+  master_object=new_master;
   add_ref(master_object);
 
   free_program(master_program);
--- trunk/src/object.c  11 Jul 2010 10:08:02 -0000      1.310
+++ cvs/src/object.c    28 Jul 2010 22:50:59 -0000      1.311
@@ -658,6 +658,7 @@
   }
 
   {
+    int f;
     ONERROR uwp;
 
     /* fprintf(stderr, "Cloning master...\n"); */
@@ -673,7 +674,11 @@
 
     call_c_initializers(master_object);
     call_pike_initializers(master_object,0);
-  
+
+    f = find_identifier ("is_pike_master", master_program);
+    if (f >= 0)
+      object_low_set_index (master_object, f, &svalue_int_one);
+
     /* fprintf(stderr, "Master loaded.\n"); */
 
     UNSET_ONERROR (uwp);
--- trunk/src/svalue.c  11 Jul 2010 12:39:10 -0000      1.261
+++ cvs/src/svalue.c    28 Jul 2010 22:46:39 -0000      1.262
@@ -30,14 +30,10 @@
 
 #define sp Pike_sp
 
-PMOD_EXPORT const struct svalue svalue_undefined =
+PMOD_EXPORT struct svalue svalue_undefined =
   SVALUE_INIT (T_INT, NUMBER_UNDEFINED, 0);
-PMOD_EXPORT const struct svalue svalue_int_zero = SVALUE_INIT_INT (0);
-#ifdef HAVE_UNION_INIT
-PMOD_EXPORT const struct svalue svalue_int_one = SVALUE_INIT_INT (1);
-#else
+PMOD_EXPORT struct svalue svalue_int_zero = SVALUE_INIT_INT (0);
 PMOD_EXPORT struct svalue svalue_int_one = SVALUE_INIT_INT (1);
-#endif
 
 #ifdef PIKE_DEBUG
 PMOD_EXPORT const char msg_type_error[] =
--- trunk/src/svalue.h  18 Feb 2010 08:52:55 -0000      1.172
+++ cvs/src/svalue.h    28 Jul 2010 22:46:40 -0000      1.173
@@ -323,13 +323,8 @@
 
 #define FUNCTION_BUILTIN USHRT_MAX
 
-extern PMOD_EXPORT const struct svalue svalue_undefined, svalue_int_zero;
-#ifdef HAVE_UNION_INIT
-extern PMOD_EXPORT const struct svalue svalue_int_one;
-#else
-/* The value 1 is initialized first thing in init_pike. */
-extern PMOD_EXPORT struct svalue svalue_int_one;
-#endif
+extern PMOD_EXPORT struct svalue svalue_undefined,
+  svalue_int_zero, svalue_int_one;
 
 #define is_gt(a,b) is_lt(b,a)
 #define is_ge(a,b) is_le(b,a)