[M3devel] m3tests, pickles

Randy Coleburn rcoleburn at scires.com
Wed Jan 16 13:59:03 CET 2008


Mika:
 
I've used pickles between various platforms in the past.  I use the Pickle2 variant.
 
In my code, I've registered special picklers to deal with mutexes.  Since it doesn't make sense to transfer the state of a mutex between computers, I simply recreate/reinitialize the mutex on the receiving computer.  Here is an example of an interface and a module that defines a type ServerConfig.T that I transfer between computers using Pickle2 and network objects.  I've omitted some of the detail just to show the important stuff about the special pickling definitions and procedures:
 
 
INTERFACE ServerConfig;
 
CONST
   Brand = "ServerConfig"; (* prefix for all branded references *)

TYPE
   T <: Public;
 
   Public = ConfigSettings.T OBJECT
   METHODS
      init (): T;
      (* initialize to default settings *)
      ...
   END; (* Public *)
END ServerConfig.
 
 


MODULE ServerConfig EXPORTS ServerConfig;
 
IMPORT
   Pickle2 AS Pickle;
TYPE
   PrivateMutex = MUTEX BRANDED Brand & ".PrivateMutex" OBJECT END;
REVEAL
   T = Public BRANDED Brand & ".T" OBJECT
      mutex: PrivateMutex := NIL;
      ...
   METHODS
   OVERRIDES
      init := Init;
      ...
   END; (* T *)
 
(*-------------------*)
(* Pickle Procedures *)
(*-------------------*)
 
TYPE
   Special = Pickle.Special OBJECT
   OVERRIDES
      write := WriteSpecial;
      read := ReadSpecial;
   END; (* Special *)
 
PROCEDURE WriteSpecial (self: Special;
                        <*UNUSED*>ref: REFANY;
                        <*UNUSED*>writer: Pickle.Writer
                       )
   RAISES {Pickle.Error,
      <*NOWARN*>Wr.Failure, Thread.Alerted} =
(* Special pickle writer for ServerConfig.PrivateMutex objects. *)
BEGIN (* WriteSpecial *)
   IF self.sc = TYPECODE(PrivateMutex)
   THEN
      (* omit writing the mutex field *)
   ELSE
      RAISE Pickle.Error("ServerConfig.WriteSpecial asked to process unrecognized typecode."); (* should never happen *)
   END; (* if *)
END WriteSpecial;
 
 
 
PROCEDURE ReadSpecial (self: Special;
                       reader: Pickle.Reader;
                       id: Pickle.RefID
                      ): REFANY
   RAISES {Pickle.Error,
      <*NOWARN*>Rd.EndOfFile, Rd.Failure, Thread.Alerted} =
(* Special pickle reader for ServerConfig.PrivateMutex objects. *)
BEGIN (* ReadSpecial *)
   IF self.sc = TYPECODE(PrivateMutex)
   THEN
      WITH m = NEW(PrivateMutex)
      DO
         reader.noteRef(m, id);
         RETURN m;
      END; (* with *)
   ELSE
      RAISE Pickle.Error("ServerConfig.ReadSpecial asked to process unrecognized typecode."); (* should never happen *)
   END; (* if *)
END ReadSpecial;
 
 
 
BEGIN (* ServerConfig module initialization *)
   Pickle.RegisterSpecial(NEW(Special, sc := TYPECODE(PrivateMutex)));
END ServerConfig.

Regards,
Randy

>>> Mika Nystrom <mika at async.caltech.edu> 1/16/2008 3:45 AM >>>

Can I add something tricky to a wish list on regression testing?
Tricky because I don't know the best way to go about it.

I have spent quite some time with various versions of Modula-3
tracking down issues with Pickles.  Usually the problem is that
Pickles aren't transferrable between systems, and it turns out that
I have included some type, somewhere, that doesn't translate.
MUTEX is a good example.  First of all it would be very nice if
such system dependencies were kept out (for instance, don't know
if it's possible, but something like this...)

TYPE RealMutex = OBJECT END;

TYPE WinMutex = RealMutex OBJECT (* windows fields *) END;
TYPE PosixMutex = RealMutex OBJECT (* POSIX fields *) END;

TYPE MUTEX = RealMutex;

and of course all that a client sees is MUTEX which is the same
across systems.

However I realize that what I say above may not be possible or
practical in all cases.

This brings me to the fact that Pickles are sensitive to certain
types of bugs (I think), and it would be very nice to check that
all OS/processor builds of M3 make compatible Pickles, with the
possible exception of things like MUTEX.  Of course this can't be
done within a single build...

     Mika

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20080116/6da59596/attachment-0002.html>


More information about the M3devel mailing list