-*- Mode: Modula-3 -*-
*
* For information about this program, contact Blair MacIntyre
* (bm@cs.columbia.edu) or Steven Feiner (feiner@cs.columbia.edu)
* at the Computer Science Dept., Columbia University,
* 1214 Amsterdam Ave. Mailstop 0401, New York, NY, 10027.
*
* Copyright (C) 1995, 1996 by The Trustees of Columbia University in the
* City of New York. Blair MacIntyre, Computer Science Department.
* See file COPYRIGHT-COLUMBIA for details.
*
* Author : Blair MacIntyre
* Created On : Wed May 24 10:28:43 1995
* Last Modified By: Blair MacIntyre
* Last Modified On: Thu Jul 9 15:50:09 1998
* Update Count : 456
*
* $Source: /usr/cvs/cm3/doc/help/gen_html/sharedobj/src/SharedObjRT.m3.html,v $
* $Date: 2003/07/16 13:18:01 $
* $Author: wagner $
* $Revision: 1.2 $
*
* $Log: SharedObjRT.m3.html,v $
* Revision 1.2 2003/07/16 13:18:01 wagner
* update generated docs for release 5.2.6
*
* added: doc/PkgDesc
* added: doc/help/gen_html/db/src/DB.m3.html
* added: doc/help/gen_html/db/src/MySQLDB.i3.html
* added: doc/help/gen_html/db/src/MySQLDBStub.m3.html
* added: doc/help/gen_html/db/src/ODBCDB.i3.html
* added: doc/help/gen_html/db/src/PostgreSQLDB.i3.html
* added: doc/help/gen_html/db/src/PostgreSQLDBStub.m3.html
* added: doc/help/gen_html/db/src/odbc/ODBCDB.m3.html
* added: doc/help/gen_html/db/src/odbc/ODBCDBRep.i3.html
* added: doc/help/gen_html/href/I3_231.html
* added: doc/help/gen_html/href/I3_232.html
* added: doc/help/gen_html/href/I3_233.html
* added: doc/help/gen_html/href/I3_234.html
* added: doc/help/gen_html/href/I3_235.html
* added: doc/help/gen_html/href/I3_236.html
* added: doc/help/gen_html/href/I3_237.html
* added: doc/help/gen_html/href/I3_238.html
* added: doc/help/gen_html/href/I3_239.html
* added: doc/help/gen_html/href/I3_240.html
* added: doc/help/gen_html/href/I3_241.html
* added: doc/help/gen_html/href/I3_242.html
* added: doc/help/gen_html/href/I3_243.html
* added: doc/help/gen_html/href/I3_244.html
* added: doc/help/gen_html/href/I3_245.html
* added: doc/help/gen_html/href/I3_246.html
* added: doc/help/gen_html/href/I3_247.html
* added: doc/help/gen_html/href/I3_248.html
* added: doc/help/gen_html/href/I3_249.html
* added: doc/help/gen_html/href/I3_250.html
* added: doc/help/gen_html/href/I3_251.html
* added: doc/help/gen_html/href/I3_252.html
* added: doc/help/gen_html/href/I3_253.html
* added: doc/help/gen_html/href/I3_254.html
* added: doc/help/gen_html/href/I3_255.html
* added: doc/help/gen_html/href/I3_256.html
* added: doc/help/gen_html/href/I3_257.html
* added: doc/help/gen_html/href/I3_258.html
* added: doc/help/gen_html/href/I3_259.html
* added: doc/help/gen_html/href/I3_260.html
* added: doc/help/gen_html/href/I3_261.html
* added: doc/help/gen_html/href/I3_262.html
* added: doc/help/gen_html/href/I3_263.html
* added: doc/help/gen_html/href/I3_264.html
* added: doc/help/gen_html/href/I3_265.html
* added: doc/help/gen_html/href/I3_266.html
* added: doc/help/gen_html/href/I3_267.html
* added: doc/help/gen_html/href/I3_268.html
* added: doc/help/gen_html/href/I3_269.html
* added: doc/help/gen_html/href/I3_270.html
* added: doc/help/gen_html/href/I3_271.html
* added: doc/help/gen_html/href/M3_142.html
* added: doc/help/gen_html/href/M3_143.html
* added: doc/help/gen_html/href/M3_144.html
* added: doc/help/gen_html/href/M3_145.html
* added: doc/help/gen_html/href/M3_146.html
* added: doc/help/gen_html/href/M3_147.html
* added: doc/help/gen_html/href/M3_148.html
* added: doc/help/gen_html/href/M3_149.html
* added: doc/help/gen_html/href/M3_150.html
* added: doc/help/gen_html/href/M3_151.html
* added: doc/help/gen_html/href/M3_152.html
* added: doc/help/gen_html/href/M3_153.html
* added: doc/help/gen_html/href/M3_154.html
* added: doc/help/gen_html/href/M3_155.html
* added: doc/help/gen_html/href/M3_156.html
* added: doc/help/gen_html/href/M3_157.html
* added: doc/help/gen_html/href/M3_158.html
* added: doc/help/gen_html/href/M3_159.html
* added: doc/help/gen_html/href/M3_160.html
* added: doc/help/gen_html/href/M3_161.html
* added: doc/help/gen_html/href/M3_162.html
* added: doc/help/gen_html/href/M3_163.html
* added: doc/help/gen_html/href/M3_164.html
* added: doc/help/gen_html/href/M3_165.html
* added: doc/help/gen_html/href/M3_166.html
* added: doc/help/gen_html/href/M3_167.html
* added: doc/help/gen_html/href/M3_168.html
* added: doc/help/gen_html/href/M3_169.html
* added: doc/help/gen_html/href/M3_170.html
* added: doc/help/gen_html/href/M3_171.html
* added: doc/help/gen_html/href/M3_172.html
* added: doc/help/gen_html/href/M3_173.html
* added: doc/help/gen_html/href/M3_174.html
* added: doc/help/gen_html/href/M3_175.html
* added: doc/help/gen_html/href/M3_176.html
* added: doc/help/gen_html/href/M3_177.html
* added: doc/help/gen_html/href/M3_178.html
* added: doc/help/gen_html/href/M3_179.html
* added: doc/help/gen_html/href/M3_180.html
* added: doc/help/gen_html/href/M3_181.html
* added: doc/help/gen_html/href/M3_182.html
* added: doc/help/gen_html/href/M3_183.html
* added: doc/help/gen_html/href/M3_184.html
* added: doc/help/gen_html/href/M3_185.html
* added: doc/help/gen_html/libm3/src/uid/POSIX/MachineIDPosixC.c.html
* added: doc/help/gen_html/libm3/src/uid/POSIX/MachineIDPosixC.i3.html
* added: doc/help/gen_html/m3core/src/C/Common/CerrnoC.c.html
* added: doc/help/gen_html/m3core/src/unix/linux-libc6/Utermio.i3.html
* added: doc/help/gen_html/m3core/src/unix/linux-libc6-le/Uin.m3.html
* added: doc/help/gen_html/mentor/derived/BinpackAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/BinpackAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/BinpackDataView.i3.html
* added: doc/help/gen_html/mentor/derived/BinpackDataView.m3.html
* added: doc/help/gen_html/mentor/derived/BinpackIE.i3.html
* added: doc/help/gen_html/mentor/derived/BinpackIE.m3.html
* added: doc/help/gen_html/mentor/derived/BinpackTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/BinpackTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/BinpackViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/BinpackViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/BinpackmyviewObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/BinpackmyviewObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/BresenhamAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/BresenhamAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/BresenhamDataView.i3.html
* added: doc/help/gen_html/mentor/derived/BresenhamDataView.m3.html
* added: doc/help/gen_html/mentor/derived/BresenhamIE.i3.html
* added: doc/help/gen_html/mentor/derived/BresenhamIE.m3.html
* added: doc/help/gen_html/mentor/derived/BresenhamTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/BresenhamTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/BresenhamViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/BresenhamViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/CPAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/CPAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/CPDataView.i3.html
* added: doc/help/gen_html/mentor/derived/CPDataView.m3.html
* added: doc/help/gen_html/mentor/derived/CPIE.i3.html
* added: doc/help/gen_html/mentor/derived/CPIE.m3.html
* added: doc/help/gen_html/mentor/derived/CPTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/CPTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/CPViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/CPViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/DGraphAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/DGraphAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/DGraphDataView.i3.html
* added: doc/help/gen_html/mentor/derived/DGraphDataView.m3.html
* added: doc/help/gen_html/mentor/derived/DGraphIE.i3.html
* added: doc/help/gen_html/mentor/derived/DGraphIE.m3.html
* added: doc/help/gen_html/mentor/derived/DGraphTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/DGraphTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/DGraphViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/DGraphViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/EuclidAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/EuclidAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/EuclidDataView.i3.html
* added: doc/help/gen_html/mentor/derived/EuclidDataView.m3.html
* added: doc/help/gen_html/mentor/derived/EuclidIE.i3.html
* added: doc/help/gen_html/mentor/derived/EuclidIE.m3.html
* added: doc/help/gen_html/mentor/derived/EuclidTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/EuclidTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/EuclidViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/EuclidViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/HashAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/HashAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/HashDataView.i3.html
* added: doc/help/gen_html/mentor/derived/HashDataView.m3.html
* added: doc/help/gen_html/mentor/derived/HashIE.i3.html
* added: doc/help/gen_html/mentor/derived/HashIE.m3.html
* added: doc/help/gen_html/mentor/derived/HashTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/HashTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/HashViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/HashViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/HullAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/HullAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/HullDataView.i3.html
* added: doc/help/gen_html/mentor/derived/HullDataView.m3.html
* added: doc/help/gen_html/mentor/derived/HullIE.i3.html
* added: doc/help/gen_html/mentor/derived/HullIE.m3.html
* added: doc/help/gen_html/mentor/derived/HullTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/HullTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/HullViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/HullViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/MatchAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/MatchAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/MatchDataView.i3.html
* added: doc/help/gen_html/mentor/derived/MatchDataView.m3.html
* added: doc/help/gen_html/mentor/derived/MatchIE.i3.html
* added: doc/help/gen_html/mentor/derived/MatchIE.m3.html
* added: doc/help/gen_html/mentor/derived/MatchTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/MatchTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/MatchViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/MatchViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/MaxflowAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/MaxflowAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/MaxflowDataView.i3.html
* added: doc/help/gen_html/mentor/derived/MaxflowDataView.m3.html
* added: doc/help/gen_html/mentor/derived/MaxflowIE.i3.html
* added: doc/help/gen_html/mentor/derived/MaxflowIE.m3.html
* added: doc/help/gen_html/mentor/derived/MaxflowTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/MaxflowTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/MaxflowViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/MaxflowViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/MentorBundle.i3.html
* added: doc/help/gen_html/mentor/derived/MentorBundle.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxDataView.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxDataView.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxIE.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxIE.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewColorScaleObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewColorScaleObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewGameTreeAObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewGameTreeAObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewGameTreeBObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/MinimaxViewGameTreeBObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PQueueAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/PQueueAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/PQueueDataView.i3.html
* added: doc/help/gen_html/mentor/derived/PQueueDataView.m3.html
* added: doc/help/gen_html/mentor/derived/PQueueIE.i3.html
* added: doc/help/gen_html/mentor/derived/PQueueIE.m3.html
* added: doc/help/gen_html/mentor/derived/PQueueTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/PQueueTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/PQueueViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/PQueueViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/ParseAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/ParseAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/ParseDataView.i3.html
* added: doc/help/gen_html/mentor/derived/ParseDataView.m3.html
* added: doc/help/gen_html/mentor/derived/ParseIE.i3.html
* added: doc/help/gen_html/mentor/derived/ParseIE.m3.html
* added: doc/help/gen_html/mentor/derived/ParseTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/ParseTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/ParseViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/ParseViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteDataView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteDataView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteIE.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteIE.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteManyPacketsMoveObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteManyPacketsMoveObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteManyPacketsStepObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteManyPacketsStepObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketMoveObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketMoveObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketRouteObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketRouteObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketStepObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketStepObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketTraceObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRoutePacketTraceObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteQueueSizesObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteQueueSizesObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/PktRouteViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/PktRouteViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/RealList.i3.html
* added: doc/help/gen_html/mentor/derived/RealList.m3.html
* added: doc/help/gen_html/mentor/derived/RealPQ.i3.html
* added: doc/help/gen_html/mentor/derived/RealPQ.m3.html
* added: doc/help/gen_html/mentor/derived/RealPQRep.i3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeDataView.i3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeDataView.m3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeIE.i3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeIE.m3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/SearchTreeViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathDataView.i3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathDataView.m3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathIE.i3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathIE.m3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathSPGraphObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathSPGraphObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/ShortestPathViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/SiteList.i3.html
* added: doc/help/gen_html/mentor/derived/SiteList.m3.html
* added: doc/help/gen_html/mentor/derived/SortAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/SortAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/SortDataView.i3.html
* added: doc/help/gen_html/mentor/derived/SortDataView.m3.html
* added: doc/help/gen_html/mentor/derived/SortIE.i3.html
* added: doc/help/gen_html/mentor/derived/SortIE.m3.html
* added: doc/help/gen_html/mentor/derived/SortTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/SortTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/SortViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/SortViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/StringSearchAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/StringSearchAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/StringSearchDataView.i3.html
* added: doc/help/gen_html/mentor/derived/StringSearchDataView.m3.html
* added: doc/help/gen_html/mentor/derived/StringSearchIE.i3.html
* added: doc/help/gen_html/mentor/derived/StringSearchIE.m3.html
* added: doc/help/gen_html/mentor/derived/StringSearchTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/StringSearchTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/StringSearchViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/StringSearchViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/SubtypeAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/SubtypeAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/SubtypeDataView.i3.html
* added: doc/help/gen_html/mentor/derived/SubtypeDataView.m3.html
* added: doc/help/gen_html/mentor/derived/SubtypeIE.i3.html
* added: doc/help/gen_html/mentor/derived/SubtypeIE.m3.html
* added: doc/help/gen_html/mentor/derived/SubtypeTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/SubtypeTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/SubtypeViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/SubtypeViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/Subtypeview1ObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/Subtypeview1ObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindAverageDepthObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindAverageDepthObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindBigTreeObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindBigTreeObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindChangeParentObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindChangeParentObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindDataView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindDataView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindFindLengthObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindFindLengthObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindIE.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindIE.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindNodeDepthObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindNodeDepthObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindTreeObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindTreeObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/UnionFindViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/UnionFindViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerCompressObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerCompressObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerDataView.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerDataView.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerDecompressObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerDecompressObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerIE.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerIE.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/WheelerWhyDecompressWorksObliqView.i3.html
* added: doc/help/gen_html/mentor/derived/WheelerWhyDecompressWorksObliqView.m3.html
* added: doc/help/gen_html/mentor/derived/ZPaperAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/ZPaperAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/ZPaperDataView.i3.html
* added: doc/help/gen_html/mentor/derived/ZPaperDataView.m3.html
* added: doc/help/gen_html/mentor/derived/ZPaperIE.i3.html
* added: doc/help/gen_html/mentor/derived/ZPaperIE.m3.html
* added: doc/help/gen_html/mentor/derived/ZPaperTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/ZPaperTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/ZPaperViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/ZPaperViewClass.m3.html
* added: doc/help/gen_html/mentor/derived/logoAlgClass.i3.html
* added: doc/help/gen_html/mentor/derived/logoAlgClass.m3.html
* added: doc/help/gen_html/mentor/derived/logoDataView.i3.html
* added: doc/help/gen_html/mentor/derived/logoDataView.m3.html
* added: doc/help/gen_html/mentor/derived/logoIE.i3.html
* added: doc/help/gen_html/mentor/derived/logoIE.m3.html
* added: doc/help/gen_html/mentor/derived/logoTranscriptView.i3.html
* added: doc/help/gen_html/mentor/derived/logoTranscriptView.m3.html
* added: doc/help/gen_html/mentor/derived/logoViewClass.i3.html
* added: doc/help/gen_html/mentor/derived/logoViewClass.m3.html
* added: doc/help/gen_html/mentor/src/Main.m3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFF.i3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFF.m3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFFCodeView.i3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFFCodeView.m3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFFPromptForWeights.i3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFFPromptForWeights.m3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFFSimple.i3.html
* added: doc/help/gen_html/mentor/src/binpack/AlgFFSimple.m3.html
* added: doc/help/gen_html/mentor/src/binpack/BinpackAux.i3.html
* added: doc/help/gen_html/mentor/src/binpack/BinpackAux.m3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView1.i3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView1.m3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView2.i3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView2.m3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView3.i3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView3.m3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView4.i3.html
* added: doc/help/gen_html/mentor/src/binpack/PackingView4.m3.html
* added: doc/help/gen_html/mentor/src/bresenham/AlgBresenham.i3.html
* added: doc/help/gen_html/mentor/src/bresenham/AlgBresenham.m3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewError.i3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewError.m3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewIncrementalReal.i3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewIncrementalReal.m3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewLine.i3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewLine.m3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewOnlyLine.i3.html
* added: doc/help/gen_html/mentor/src/bresenham/ViewOnlyLine.m3.html
* added: doc/help/gen_html/mentor/src/closestpoint/CPAlg.i3.html
* added: doc/help/gen_html/mentor/src/closestpoint/CPAlg.m3.html
* added: doc/help/gen_html/mentor/src/closestpoint/CPView.i3.html
* added: doc/help/gen_html/mentor/src/closestpoint/CPView.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrix.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrix.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixVBT.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixVBT.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixView.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixView.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixView01.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixView01.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixView01_K.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/AdjMatrixView01_K.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/DFS.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/DFS.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/DFSTC.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/DFSTC.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/DFSTreeView.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/DFSTreeView.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/DepthToColor.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/DepthToColor.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/GraphView.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/GraphView.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/GridMJJ.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/GridMJJ.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/ReadGraph.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/ReadGraph.m3.html
* added: doc/help/gen_html/mentor/src/dgraph/Warshall.i3.html
* added: doc/help/gen_html/mentor/src/dgraph/Warshall.m3.html
* added: doc/help/gen_html/mentor/src/euclid/Euclid.i3.html
* added: doc/help/gen_html/mentor/src/euclid/EuclidAlg.m3.html
* added: doc/help/gen_html/mentor/src/euclid/EuclidView.m3.html
* added: doc/help/gen_html/mentor/src/hash/HashAlgs.i3.html
* added: doc/help/gen_html/mentor/src/hash/HashAlgs.m3.html
* added: doc/help/gen_html/mentor/src/hash/HashFmt.i3.html
* added: doc/help/gen_html/mentor/src/hash/HashFmt.m3.html
* added: doc/help/gen_html/mentor/src/hash/HashStatsView.i3.html
* added: doc/help/gen_html/mentor/src/hash/HashStatsView.m3.html
* added: doc/help/gen_html/mentor/src/hash/HashViews.i3.html
* added: doc/help/gen_html/mentor/src/hash/HashViews.m3.html
* added: doc/help/gen_html/mentor/src/hull/AlgTypes.i3.html
* added: doc/help/gen_html/mentor/src/hull/AlgTypes.m3.html
* added: doc/help/gen_html/mentor/src/hull/ArrayView.i3.html
* added: doc/help/gen_html/mentor/src/hull/ArrayView.m3.html
* added: doc/help/gen_html/mentor/src/hull/GeomView.i3.html
* added: doc/help/gen_html/mentor/src/hull/GeomView.m3.html
* added: doc/help/gen_html/mentor/src/hull/HullFmt.i3.html
* added: doc/help/gen_html/mentor/src/hull/HullFmt.m3.html
* added: doc/help/gen_html/mentor/src/hull/HullInput.i3.html
* added: doc/help/gen_html/mentor/src/hull/HullInput.m3.html
* added: doc/help/gen_html/mentor/src/hull/MyColors.i3.html
* added: doc/help/gen_html/mentor/src/hull/MyColors.m3.html
* added: doc/help/gen_html/mentor/src/hull/RubberAlg.i3.html
* added: doc/help/gen_html/mentor/src/hull/RubberAlg.m3.html
* added: doc/help/gen_html/mentor/src/hull/Site.i3.html
* added: doc/help/gen_html/mentor/src/hull/Site.m3.html
* added: doc/help/gen_html/mentor/src/hull/WrapAlg.i3.html
* added: doc/help/gen_html/mentor/src/hull/WrapAlg.m3.html
* added: doc/help/gen_html/mentor/src/kpaths/AtomEdgeTbl.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/AtomEdgeTbl.m3.html
* added: doc/help/gen_html/mentor/src/kpaths/AtomVertexTbl.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/AtomVertexTbl.m3.html
* added: doc/help/gen_html/mentor/src/kpaths/Edge.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/EdgeSeq.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/EdgeSeq.m3.html
* added: doc/help/gen_html/mentor/src/kpaths/EdgeSeqRep.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/ShortestPath.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/ShortestPath.m3.html
* added: doc/help/gen_html/mentor/src/kpaths/Vertex.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/VertexSeq.i3.html
* added: doc/help/gen_html/mentor/src/kpaths/VertexSeq.m3.html
* added: doc/help/gen_html/mentor/src/kpaths/VertexSeqRep.i3.html
* added: doc/help/gen_html/mentor/src/logo/Logo.i3.html
* added: doc/help/gen_html/mentor/src/logo/Logo.m3.html
* added: doc/help/gen_html/mentor/src/match/AlgMatch.i3.html
* added: doc/help/gen_html/mentor/src/match/AlgMatch.m3.html
* added: doc/help/gen_html/mentor/src/match/Match.i3.html
* added: doc/help/gen_html/mentor/src/match/Match.m3.html
* added: doc/help/gen_html/mentor/src/match/MatchRect.i3.html
* added: doc/help/gen_html/mentor/src/match/MatchSelector.i3.html
* added: doc/help/gen_html/mentor/src/match/MatchSelector.m3.html
* added: doc/help/gen_html/mentor/src/match/ViewMatch.i3.html
* added: doc/help/gen_html/mentor/src/match/ViewMatch.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFAlgs.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFAlgs.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFBarView.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFBarView.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFEdgeView.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFEdgeView.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFFmt.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFFmt.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFGraph.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFGraph.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFLegendView.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFLegendView.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFViews.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFViews.m3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFViews2.i3.html
* added: doc/help/gen_html/mentor/src/maxflow/MFViews2.m3.html
* added: doc/help/gen_html/mentor/src/minimax/AlgMinimax.i3.html
* added: doc/help/gen_html/mentor/src/minimax/AlgMinimax.m3.html
* added: doc/help/gen_html/mentor/src/minimax/GameBoard.i3.html
* added: doc/help/gen_html/mentor/src/minimax/GameBoard.m3.html
* added: doc/help/gen_html/mentor/src/minimax/GameBoardPrivate.i3.html
* added: doc/help/gen_html/mentor/src/minimax/GameMove.i3.html
* added: doc/help/gen_html/mentor/src/minimax/GameMove.m3.html
* added: doc/help/gen_html/mentor/src/minimax/GamePlay.i3.html
* added: doc/help/gen_html/mentor/src/minimax/GamePlay.m3.html
* added: doc/help/gen_html/mentor/src/minimax/HumanPlayer.i3.html
* added: doc/help/gen_html/mentor/src/minimax/HumanPlayer.m3.html
* added: doc/help/gen_html/mentor/src/minimax/Minimax.i3.html
* added: doc/help/gen_html/mentor/src/minimax/Minimax.m3.html
* added: doc/help/gen_html/mentor/src/minimax/MoveList.i3.html
* added: doc/help/gen_html/mentor/src/minimax/MoveList.m3.html
* added: doc/help/gen_html/mentor/src/minimax/TypeFmt.i3.html
* added: doc/help/gen_html/mentor/src/minimax/TypeFmt.m3.html
* added: doc/help/gen_html/mentor/src/minimax/ViewGameBoard.i3.html
* added: doc/help/gen_html/mentor/src/minimax/ViewGameBoard.m3.html
* added: doc/help/gen_html/mentor/src/parse/A_BottomUp.i3.html
* added: doc/help/gen_html/mentor/src/parse/A_BottomUp.m3.html
* added: doc/help/gen_html/mentor/src/parse/A_RecDescent.i3.html
* added: doc/help/gen_html/mentor/src/parse/A_RecDescent.m3.html
* added: doc/help/gen_html/mentor/src/parse/A_TopDown.i3.html
* added: doc/help/gen_html/mentor/src/parse/A_TopDown.m3.html
* added: doc/help/gen_html/mentor/src/parse/Parse.i3.html
* added: doc/help/gen_html/mentor/src/parse/Parse.m3.html
* added: doc/help/gen_html/mentor/src/parse/ParseColor.i3.html
* added: doc/help/gen_html/mentor/src/parse/ParseColor.m3.html
* added: doc/help/gen_html/mentor/src/parse/Token.i3.html
* added: doc/help/gen_html/mentor/src/parse/Token.m3.html
* added: doc/help/gen_html/mentor/src/parse/V_Input.i3.html
* added: doc/help/gen_html/mentor/src/parse/V_Input.m3.html
* added: doc/help/gen_html/mentor/src/parse/V_Stack.i3.html
* added: doc/help/gen_html/mentor/src/parse/V_Stack.m3.html
* added: doc/help/gen_html/mentor/src/parse/V_Tree.i3.html
* added: doc/help/gen_html/mentor/src/parse/V_Tree.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/ASP.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/ASP.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/AlgGreedy.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/AlgGreedy.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/AlgTwoPhase.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/AlgTwoPhase.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/Graph.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/Graph.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/GraphRep.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/IntListUtils.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/IntListUtils.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/MakePackets.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/MakePackets.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/MyReal.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/MyReal.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/OblFmt.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/OblFmt.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/ObliqExtension.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/ObliqExtension.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/Packet.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/Packet.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/PacketRep.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/RefIntArray.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/RefIntArray.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/Topology.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/Topology.m3.html
* added: doc/help/gen_html/mentor/src/pktroute/VertexSizeAnim.i3.html
* added: doc/help/gen_html/mentor/src/pktroute/VertexSizeAnim.m3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQAlgs.i3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQAlgs.m3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQBarView.i3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQBarView.m3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQViews.i3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQViews.m3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQueue.i3.html
* added: doc/help/gen_html/mentor/src/pqueue/PQueue.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/BSTAlg.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/BSTAlg.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/BSTView.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/BSTView.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/RedBlackAlg.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/RedBlackAlg.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/STView.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/STView.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/SkelView.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/SkelView.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/SkinnyBinTree.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/SkinnyBinTree.m3.html
* added: doc/help/gen_html/mentor/src/searchtree/UnbalancedAlg.i3.html
* added: doc/help/gen_html/mentor/src/searchtree/UnbalancedAlg.m3.html
* added: doc/help/gen_html/mentor/src/sorting/ChipsView.i3.html
* added: doc/help/gen_html/mentor/src/sorting/ChipsView.m3.html
* added: doc/help/gen_html/mentor/src/sorting/DotsView.i3.html
* added: doc/help/gen_html/mentor/src/sorting/DotsView.m3.html
* added: doc/help/gen_html/mentor/src/sorting/Sort.i3.html
* added: doc/help/gen_html/mentor/src/sorting/SortAlgs.i3.html
* added: doc/help/gen_html/mentor/src/sorting/SortAlgs.m3.html
* added: doc/help/gen_html/mentor/src/sorting/SticksView.i3.html
* added: doc/help/gen_html/mentor/src/sorting/SticksView.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/AlgsBase.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/AlgsBase.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/AutoView.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/AutoView.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/BM.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/BM.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/BruteForce.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/BruteForce.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/KMP.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/KMP.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/PrefixView.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/PrefixView.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/SliderView.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/SliderView.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/TextView.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/TextView.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/TouchView.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/TouchView.m3.html
* added: doc/help/gen_html/mentor/src/stringsearch/ViewsBase.i3.html
* added: doc/help/gen_html/mentor/src/stringsearch/ViewsBase.m3.html
* added: doc/help/gen_html/mentor/src/subtype/AlgSubtype.i3.html
* added: doc/help/gen_html/mentor/src/subtype/AlgSubtype.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgBoth.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgBoth.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgCompress.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgCompress.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgList.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgList.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgQuickFind.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgQuickFind.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgSimple.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgSimple.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgUnionByRank.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/AlgUnionByRank.m3.html
* added: doc/help/gen_html/mentor/src/unionfind/TreeNode.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/UFInput.i3.html
* added: doc/help/gen_html/mentor/src/unionfind/UFInput.m3.html
* added: doc/help/gen_html/mentor/src/wheeler/CharArraySort.i3.html
* added: doc/help/gen_html/mentor/src/wheeler/CharArraySort.m3.html
* added: doc/help/gen_html/mentor/src/wheeler/MiscFmt.i3.html
* added: doc/help/gen_html/mentor/src/wheeler/MiscFmt.m3.html
* added: doc/help/gen_html/mentor/src/wheeler/Wheeler.i3.html
* added: doc/help/gen_html/mentor/src/wheeler/Wheeler.m3.html
* added: doc/help/gen_html/mentor/src/zpaper/AlgFn.i3.html
* added: doc/help/gen_html/mentor/src/zpaper/AlgFn.m3.html
* added: doc/help/gen_html/mentor/src/zpaper/Fn.i3.html
* added: doc/help/gen_html/mentor/src/zpaper/ViewFn.i3.html
* added: doc/help/gen_html/mentor/src/zpaper/ViewFn.m3.html
* added: doc/help/gen_html/mentor/src/zpaper/ViewHisto.i3.html
* added: doc/help/gen_html/mentor/src/zpaper/ViewHisto.m3.html
* added: doc/help/gen_html/mentor/src/zpaper/ViewMFn.i3.html
* added: doc/help/gen_html/mentor/src/zpaper/ViewMFn.m3.html
* added: doc/help/gen_html/tcp/src/POSIX/HerrnoC.c.html
* modified: doc/help/gen_html/INDEX.html
* modified: doc/help/gen_html/m3db
* modified: doc/help/gen_html/cm3/src/Builder.m3.html
* modified: doc/help/gen_html/cm3/src/Dirs.m3.html
* modified: doc/help/gen_html/cm3/src/M3Build.m3.html
* modified: doc/help/gen_html/cm3/src/Makefile.m3.html
* modified: doc/help/gen_html/cm3/src/Msg.i3.html
* modified: doc/help/gen_html/cm3/src/Msg.m3.html
* modified: doc/help/gen_html/db/src/DB.i3.html
* modified: doc/help/gen_html/debug/src/Debug.i3.html
* modified: doc/help/gen_html/debug/src/Debug.m3.html
* modified: doc/help/gen_html/embutils/src/EmbProxiedObj.m3.html
* modified: doc/help/gen_html/events/src/Event.i3.html
* modified: doc/help/gen_html/events/src/Event.m3.html
* modified: doc/help/gen_html/events/src/EventConn.i3.html
* modified: doc/help/gen_html/events/src/EventConn.m3.html
* modified: doc/help/gen_html/events/src/EventCounter.i3.html
* modified: doc/help/gen_html/events/src/EventCounter.m3.html
* modified: doc/help/gen_html/events/src/EventHandle.i3.html
* modified: doc/help/gen_html/events/src/EventIO.i3.html
* modified: doc/help/gen_html/events/src/EventNumber.i3.html
* modified: doc/help/gen_html/events/src/EventNumber.m3.html
* modified: doc/help/gen_html/events/src/EventNumberF.i3.html
* modified: doc/help/gen_html/events/src/EventPort.i3.html
* modified: doc/help/gen_html/events/src/EventPort.m3.html
* modified: doc/help/gen_html/events/src/EventProtocol.i3.html
* modified: doc/help/gen_html/events/src/EventRd.i3.html
* modified: doc/help/gen_html/events/src/EventRd.m3.html
* modified: doc/help/gen_html/events/src/EventSpaceID.i3.html
* modified: doc/help/gen_html/events/src/EventSpaceID.m3.html
* modified: doc/help/gen_html/events/src/EventStubLib.i3.html
* modified: doc/help/gen_html/events/src/EventStubLib.m3.html
* modified: doc/help/gen_html/events/src/EventWireRep.i3.html
* modified: doc/help/gen_html/events/src/EventWireRep.m3.html
* modified: doc/help/gen_html/events/src/EventWr.i3.html
* modified: doc/help/gen_html/events/src/EventWr.m3.html
* modified: doc/help/gen_html/events/src/EventWrF.i3.html
* modified: doc/help/gen_html/events/src/HostInfo.i3.html
* modified: doc/help/gen_html/events/src/HostInfo.m3.html
* modified: doc/help/gen_html/events/src/RdWrMutex.i3.html
* modified: doc/help/gen_html/events/src/RdWrMutex.m3.html
* modified: doc/help/gen_html/events/src/Work.i3.html
* modified: doc/help/gen_html/events/src/WorkerPool.i3.html
* modified: doc/help/gen_html/events/src/WorkerPool.m3.html
* modified: doc/help/gen_html/events/src/Zombie.i3.html
* modified: doc/help/gen_html/fisheye/derived/FisheyeBundle.m3.html
* modified: doc/help/gen_html/formsedit/derived/formseditBundle.m3.html
* modified: doc/help/gen_html/href/I3_1.html
* modified: doc/help/gen_html/href/I3_10.html
* modified: doc/help/gen_html/href/I3_100.html
* modified: doc/help/gen_html/href/I3_101.html
* modified: doc/help/gen_html/href/I3_102.html
* modified: doc/help/gen_html/href/I3_103.html
* modified: doc/help/gen_html/href/I3_104.html
* modified: doc/help/gen_html/href/I3_105.html
* modified: doc/help/gen_html/href/I3_106.html
* modified: doc/help/gen_html/href/I3_107.html
* modified: doc/help/gen_html/href/I3_108.html
* modified: doc/help/gen_html/href/I3_109.html
* modified: doc/help/gen_html/href/I3_11.html
* modified: doc/help/gen_html/href/I3_110.html
* modified: doc/help/gen_html/href/I3_111.html
* modified: doc/help/gen_html/href/I3_112.html
* modified: doc/help/gen_html/href/I3_113.html
* modified: doc/help/gen_html/href/I3_114.html
* modified: doc/help/gen_html/href/I3_115.html
* modified: doc/help/gen_html/href/I3_116.html
* modified: doc/help/gen_html/href/I3_117.html
* modified: doc/help/gen_html/href/I3_118.html
* modified: doc/help/gen_html/href/I3_119.html
* modified: doc/help/gen_html/href/I3_12.html
* modified: doc/help/gen_html/href/I3_120.html
* modified: doc/help/gen_html/href/I3_121.html
* modified: doc/help/gen_html/href/I3_122.html
* modified: doc/help/gen_html/href/I3_123.html
* modified: doc/help/gen_html/href/I3_124.html
* modified: doc/help/gen_html/href/I3_125.html
* modified: doc/help/gen_html/href/I3_126.html
* modified: doc/help/gen_html/href/I3_127.html
* modified: doc/help/gen_html/href/I3_128.html
* modified: doc/help/gen_html/href/I3_129.html
* modified: doc/help/gen_html/href/I3_130.html
* modified: doc/help/gen_html/href/I3_131.html
* modified: doc/help/gen_html/href/I3_132.html
* modified: doc/help/gen_html/href/I3_133.html
* modified: doc/help/gen_html/href/I3_134.html
* modified: doc/help/gen_html/href/I3_135.html
* modified: doc/help/gen_html/href/I3_136.html
* modified: doc/help/gen_html/href/I3_137.html
* modified: doc/help/gen_html/href/I3_138.html
* modified: doc/help/gen_html/href/I3_139.html
* modified: doc/help/gen_html/href/I3_14.html
* modified: doc/help/gen_html/href/I3_140.html
* modified: doc/help/gen_html/href/I3_141.html
* modified: doc/help/gen_html/href/I3_142.html
* modified: doc/help/gen_html/href/I3_143.html
* modified: doc/help/gen_html/href/I3_144.html
* modified: doc/help/gen_html/href/I3_145.html
* modified: doc/help/gen_html/href/I3_146.html
* modified: doc/help/gen_html/href/I3_147.html
* modified: doc/help/gen_html/href/I3_148.html
* modified: doc/help/gen_html/href/I3_149.html
* modified: doc/help/gen_html/href/I3_150.html
* modified: doc/help/gen_html/href/I3_151.html
* modified: doc/help/gen_html/href/I3_152.html
* modified: doc/help/gen_html/href/I3_153.html
* modified: doc/help/gen_html/href/I3_154.html
* modified: doc/help/gen_html/href/I3_155.html
* modified: doc/help/gen_html/href/I3_156.html
* modified: doc/help/gen_html/href/I3_157.html
* modified: doc/help/gen_html/href/I3_158.html
* modified: doc/help/gen_html/href/I3_159.html
* modified: doc/help/gen_html/href/I3_160.html
* modified: doc/help/gen_html/href/I3_161.html
* modified: doc/help/gen_html/href/I3_162.html
* modified: doc/help/gen_html/href/I3_163.html
* modified: doc/help/gen_html/href/I3_164.html
* modified: doc/help/gen_html/href/I3_165.html
* modified: doc/help/gen_html/href/I3_166.html
* modified: doc/help/gen_html/href/I3_167.html
* modified: doc/help/gen_html/href/I3_168.html
* modified: doc/help/gen_html/href/I3_169.html
* modified: doc/help/gen_html/href/I3_17.html
* modified: doc/help/gen_html/href/I3_170.html
* modified: doc/help/gen_html/href/I3_171.html
* modified: doc/help/gen_html/href/I3_172.html
* modified: doc/help/gen_html/href/I3_173.html
* modified: doc/help/gen_html/href/I3_174.html
* modified: doc/help/gen_html/href/I3_175.html
* modified: doc/help/gen_html/href/I3_176.html
* modified: doc/help/gen_html/href/I3_177.html
* modified: doc/help/gen_html/href/I3_178.html
* modified: doc/help/gen_html/href/I3_179.html
* modified: doc/help/gen_html/href/I3_18.html
* modified: doc/help/gen_html/href/I3_180.html
* modified: doc/help/gen_html/href/I3_181.html
* modified: doc/help/gen_html/href/I3_182.html
* modified: doc/help/gen_html/href/I3_183.html
* modified: doc/help/gen_html/href/I3_184.html
* modified: doc/help/gen_html/href/I3_185.html
* modified: doc/help/gen_html/href/I3_186.html
* modified: doc/help/gen_html/href/I3_187.html
* modified: doc/help/gen_html/href/I3_188.html
* modified: doc/help/gen_html/href/I3_189.html
* modified: doc/help/gen_html/href/I3_19.html
* modified: doc/help/gen_html/href/I3_190.html
* modified: doc/help/gen_html/href/I3_191.html
* modified: doc/help/gen_html/href/I3_192.html
* modified: doc/help/gen_html/href/I3_193.html
* modified: doc/help/gen_html/href/I3_194.html
* modified: doc/help/gen_html/href/I3_195.html
* modified: doc/help/gen_html/href/I3_196.html
* modified: doc/help/gen_html/href/I3_197.html
* modified: doc/help/gen_html/href/I3_198.html
* modified: doc/help/gen_html/href/I3_199.html
* modified: doc/help/gen_html/href/I3_20.html
* modified: doc/help/gen_html/href/I3_200.html
* modified: doc/help/gen_html/href/I3_201.html
* modified: doc/help/gen_html/href/I3_202.html
* modified: doc/help/gen_html/href/I3_203.html
* modified: doc/help/gen_html/href/I3_204.html
* modified: doc/help/gen_html/href/I3_205.html
* modified: doc/help/gen_html/href/I3_206.html
* modified: doc/help/gen_html/href/I3_207.html
* modified: doc/help/gen_html/href/I3_208.html
* modified: doc/help/gen_html/href/I3_209.html
* modified: doc/help/gen_html/href/I3_210.html
* modified: doc/help/gen_html/href/I3_211.html
* modified: doc/help/gen_html/href/I3_212.html
* modified: doc/help/gen_html/href/I3_213.html
* modified: doc/help/gen_html/href/I3_214.html
* modified: doc/help/gen_html/href/I3_215.html
* modified: doc/help/gen_html/href/I3_216.html
* modified: doc/help/gen_html/href/I3_217.html
* modified: doc/help/gen_html/href/I3_218.html
* modified: doc/help/gen_html/href/I3_219.html
* modified: doc/help/gen_html/href/I3_220.html
* modified: doc/help/gen_html/href/I3_221.html
* modified: doc/help/gen_html/href/I3_222.html
* modified: doc/help/gen_html/href/I3_223.html
* modified: doc/help/gen_html/href/I3_224.html
* modified: doc/help/gen_html/href/I3_225.html
* modified: doc/help/gen_html/href/I3_226.html
* modified: doc/help/gen_html/href/I3_227.html
* modified: doc/help/gen_html/href/I3_228.html
* modified: doc/help/gen_html/href/I3_229.html
* modified: doc/help/gen_html/href/I3_230.html
* modified: doc/help/gen_html/href/I3_25.html
* modified: doc/help/gen_html/href/I3_26.html
* modified: doc/help/gen_html/href/I3_27.html
* modified: doc/help/gen_html/href/I3_28.html
* modified: doc/help/gen_html/href/I3_29.html
* modified: doc/help/gen_html/href/I3_30.html
* modified: doc/help/gen_html/href/I3_31.html
* modified: doc/help/gen_html/href/I3_32.html
* modified: doc/help/gen_html/href/I3_33.html
* modified: doc/help/gen_html/href/I3_34.html
* modified: doc/help/gen_html/href/I3_35.html
* modified: doc/help/gen_html/href/I3_36.html
* modified: doc/help/gen_html/href/I3_37.html
* modified: doc/help/gen_html/href/I3_38.html
* modified: doc/help/gen_html/href/I3_39.html
* modified: doc/help/gen_html/href/I3_40.html
* modified: doc/help/gen_html/href/I3_41.html
* modified: doc/help/gen_html/href/I3_42.html
* modified: doc/help/gen_html/href/I3_43.html
* modified: doc/help/gen_html/href/I3_44.html
* modified: doc/help/gen_html/href/I3_45.html
* modified: doc/help/gen_html/href/I3_46.html
* modified: doc/help/gen_html/href/I3_47.html
* modified: doc/help/gen_html/href/I3_48.html
* modified: doc/help/gen_html/href/I3_49.html
* modified: doc/help/gen_html/href/I3_5.html
* modified: doc/help/gen_html/href/I3_50.html
* modified: doc/help/gen_html/href/I3_51.html
* modified: doc/help/gen_html/href/I3_52.html
* modified: doc/help/gen_html/href/I3_53.html
* modified: doc/help/gen_html/href/I3_54.html
* modified: doc/help/gen_html/href/I3_55.html
* modified: doc/help/gen_html/href/I3_56.html
* modified: doc/help/gen_html/href/I3_57.html
* modified: doc/help/gen_html/href/I3_58.html
* modified: doc/help/gen_html/href/I3_59.html
* modified: doc/help/gen_html/href/I3_60.html
* modified: doc/help/gen_html/href/I3_61.html
* modified: doc/help/gen_html/href/I3_62.html
* modified: doc/help/gen_html/href/I3_63.html
* modified: doc/help/gen_html/href/I3_64.html
* modified: doc/help/gen_html/href/I3_65.html
* modified: doc/help/gen_html/href/I3_66.html
* modified: doc/help/gen_html/href/I3_67.html
* modified: doc/help/gen_html/href/I3_68.html
* modified: doc/help/gen_html/href/I3_69.html
* modified: doc/help/gen_html/href/I3_70.html
* modified: doc/help/gen_html/href/I3_71.html
* modified: doc/help/gen_html/href/I3_72.html
* modified: doc/help/gen_html/href/I3_73.html
* modified: doc/help/gen_html/href/I3_74.html
* modified: doc/help/gen_html/href/I3_75.html
* modified: doc/help/gen_html/href/I3_76.html
* modified: doc/help/gen_html/href/I3_77.html
* modified: doc/help/gen_html/href/I3_78.html
* modified: doc/help/gen_html/href/I3_79.html
* modified: doc/help/gen_html/href/I3_80.html
* modified: doc/help/gen_html/href/I3_81.html
* modified: doc/help/gen_html/href/I3_82.html
* modified: doc/help/gen_html/href/I3_83.html
* modified: doc/help/gen_html/href/I3_84.html
* modified: doc/help/gen_html/href/I3_85.html
* modified: doc/help/gen_html/href/I3_86.html
* modified: doc/help/gen_html/href/I3_87.html
* modified: doc/help/gen_html/href/I3_88.html
* modified: doc/help/gen_html/href/I3_89.html
* modified: doc/help/gen_html/href/I3_9.html
* modified: doc/help/gen_html/href/I3_90.html
* modified: doc/help/gen_html/href/I3_91.html
* modified: doc/help/gen_html/href/I3_92.html
* modified: doc/help/gen_html/href/I3_93.html
* modified: doc/help/gen_html/href/I3_94.html
* modified: doc/help/gen_html/href/I3_95.html
* modified: doc/help/gen_html/href/I3_96.html
* modified: doc/help/gen_html/href/I3_97.html
* modified: doc/help/gen_html/href/I3_98.html
* modified: doc/help/gen_html/href/I3_99.html
* modified: doc/help/gen_html/href/M3_10.html
* modified: doc/help/gen_html/href/M3_100.html
* modified: doc/help/gen_html/href/M3_101.html
* modified: doc/help/gen_html/href/M3_102.html
* modified: doc/help/gen_html/href/M3_103.html
* modified: doc/help/gen_html/href/M3_104.html
* modified: doc/help/gen_html/href/M3_105.html
* modified: doc/help/gen_html/href/M3_106.html
* modified: doc/help/gen_html/href/M3_107.html
* modified: doc/help/gen_html/href/M3_108.html
* modified: doc/help/gen_html/href/M3_109.html
* modified: doc/help/gen_html/href/M3_11.html
* modified: doc/help/gen_html/href/M3_110.html
* modified: doc/help/gen_html/href/M3_111.html
* modified: doc/help/gen_html/href/M3_112.html
* modified: doc/help/gen_html/href/M3_113.html
* modified: doc/help/gen_html/href/M3_114.html
* modified: doc/help/gen_html/href/M3_115.html
* modified: doc/help/gen_html/href/M3_116.html
* modified: doc/help/gen_html/href/M3_117.html
* modified: doc/help/gen_html/href/M3_118.html
* modified: doc/help/gen_html/href/M3_119.html
* modified: doc/help/gen_html/href/M3_12.html
* modified: doc/help/gen_html/href/M3_120.html
* modified: doc/help/gen_html/href/M3_121.html
* modified: doc/help/gen_html/href/M3_122.html
* modified: doc/help/gen_html/href/M3_123.html
* modified: doc/help/gen_html/href/M3_124.html
* modified: doc/help/gen_html/href/M3_125.html
* modified: doc/help/gen_html/href/M3_126.html
* modified: doc/help/gen_html/href/M3_127.html
* modified: doc/help/gen_html/href/M3_128.html
* modified: doc/help/gen_html/href/M3_129.html
* modified: doc/help/gen_html/href/M3_13.html
* modified: doc/help/gen_html/href/M3_130.html
* modified: doc/help/gen_html/href/M3_131.html
* modified: doc/help/gen_html/href/M3_132.html
* modified: doc/help/gen_html/href/M3_133.html
* modified: doc/help/gen_html/href/M3_134.html
* modified: doc/help/gen_html/href/M3_135.html
* modified: doc/help/gen_html/href/M3_136.html
* modified: doc/help/gen_html/href/M3_137.html
* modified: doc/help/gen_html/href/M3_138.html
* modified: doc/help/gen_html/href/M3_139.html
* modified: doc/help/gen_html/href/M3_14.html
* modified: doc/help/gen_html/href/M3_140.html
* modified: doc/help/gen_html/href/M3_141.html
* modified: doc/help/gen_html/href/M3_15.html
* modified: doc/help/gen_html/href/M3_16.html
* modified: doc/help/gen_html/href/M3_17.html
* modified: doc/help/gen_html/href/M3_18.html
* modified: doc/help/gen_html/href/M3_19.html
* modified: doc/help/gen_html/href/M3_20.html
* modified: doc/help/gen_html/href/M3_21.html
* modified: doc/help/gen_html/href/M3_22.html
* modified: doc/help/gen_html/href/M3_23.html
* modified: doc/help/gen_html/href/M3_24.html
* modified: doc/help/gen_html/href/M3_25.html
* modified: doc/help/gen_html/href/M3_26.html
* modified: doc/help/gen_html/href/M3_27.html
* modified: doc/help/gen_html/href/M3_28.html
* modified: doc/help/gen_html/href/M3_29.html
* modified: doc/help/gen_html/href/M3_3.html
* modified: doc/help/gen_html/href/M3_30.html
* modified: doc/help/gen_html/href/M3_31.html
* modified: doc/help/gen_html/href/M3_32.html
* modified: doc/help/gen_html/href/M3_33.html
* modified: doc/help/gen_html/href/M3_34.html
* modified: doc/help/gen_html/href/M3_35.html
* modified: doc/help/gen_html/href/M3_36.html
* modified: doc/help/gen_html/href/M3_37.html
* modified: doc/help/gen_html/href/M3_38.html
* modified: doc/help/gen_html/href/M3_39.html
* modified: doc/help/gen_html/href/M3_40.html
* modified: doc/help/gen_html/href/M3_41.html
* modified: doc/help/gen_html/href/M3_42.html
* modified: doc/help/gen_html/href/M3_43.html
* modified: doc/help/gen_html/href/M3_44.html
* modified: doc/help/gen_html/href/M3_45.html
* modified: doc/help/gen_html/href/M3_46.html
* modified: doc/help/gen_html/href/M3_47.html
* modified: doc/help/gen_html/href/M3_48.html
* modified: doc/help/gen_html/href/M3_49.html
* modified: doc/help/gen_html/href/M3_5.html
* modified: doc/help/gen_html/href/M3_50.html
* modified: doc/help/gen_html/href/M3_51.html
* modified: doc/help/gen_html/href/M3_52.html
* modified: doc/help/gen_html/href/M3_53.html
* modified: doc/help/gen_html/href/M3_54.html
* modified: doc/help/gen_html/href/M3_55.html
* modified: doc/help/gen_html/href/M3_56.html
* modified: doc/help/gen_html/href/M3_57.html
* modified: doc/help/gen_html/href/M3_58.html
* modified: doc/help/gen_html/href/M3_59.html
* modified: doc/help/gen_html/href/M3_6.html
* modified: doc/help/gen_html/href/M3_60.html
* modified: doc/help/gen_html/href/M3_61.html
* modified: doc/help/gen_html/href/M3_62.html
* modified: doc/help/gen_html/href/M3_63.html
* modified: doc/help/gen_html/href/M3_64.html
* modified: doc/help/gen_html/href/M3_65.html
* modified: doc/help/gen_html/href/M3_66.html
* modified: doc/help/gen_html/href/M3_67.html
* modified: doc/help/gen_html/href/M3_68.html
* modified: doc/help/gen_html/href/M3_69.html
* modified: doc/help/gen_html/href/M3_7.html
* modified: doc/help/gen_html/href/M3_70.html
* modified: doc/help/gen_html/href/M3_71.html
* modified: doc/help/gen_html/href/M3_72.html
* modified: doc/help/gen_html/href/M3_73.html
* modified: doc/help/gen_html/href/M3_74.html
* modified: doc/help/gen_html/href/M3_75.html
* modified: doc/help/gen_html/href/M3_76.html
* modified: doc/help/gen_html/href/M3_77.html
* modified: doc/help/gen_html/href/M3_78.html
* modified: doc/help/gen_html/href/M3_79.html
* modified: doc/help/gen_html/href/M3_8.html
* modified: doc/help/gen_html/href/M3_80.html
* modified: doc/help/gen_html/href/M3_81.html
* modified: doc/help/gen_html/href/M3_82.html
* modified: doc/help/gen_html/href/M3_83.html
* modified: doc/help/gen_html/href/M3_84.html
* modified: doc/help/gen_html/href/M3_85.html
* modified: doc/help/gen_html/href/M3_86.html
* modified: doc/help/gen_html/href/M3_87.html
* modified: doc/help/gen_html/href/M3_88.html
* modified: doc/help/gen_html/href/M3_89.html
* modified: doc/help/gen_html/href/M3_9.html
* modified: doc/help/gen_html/href/M3_90.html
* modified: doc/help/gen_html/href/M3_91.html
* modified: doc/help/gen_html/href/M3_92.html
* modified: doc/help/gen_html/href/M3_93.html
* modified: doc/help/gen_html/href/M3_94.html
* modified: doc/help/gen_html/href/M3_95.html
* modified: doc/help/gen_html/href/M3_96.html
* modified: doc/help/gen_html/href/M3_97.html
* modified: doc/help/gen_html/href/M3_98.html
* modified: doc/help/gen_html/href/M3_99.html
* modified: doc/help/gen_html/href/MG_2.html
* modified: doc/help/gen_html/juno-app/derived/JunoBundle.m3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/FSPosix.m3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/FilePosix.m3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/OSConfigPosix.m3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/OSErrorPosix.i3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/OSErrorPosix.m3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/ProcessPosix.m3.html
* modified: doc/help/gen_html/libm3/src/os/POSIX/SocketPosix.m3.html
* modified: doc/help/gen_html/libm3/src/params/Env.m3.html
* modified: doc/help/gen_html/libm3/src/pickle/ver2/Pickle2.m3.html
* modified: doc/help/gen_html/libm3/src/uid/POSIX/MachineIDPosix.m3.html
* modified: doc/help/gen_html/listfuncs/src/ListFuncs.ig.html
* modified: doc/help/gen_html/listfuncs/src/ListFuncs.mg.html
* modified: doc/help/gen_html/m3bundle/src/m3bundle.m3.html
* modified: doc/help/gen_html/m3core/derived/Compiler.i3.html
* modified: doc/help/gen_html/m3core/src/C/Common/Cerrno.i3.html
* modified: doc/help/gen_html/m3core/src/Csupport/Common/hand.c.html
* modified: doc/help/gen_html/m3core/src/main/Main.i3.html
* modified: doc/help/gen_html/m3core/src/runtime/POSIX/RTOS.m3.html
* modified: doc/help/gen_html/m3core/src/runtime/common/RT0.i3.html
* modified: doc/help/gen_html/m3core/src/runtime/common/RTLinker.i3.html
* modified: doc/help/gen_html/m3core/src/runtime/common/RTLinker.m3.html
* modified: doc/help/gen_html/m3core/src/runtime/common/RTLinkerX.i3.html
* modified: doc/help/gen_html/m3core/src/thread/POSIX/ThreadPosix.m3.html
* modified: doc/help/gen_html/m3core/src/unix/linux-libc6/Uerror.i3.html
* modified: doc/help/gen_html/m3core/src/unix/linux-libc6/Uerror.m3.html
* modified: doc/help/gen_html/m3core/src/unix/linux-libc6/Uexec.i3.html
* modified: doc/help/gen_html/m3core/src/unix/linux-libc6/Uin.i3.html
* modified: doc/help/gen_html/m3front/src/builtinInfo/InfoModule.m3.html
* modified: doc/help/gen_html/m3front/src/exprs/ExprParse.m3.html
* modified: doc/help/gen_html/m3front/src/misc/CG.m3.html
* modified: doc/help/gen_html/m3front/src/misc/ESet.m3.html
* modified: doc/help/gen_html/m3front/src/misc/M3Front.m3.html
* modified: doc/help/gen_html/m3front/src/misc/M3Header.m3.html
* modified: doc/help/gen_html/m3front/src/misc/Scanner.i3.html
* modified: doc/help/gen_html/m3front/src/misc/Scanner.m3.html
* modified: doc/help/gen_html/m3front/src/misc/Token.i3.html
* modified: doc/help/gen_html/m3front/src/misc/Token.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/AssertStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/AssignStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/BlockStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/CaseStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/DebugStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/EvalStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/ExitStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/ForStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/IfStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/LockStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/LoopStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/RaiseStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/RepeatStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/ReturnStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/Stmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/TryFinStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/TryStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/TypeCaseStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/WhileStmt.m3.html
* modified: doc/help/gen_html/m3front/src/stmts/WithStmt.m3.html
* modified: doc/help/gen_html/m3front/src/types/ArrayType.m3.html
* modified: doc/help/gen_html/m3front/src/types/Brand.m3.html
* modified: doc/help/gen_html/m3front/src/types/EnumType.m3.html
* modified: doc/help/gen_html/m3front/src/types/NamedType.m3.html
* modified: doc/help/gen_html/m3front/src/types/ObjectType.m3.html
* modified: doc/help/gen_html/m3front/src/types/PackedType.m3.html
* modified: doc/help/gen_html/m3front/src/types/ProcType.m3.html
* modified: doc/help/gen_html/m3front/src/types/RecordType.i3.html
* modified: doc/help/gen_html/m3front/src/types/RecordType.m3.html
* modified: doc/help/gen_html/m3front/src/types/RefType.m3.html
* modified: doc/help/gen_html/m3front/src/types/SetType.m3.html
* modified: doc/help/gen_html/m3front/src/types/SubrangeType.m3.html
* modified: doc/help/gen_html/m3front/src/types/Type.i3.html
* modified: doc/help/gen_html/m3front/src/types/Type.m3.html
* modified: doc/help/gen_html/m3front/src/values/Constant.m3.html
* modified: doc/help/gen_html/m3front/src/values/Decl.i3.html
* modified: doc/help/gen_html/m3front/src/values/Decl.m3.html
* modified: doc/help/gen_html/m3front/src/values/Exceptionz.m3.html
* modified: doc/help/gen_html/m3front/src/values/External.m3.html
* modified: doc/help/gen_html/m3front/src/values/Formal.m3.html
* modified: doc/help/gen_html/m3front/src/values/Ident.m3.html
* modified: doc/help/gen_html/m3front/src/values/Module.i3.html
* modified: doc/help/gen_html/m3front/src/values/Module.m3.html
* modified: doc/help/gen_html/m3front/src/values/Procedure.m3.html
* modified: doc/help/gen_html/m3front/src/values/Revelation.m3.html
* modified: doc/help/gen_html/m3front/src/values/Tipe.i3.html
* modified: doc/help/gen_html/m3front/src/values/Tipe.m3.html
* modified: doc/help/gen_html/m3front/src/values/ValueRep.i3.html
* modified: doc/help/gen_html/m3front/src/values/Variable.m3.html
* modified: doc/help/gen_html/m3gc-enhanced/src/runtime/LINUXLIBC6/RTHeapDepC.c.html
* modified: doc/help/gen_html/m3gc-simple/src/runtime/LINUXLIBC6/sysdeps.c.html
* modified: doc/help/gen_html/m3linker/src/MxGen.i3.html
* modified: doc/help/gen_html/m3linker/src/MxGen.m3.html
* modified: doc/help/gen_html/m3middle/src/M3File.m3.html
* modified: doc/help/gen_html/m3middle/src/Target.i3.html
* modified: doc/help/gen_html/m3middle/src/Target.m3.html
* modified: doc/help/gen_html/m3quake/src/QMachine.m3.html
* modified: doc/help/gen_html/m3totex/derived/B.m3.html
* modified: doc/help/gen_html/m3zume/derived/ZoomBundle.m3.html
* modified: doc/help/gen_html/netobj/src/netobjrt/NetObjF.i3.html
* modified: doc/help/gen_html/obliq/derived/ObliqBdl2.m3.html
* modified: doc/help/gen_html/obliqlibemb/derived/ObEmbBundle.m3.html
* modified: doc/help/gen_html/obliqlibemb/src/LibEmbDirs.i3.html
* modified: doc/help/gen_html/obliqlibemb/src/LibEmbDirsPosix.m3.html
* modified: doc/help/gen_html/obliqlibemb/src/ObLibEmb.i3.html
* modified: doc/help/gen_html/obliqlibemb/src/ObLibEmb.m3.html
* modified: doc/help/gen_html/obliqlibemb/src/ObLoader.i3.html
* modified: doc/help/gen_html/obliqlibemb/src/ObLoader.m3.html
* modified: doc/help/gen_html/obliqrt/derived/ObValueCB.i3.html
* modified: doc/help/gen_html/obliqrt/derived/ObValueCB.m3.html
* modified: doc/help/gen_html/obliqrt/derived/ObValueCBProxy.i3.html
* modified: doc/help/gen_html/obliqrt/derived/ObValuePickle.i3.html
* modified: doc/help/gen_html/obliqrt/derived/ObValueProxy.i3.html
* modified: doc/help/gen_html/obliqrt/derived/ObValueSO.m3.html
* modified: doc/help/gen_html/obliqrt/src/ObValue.m3.html
* modified: doc/help/gen_html/obliqrt/src/ObValueNotify.i3.html
* modified: doc/help/gen_html/obliqrt/src/ObValueNotify.m3.html
* modified: doc/help/gen_html/obliqrt/src/ObValueRep.i3.html
* modified: doc/help/gen_html/patternmatching/src/Glob.i3.html
* modified: doc/help/gen_html/patternmatching/src/Glob.m3.html
* modified: doc/help/gen_html/patternmatching/src/GlobTree.i3.html
* modified: doc/help/gen_html/patternmatching/src/GlobTree.m3.html
* modified: doc/help/gen_html/patternmatching/src/Uglob.i3.html
* modified: doc/help/gen_html/patternmatching/src/libglob/fnmatch.c.html
* modified: doc/help/gen_html/pkl-fonts/derived/PklFontsBundle.m3.html
* modified: doc/help/gen_html/rdwr/src/RdWrPipe.i3.html
* modified: doc/help/gen_html/rdwr/src/RdWrPipe.m3.html
* modified: doc/help/gen_html/rdwr/src/SimpleMsgRW.i3.html
* modified: doc/help/gen_html/rdwr/src/SimpleMsgRW.m3.html
* modified: doc/help/gen_html/rdwr/src/TeeWr.i3.html
* modified: doc/help/gen_html/rdwr/src/TeeWr.m3.html
* modified: doc/help/gen_html/sharedobj/src/LocalObjectSpace.i3.html
* modified: doc/help/gen_html/sharedobj/src/LocalObjectSpace.m3.html
* modified: doc/help/gen_html/sharedobj/src/Message.i3.html
* modified: doc/help/gen_html/sharedobj/src/Message.m3.html
* modified: doc/help/gen_html/sharedobj/src/ObjCopy.i3.html
* modified: doc/help/gen_html/sharedobj/src/ObjCopy.m3.html
* modified: doc/help/gen_html/sharedobj/src/ObjectInfo.i3.html
* modified: doc/help/gen_html/sharedobj/src/ObjectInfo.m3.html
* modified: doc/help/gen_html/sharedobj/src/ObjectSpace.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObj.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjError.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjF.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjF.m3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjRT.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjRT.m3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjRTF.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjRep.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjRep.m3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjStubLib.i3.html
* modified: doc/help/gen_html/sharedobj/src/SharedObjStubLib.m3.html
* modified: doc/help/gen_html/sharedobj/src/SpaceConn.i3.html
* modified: doc/help/gen_html/sharedobj/src/SpaceConn.m3.html
* modified: doc/help/gen_html/sharedobj/src/WeakerRef.i3.html
* modified: doc/help/gen_html/sharedobj/src/WeakerRef.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCodeFiles.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCodeFiles.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCodeGenError.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCodeGenError.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCodeUtils.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCodeUtils.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxCoder.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxDummyCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxDummyCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfCBCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfCBCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfCBProxyCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfCBProxyCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfPklCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfPklCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfProxyCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxIntfProxyCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxModuleCBCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxModuleCBCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxModuleSOCode.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/SOxModuleSOCode.m3.html
* modified: doc/help/gen_html/sharedobjgen/src/StubGenTool.i3.html
* modified: doc/help/gen_html/sharedobjgen/src/StubGenTool.m3.html
* modified: doc/help/gen_html/tcp/src/POSIX/Herrno.i3.html
* modified: doc/help/gen_html/tcp/src/POSIX/IP.m3.html
* modified: doc/help/gen_html/tcp/src/POSIX/IPErrorPosix.m3.html
* modified: doc/help/gen_html/tcp/src/POSIX/TCP.m3.html
* modified: doc/help/gen_html/tcp/src/POSIX/TCPHack.i3.html
* modified: doc/help/gen_html/udp/src/POSIX/UDPPosix.m3.html
* modified: doc/help/gen_html/vbtkit/derived/VBTKitBundle.m3.html
* modified: doc/help/gen_html/visualobliq/derived/DialogBundle.m3.html
* modified: doc/help/gen_html/vocgi/derived/VOCgiBundle.m3.html
* modified: doc/help/gen_html/vorun/derived/VORunBundle.m3.html
* modified: doc/help/gen_html/webvbt/derived/ResourceBundle.m3.html
* modified: doc/help/gen_html/zeus/derived/ZeusBundle.m3.html
* modified: doc/help/gen_html/zeus/src/ZeusPanel.m3.html
*
* Revision 1.2 2001/12/02 13:41:17 wagner
* add copyright notes, fix overrides for cm3, and make everything compile(except tests)
*
* added: sharedobj/COPYRIGHT-COLUMBIA
* added: sharedobj/src/COPYRIGHT-COLUMBIA
* modified: sharedobj/src/LocalObjectSpace.i3
* modified: sharedobj/src/LocalObjectSpace.m3
* modified: sharedobj/src/Message.i3
* modified: sharedobj/src/Message.m3
* modified: sharedobj/src/ObjCopy.i3
* modified: sharedobj/src/ObjCopy.m3
* modified: sharedobj/src/ObjectInfo.i3
* modified: sharedobj/src/ObjectInfo.m3
* modified: sharedobj/src/ObjectSpace.i3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v1.i3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v1.m3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v2.i3
* modified: sharedobj/src/ObjectSpace_FindObjCallBack_v2.m3
* modified: sharedobj/src/ObjectSpace_T_v1.i3
* modified: sharedobj/src/ObjectSpace_T_v1.m3
* modified: sharedobj/src/ObjectSpace_T_v2.i3
* modified: sharedobj/src/ObjectSpace_T_v2.m3
* modified: sharedobj/src/SharedObj.i3
* modified: sharedobj/src/SharedObjError.i3
* modified: sharedobj/src/SharedObjF.i3
* modified: sharedobj/src/SharedObjF.m3
* modified: sharedobj/src/SharedObjRT.i3
* modified: sharedobj/src/SharedObjRT.m3
* modified: sharedobj/src/SharedObjRTF.i3
* modified: sharedobj/src/SharedObjRep.i3
* modified: sharedobj/src/SharedObjRep.m3
* modified: sharedobj/src/SharedObjStubLib.i3
* modified: sharedobj/src/SharedObjStubLib.m3
* modified: sharedobj/src/SpaceConn.i3
* modified: sharedobj/src/SpaceConn.m3
* modified: sharedobj/src/WeakerRef.i3
* modified: sharedobj/src/WeakerRef.m3
* modified: sharedobj/src/m3makefile
* modified: sharedobj/src/m3overrides
* modified: sharedobj/tests/netobjtest/src/m3makefile
* modified: sharedobj/tests/obsequence/src/m3makefile
* modified: sharedobj/tests/tracker/src/m3makefile
*
* Revision 1.1.1.1 2001/12/02 13:14:14 wagner
* Blair MacIntyre's sharedobj package
*
* Revision 1.8 1998/07/14 02:34:02 bm
* tried to fix the distribution problems -- not yet working, but closer
*
* Revision 1.7 1998/07/02 21:43:37 bm
* small bug fixes
*
* Revision 1.6 1998/05/11 02:34:16 bm
* bug fixes, added SharedObj.Wait
*
* Revision 1.5 1997/10/24 19:32:57 bm
* Added the ability to flush the incoming updates.
*
* Revision 1.4 1997/03/12 21:50:41 bm
* Bug fix.
*
* Revision 1.3 1997/01/23 15:27:17 bm
* Lot's of little bug fixes.
*
* Revision 1.2 1996/10/07 19:24:18 bm
* Numerous bug fixes.
* - added support for passing SharedObj/NetObj parameters!
* - tidied up to support sharedobjgen
*
*
* HISTORY
*
* DONE.
* - the signal waiting stuff is dangerous. Need a way to make sure
* we only signal the correct thread once!!!!!
* - fix to allow passing of shared objects
*
* TODO
* - add code to pickler to allow passing of new copy of failed
* object
* - add code for globallock(), own()
* - remove connections to spaces we no longer communicate with
* (either time delay or garbage collect)
* - change pickler to not pass object unless needed!
* - handle sequencer crashes
* - when two or more threads try creating an object at similar
* times, which one gets to put it in the table? Furthermore, how
* do we handle the different sequence numbers? Can probably just
* have the first one to register the set up object win, and if
* it's not new enough, have the other ones wait until it is.
MODULE SharedObjRT EXPORTS SharedObj, SharedObjRT, SharedObjRTF,
SharedObjError;
IMPORT Atom, AtomList, NetObj, Rd, Wr, Thread, EventWireRep,
Text, EventCounter, EventStubLib, ObjectInfo, IO, SharedObjRep,
EventConnList, EventConnListFuncs, Debug, RdWrMutex,
EventPort, Message, ObjectInfoTbl, SpaceConn,
EventNumber, EventNumberF, WeakRef, ThreadF,
ObjectSpace, Event, ObjCopy, ObjCopyList, ObjCopyListFuncs,
Process, Fmt, EventProtocol, EventSeq;
FROM SharedObjRep IMPORT WireRep;
A handle is used during event construction to hold the information
needed to build the event.
CONST Protocol: EventProtocol.StubProtocol = 1;
The protocol implemented by this module.
Make this routine safe to be called repeatedly
PROCEDURE Init(self: T): T =
BEGIN
IF debug_level >= 1 THEN
debug.print(1, "Initializing Sharedobj");
END;
IF self.mu = NIL THEN
self.mu := NEW(RdWrMutex.T).init();
END;
IF self.wrep = EventWireRep.NullT THEN
self.wrep := EventWireRep.New();
END;
IF self.seqNoCnt = NIL THEN
(* The next seqNo is not zero! *)
self.seqNoCnt := EventCounter.New(self.mu, oneSeqNo);
END;
IF debug_level >= 1 THEN
debug.print(1, "New SharedObj: " & SharedObjRep.ToText(self));
END;
RETURN self;
END Init;
PROCEDURE NewMessage(ev: Event.T; h: EventStubLib.Handle; thread: INTEGER;
objInfo: ObjectInfo.T): Message.T =
VAR pm: Message.T;
BEGIN
LOCK msgMu DO
IF freeMessage # NIL THEN
pm := freeMessage; freeMessage := freeMessage.next;
ELSE
pm := NEW(Message.T, next := NIL);
END;
END;
pm.ev := ev;
pm.h := h;
pm.thread := thread;
pm.objInfo := objInfo;
RETURN pm;
END NewMessage;
PROCEDURE FreeMessage(m: Message.T) =
BEGIN
LOCK msgMu DO
m.ev := NIL;
m.objInfo := NIL;
m.h := NIL;
m.next := freeMessage;
freeMessage := m;
END;
END FreeMessage;
PROCEDURE DebugLevel(p: INTEGER) =
BEGIN
(* Who cares if someone is executing right when this changes. No
big deal.
We will use level 1 for external entry points, 10 for internal
entry points.
*)
debug := NEW(Debug.T).init("SharedObj", p);
debug_level := p;
END DebugLevel;
***************************************************************************
* for adding and removing host connections
***************************************************************************
PROCEDURE EventPortConnect(conn: SpaceConn.T) RAISES {Error} =
BEGIN
TRY
ep.connect(conn);
EXCEPT
| Event.Error(al) => RaiseEventFailure(al);
END;
END EventPortConnect;
PROCEDURE EventPortDisconnect (conn: SpaceConn.T): EventSeq.T RAISES {Error} =
VAR wrep: WireRep;
objInfo: ObjectInfo.T;
copy := NEW(ObjCopy.T, conn := conn);
BEGIN
(* Need to iterate through all objects and remove all traces of
the connection we are dropping. *)
IF debug_level >= 10 THEN
debug.print(10, "EventPortDisconnect: scanning for " &
"objects with connections to the invalid port.");
END;
WITH iterator = objTbl.iterate() DO
WHILE iterator.next(wrep, objInfo) DO
LOCK objInfo DO
(* If this obj's sequencer connection has been lost, mark it
as invalid *)
IF objInfo.sequencer = conn THEN
MarkObjectInvalid(objInfo);
END;
IF ObjCopyListFuncs.DeleteD(objInfo.clients, copy) # NIL THEN
(* Delete the conn, if there is one, in the fastClient list. If
it's not a fastClient, it will be in the conns list, so
delete it from there. *)
IF ObjCopyListFuncs.DeleteD(objInfo.fastClients, copy) = NIL THEN
IF EventConnListFuncs.DeleteD(objInfo.conns, conn) = NIL THEN
END;
END;
IF debug_level >= 10 THEN
debug.print(10, "EventPortDisconnect: removed client.");
END;
(*****************************************************)
(* NEED TO CHECK FOR LOCK and OWNER and do something *)
(* reasonable!!!!!!! *)
(*****************************************************)
<* ASSERT objInfo.lock = NIL *>
<* ASSERT objInfo.owner = NIL *>
CheckForLastClient(objInfo);
END;
END;
END;
END;
IF debug_level >= 10 THEN
debug.print(10, "EventPortDisconnect: done scanning for " &
"objects with connections to the invalid port.");
END;
TRY
RETURN ep.disconnect(conn);
EXCEPT
| Event.Error(el) => RaiseEventFailure(el);
(* To shut up the compiler. *) RETURN NIL;
END;
END EventPortDisconnect;
***************************************************************************
* some utility routines
***************************************************************************
PROCEDURE MarkObjectInvalid(objInfo: ObjectInfo.T; obj: T := NIL) =
BEGIN
IF obj = NIL THEN
obj := GetObjRef(objInfo);
END;
IF obj # NIL THEN
IF debug_level >= 10 THEN
debug.print(10, "MarkObjectInvalid: marking " &
SharedObjRep.ToText(obj) & " invalid.");
END;
obj.ok := FALSE;
(* Awake all the sleepers, who will then raise errors *)
WITH blocked = objInfo.waiting DO
FOR i := FIRST(blocked^) TO LAST(blocked^) DO
IF blocked[i].used THEN
IF debug_level >= 10 THEN
debug.print(10, "MarkObjectInvalid: signalling thread slot " &
Fmt.Int(i) & ".");
END;
Thread.Signal(blocked[i].cv);
END;
END;
END;
END;
END MarkObjectInvalid;
PROCEDURE GetObjRef(objInfo: ObjectInfo.T): T =
BEGIN
IF objInfo.hasCopy THEN
RETURN WeakRef.ToRef(objInfo.obj);
END;
RETURN NIL;
END GetObjRef;
PROCEDURE GetObjInfo(wrep: WireRep; VAR objInfo: ObjectInfo.T): BOOLEAN =
BEGIN
RETURN objTbl.get(wrep, objInfo);
END GetObjInfo;
***************************************************************************
* dealing with sequencers
***************************************************************************
PROCEDURE SequencerFailed(<*UNUSED*>seq: SpaceConn.T; ec: AtomList.T) =
BEGIN
Debug.Crash("Sequencer Failure", ec);
END SequencerFailed;
We are a sequencer for an object if we are a sequencer and
someone else is not this objects sequencer.
PROCEDURE IsObjSequencer(objInfo: ObjectInfo.T): BOOLEAN =
BEGIN
RETURN isSequencer AND objInfo.sequencer = NIL;
END IsObjSequencer;
***************************************************************************
* use weak refs to cleanup shared objects
***************************************************************************
TYPE
ObjectCleanerClosure = Thread.Closure OBJECT
mu: Thread.Mutex;
cv: Thread.Condition;
tbl: ObjectInfoTbl.T;
it: ObjectInfoTbl.Iterator;
METHODS
init (): ObjectCleanerClosure := InitDeadObject;
addObject (wrep: EventWireRep.T; o: ObjectInfo.T) := AddDeadObject;
OVERRIDES
apply := ObjectCleaner;
END;
PROCEDURE InitDeadObject (self: ObjectCleanerClosure):
ObjectCleanerClosure =
BEGIN
self.mu := NEW(Thread.Mutex);
self.cv := NEW(Thread.Condition);
self.tbl := NEW(ObjectInfoTbl.Default).init();
self.it := self.tbl.iterate();
RETURN self;
END InitDeadObject;
PROCEDURE AddDeadObject (self: ObjectCleanerClosure;
wrep: EventWireRep.T; o: ObjectInfo.T) =
BEGIN
LOCK self.mu DO
<*ASSERT self.tbl.put(wrep, o) = FALSE*>
Thread.Broadcast(self.cv);
END;
END AddDeadObject;
PROCEDURE ObjectCleaner (self: ObjectCleanerClosure): REFANY =
VAR
obj: ObjectInfo.T;
wrep: EventWireRep.T;
BEGIN
LOOP
LOCK self.mu DO
WHILE self.tbl.size() = 0 DO
Thread.Wait(self.mu, self.cv);
END;
self.it := self.it.init();
<*ASSERT self.it.next(wrep, obj)*>
<*ASSERT self.tbl.delete(wrep, obj)*>
END;
(* Note that the weakref is no longer valid. *)
obj.hasCopy := FALSE;
IF debug_level >= 5 THEN
debug.print(5, "ObjectCleaner: starting.");
END;
IF NOT IsObjSequencer(obj) THEN
(* We are not this objects sequencer.
If obj.fastClient # NIL, the sequencer will know this and
handle it, so we don't need to worry about it. *)
IF obj.sequencer # NIL THEN
TRY
IF debug_level >= 5 THEN
debug.print(5,
"ObjectCleaner: deleting from custom sequencer.");
END;
obj.sequencer.objSpace.deleteCopy(localSpace.space(),
wrep);
IF debug_level >= 5 THEN
debug.print(5,
"ObjectCleaner: deleted from custom sequencer.");
END;
EXCEPT
| NetObj.Error(ec) => SequencerFailed(obj.sequencer, ec);
| Error(ec) => SequencerFailed(obj.sequencer, ec);
| Thread.Alerted => SequencerFailed(obj.sequencer, NIL);
END;
ELSIF sequencer # NIL THEN
TRY
IF debug_level >= 5 THEN
debug.print(5,
"ObjectCleaner: deleting from default sequencer.");
END;
sequencer.objSpace.deleteCopy(localSpace.space(), wrep);
IF debug_level >= 5 THEN
debug.print(5,
"CleanupSharedObj: deleted from default sequencer.");
END;
EXCEPT
| NetObj.Error(ec) => SequencerFailed(sequencer, ec);
| Error(ec) => SequencerFailed(sequencer, ec);
| Thread.Alerted => SequencerFailed(sequencer, NIL);
END;
END;
(* We've notified the sequencer, if needed, and the last
reference to this is gone. Get rid of all traces! *)
ELSE
CheckForLastClient(obj);
END;
END;
END ObjectCleaner;
PROCEDURE CleanupSharedObj(<*UNUSED*> READONLY w: WeakRef.T; r: REFANY) =
VAR obj := NARROW(r, T);
o: ObjectInfo.T;
BEGIN
(* Have to do all of this within the localspace lock.
MIGHT CHANGE THIS: if one of the netobj calls hangs, we will
lock out the localspace for a _long_ time! *)
IF debug_level >= 1 THEN
debug.print(1, "CleanupSharedObj: begin!");
END;
LOCK objTblMu DO
IF NOT GetObjInfo(obj.wrep, o) THEN
IF debug_level >= 1 THEN
debug.print(1, "CleanupSharedObj: Already clean. Return!");
END;
RETURN;
END;
LOCK o DO
WITH realObj = GetObjRef(o) DO
IF realObj # NIL AND realObj # obj THEN
IF debug_level >= 1 THEN
debug.print(1, "CleanupSharedObj: cleaning a fake copy! Return");
END;
RETURN;
END;
END;
EVAL objTbl.delete(obj.wrep, o);
objCleaner.addObject(obj.wrep, o);
IF debug_level >= 5 THEN
debug.print(5, "CleanupSharedObj: deleted object info.");
END;
END;
END;
IF debug_level >= 1 THEN
debug.print(1, "CleanupSharedObj: end.");
END;
END CleanupSharedObj;
PROCEDURE RegisterObject(obj: T; wrep: WireRep;
sequencer: SpaceConn.T; standAlone: BOOLEAN;
seqNo: SequenceNumber): ObjectInfo.T =
VAR objInfo: ObjectInfo.T;
objRef := WeakRef.T{ARRAY [0..7] OF BITS 8 FOR [0..255] {0, ..}};
hasCopy := FALSE;
BEGIN
(* Put it in the local table. *)
IF obj # NIL THEN
objRef := WeakRef.FromRef(obj, CleanupSharedObj);
hasCopy := TRUE;
END;
objInfo := NEW(ObjectInfo.T, obj := objRef,
hasCopy := hasCopy, sequencer := sequencer,
isStandalone := standAlone,
wrep := wrep).init(seqNo);
EVAL objTbl.put(wrep, objInfo);
IF debug_level >= 10 THEN
debug.print(10, "RegisterObject: object registered.");
END;
RETURN objInfo;
END RegisterObject;
**************************************************************************
* Adding and removing a client for an object
**************************************************************************
PROCEDURE AddClient(objInfo: ObjectInfo.T;
conn: SpaceConn.T) RAISES {Error} =
BEGIN
WITH copy = NEW(ObjCopy.T, conn := conn) DO
IF ObjCopyList.Member(objInfo.clients, copy) THEN
RaiseError(Atom.FromText("Object doesn't exist but in client list??"));
END;
objInfo.clients := ObjCopyList.Cons(copy, objInfo.clients);
objInfo.conns := EventConnList.Cons(conn, objInfo.conns);
IF debug_level >= 10 THEN
debug.print(10, "AddClient: added to clients and conns.");
END;
END;
END AddClient;
PROCEDURE DeleteClient(objInfo: ObjectInfo.T; conn: SpaceConn.T)
RAISES {Error} =
BEGIN
WITH copy = NEW(ObjCopy.T, conn := conn) DO
DeleteCopy(objInfo, conn, copy);
END;
END DeleteClient;
PROCEDURE DeleteCopy(objInfo: ObjectInfo.T; conn: SpaceConn.T;
copy: ObjCopy.T)
RAISES {Error} =
BEGIN
IF ObjCopyListFuncs.DeleteD(objInfo.clients, copy) = NIL THEN
RaiseError(Atom.FromText("Object exists but isn't in client list??"));
END;
(* Delete the conn, if there is one, in the fastClient list. If
it's not a fastClient, it will be in the conns list, so
delete it from there. *)
IF ObjCopyListFuncs.DeleteD(objInfo.fastClients, copy) = NIL THEN
IF EventConnListFuncs.DeleteD(objInfo.conns, conn) = NIL THEN
RaiseError(Atom.FromText("Object exists but isn't in conns list??"));
END;
END;
IF debug_level >= 10 THEN
debug.print(10, "DeleteCopy: removed client.");
END;
(*****************************************************)
(* NEED TO CHECK FOR LOCK and OWNER and do something *)
(* reasonable!!!!!!! *)
(*****************************************************)
<* ASSERT objInfo.lock = NIL *>
<* ASSERT objInfo.owner = NIL *>
CheckForLastClient(objInfo);
END DeleteCopy;
**************************************************************************
***************************************************************************
** Handling of incoming messages
***************************************************************************
**************************************************************************
PROCEDURE MethodDispatcher (ev: Event.T; <*UNUSED*> data: REFANY)
RAISES {Thread.Alerted} =
VAR
h : EventStubLib.Handle;
wrep : WireRep;
objInfo : ObjectInfo.T;
thread : INTEGER;
m : Message.T;
msgApplied: BOOLEAN := TRUE;
BEGIN
TRY
IF debug_level >= 12 THEN
debug.print(12, "MethodDispatcher: new event (" &
Event.ToText(ev) & ")");
END;
h := EventStubLib.StartRead(ev);
EventStubLib.InBytes(h, wrep.byte);
LOCK objTblMu DO
(* If we don't have any info for this object, return. *)
IF NOT GetObjInfo(wrep, objInfo) THEN
IF debug_level >= 12 THEN
debug.print(12, "MethodDispatcher: non-existant object. done.");
END;
RETURN;
END;
END;
thread := EventStubLib.InInteger(h);
IF debug_level >= 15 THEN
debug.print(15, "MethodDispatcher: distributing event");
END;
TRY
m := NewMessage(ev, h, thread, objInfo);
WITH obj = DistributeMsg(m) DO
IF obj # NIL THEN
msgApplied := ApplyMsg(m, obj);
END;
END;
FINALLY
FreeMessage(m);
IF msgApplied THEN
EventStubLib.EndRead(h);
END;
END;
IF debug_level >= 15 THEN
debug.print(15, "MethodDispatcher: done distributing event");
END;
EXCEPT
| Error (al) =>
Debug.PrintAtomList("Dispatcher SharedObj.Error", al);
| Event.Error (al) => Debug.PrintAtomList("Dispatcher Event.Error", al);
| Rd.Failure (al) => Debug.PrintAtomList("Dispatcher Rd.Failure", al);
| Wr.Failure (al) => Debug.PrintAtomList("Dispatcher Wr.Failure", al);
END;
END MethodDispatcher;
Incoming message are distributed here.
PROCEDURE DistributeMsg(m: Message.T) : T
RAISES {Error, Thread.Alerted} =
VAR obj: T := NIL;
BEGIN
(********************************************)
(* We Don't handle owning or locking yet!!! *)
(* Just sequence and forward ... *)
(********************************************)
IF debug_level >= 12 THEN
debug.print(12, "DistributeMsg: message received [" &
Message.ToText(m) & "]");
END;
LOCK m.objInfo DO
TRY
(* If the seqNo is zero, this is unsequenced. Sequence it. *)
IF m.ev.num.compare(zeroSeqNo) = 0 THEN
IF NOT SequenceMsg(m) THEN
(* If it is still not sequenced, return. We have sent it
to the sequencer and will handle it upon return. *)
RETURN NIL;
END;
END;
<* ASSERT m.ev.num.compare(zeroSeqNo) # 0 *>
(* Update to the local object if present. First, get a
tangible reference to it. If this is a sequenced reply to
a message we sent, signal the waiting thread and return. *)
obj := GetObjRef(m.objInfo);
IF obj # NIL THEN
IF m.ev.from = localSpace.space() THEN
(* If we sent this out, and its sequenced, we should have
a thread blocked waiting on it! If not, and the object
is not ok, we'll just drop the event. Otherwise, we'll
forward the messages. *)
IF debug_level >= 15 THEN
debug.print(15, "DistributeMsg: our message! Signalling thread");
END;
IF SignalWaiting(m) THEN RETURN NIL END;
IF NOT obj.ok THEN RETURN NIL END;
END;
END;
(* Forward this message to our clients. Do this after the
SignalWaiting, since it should only be done it one place! *)
IF m.objInfo.conns # NIL THEN
IF debug_level >= 15 THEN
debug.print(15, "DistributeMsg: sending message to clients.");
END;
ep.mcast(m.objInfo.conns, m.ev);
END;
EXCEPT
| Event.Error(ec) => RaiseEventFailure(ec);
| NetObj.Error(ec) => RaiseNetObjFailure(ec);
END;
END;
IF debug_level >= 12 THEN
debug.print(12, "DistributeMsg: done.");
END;
(* Return the local object, if there is one. *)
RETURN obj;
END DistributeMsg;
PROCEDURE SignalWaiting(m: Message.T): BOOLEAN =
BEGIN
(* blocked.used should normally be TRUE, it's in use. The blocked
thread will reset it to FALSE when it runs. Furthermore, the
blocked entry maintains the eventnumber that was last woken on
it. If the entry in the event is no longer used, or it is used
by has an event number at least as big as the incoming event,
then the event has already woken the thread and thus this event
is a duplicate OR the blocked thread was Alerted. In the
latter case, we will end up trying to apply the event again.
Chances are, it's been applied so we will get a "Duplicate"
error when we try to grab the EventCounter. That's cool. *)
WITH blocked = m.objInfo.waiting[m.thread] DO
IF NOT blocked.used OR blocked.en.compare(m.ev.num) >= 0 THEN
IF debug_level >= 12 THEN
debug.print(12, "SignalWaiting: thread " &
Fmt.Int(m.thread) & " has already been signalled or alerted.");
END;
RETURN FALSE;
ELSE
IF debug_level >= 12 THEN
debug.print(12, "SignalWaiting: signalling thread " &
Fmt.Int(m.thread) & ".");
END;
EVAL blocked.en.init(m.ev.num);
Thread.Signal(blocked.cv);
END;
END;
RETURN TRUE;
END SignalWaiting;
*************************************************************************
* Incoming message are applied here.
* Either apply now, or defer it till later using a HandlerEvent
*************************************************************************
PROCEDURE ApplyMsg (m: Message.T; obj: T): BOOLEAN
RAISES {Error, Rd.Failure, Wr.Failure, Thread.Alerted} =
BEGIN
IF debug_level >= 12 THEN
debug.print(12,
"ApplyMsg: message received [" & Message.ToText(m) & "].");
END;
(* see if we are in sequence. *)
TRY
IF obj.seqNoCnt.tryAcquire(m.ev.num) THEN
IF debug_level >= 15 THEN
debug.print(15, "ApplyMsg: acquired counter, applying.");
END;
LOCK m.objInfo DO
(* Now, the actual object might have changed while we were
blocked, so we will get it again! *)
obj := GetObjRef(m.objInfo);
IF obj = NIL THEN
RaiseError(Atom.FromText("DistributedMsg: Obj Disappeared!"));
END;
(* Set the sequence number in the objinfo struct to
reflect this latest successful update. The
objInfo.seqNo should be the same as seqNoCnt, after the
release below. *)
IF NOT IsObjSequencer(m.objInfo) THEN
TRY
m.objInfo.seqNo.init(m.ev.num).inc();
EXCEPT
| EventNumber.Overflow =>
END;
END;
END;
IF debug_level >= 12 THEN
debug.print(12, "ApplyMsg: trying to applyUpdate().");
END;
TRY
TRY
obj.applyUpdate(m.ev, m.h);
IF debug_level >= 15 THEN
debug.print(15, "ApplyMsg: applyUpdate() succeeded.");
END;
FINALLY
obj.seqNoCnt.release();
END;
EXCEPT
| Fatal (ec) =>
(* obj.ok := FALSE;*)
MarkObjectInvalid(m.objInfo, obj);
RAISE Error(AtomList.Cons(DeadObject, ec));
(*
IO.Put("*** FATAL Error called object method.\n");
Debug.PrintAtomList(
" Add code to Pickle reader so we can recover!!\n", ec);
*)
| Event.Error (ec) => RaiseEventFailure(ec);
END;
IF debug_level >= 12 THEN debug.print(12, "ApplyMsg: done."); END;
RETURN TRUE;
ELSE
IF debug_level >= 11 THEN
debug.print(11, "ApplyMsg: couldn't acquire, enqueueing event.");
IF debug_level = 11 THEN
debug.print(11, "ApplyMsg: event " & Event.ToText(m.ev));
END;
END;
WITH handler = NEW(EventHandler, objInfo := m.objInfo, ev := m.ev,
h := m.h) DO
obj.seqNoCnt.enqueueAction(m.ev.num, handler);
END;
IF debug_level >= 12 THEN debug.print(12, "ApplyMsg: done."); END;
RETURN FALSE;
END;
EXCEPT
| EventCounter.Duplicate =>
(* Ignore duplicates. output something now, since we shouldn't get
any with TCP! *)
IF debug_level >= 15 THEN
debug.print(15, "*** Duplicate event " & Event.ToText(m.ev)
& " with #" & obj.seqNoCnt.value().fmt());
END;
RETURN TRUE;
END;
END ApplyMsg;
TYPE
EventHandler = EventCounter.Handler OBJECT
objInfo: ObjectInfo.T;
ev: Event.T;
h: EventStubLib.Handle;
OVERRIDES
handle := HandlerHandleMethod;
duplicate := HandlerDuplicateMethod;
END;
PROCEDURE HandlerHandleMethod (self: EventHandler) =
VAR obj: T;
BEGIN
IF debug_level >= 11 THEN
debug.print(11, "MsgHandlerMeth: enqueued event applying.");
END;
(* Now, the actual object might have changed while we were
blocked, so we will get it again! *)
LOCK self.objInfo DO
obj := GetObjRef(self.objInfo);
IF obj = NIL THEN
EventStubLib.EndRead(self.h);
RETURN;
END;
(* Set the sequence number in the objinfo struct to
reflect this latest successful update *)
IF NOT IsObjSequencer(self.objInfo) THEN
TRY
self.objInfo.seqNo.init(self.ev.num).inc();
EXCEPT
| EventNumber.Overflow =>
END;
END;
END;
IF debug_level >= 15 THEN
debug.print(15, "MsgHandlerMeth: trying to applyUpdate().");
END;
TRY
TRY
obj.applyUpdate(self.ev, self.h);
FINALLY
EventStubLib.EndRead(self.h);
END;
IF debug_level >= 15 THEN
debug.print(15, "MsgHandlerMeth: applyUpdate() succeeded.");
END;
EXCEPT
| Fatal (ec) =>
(* obj.ok := FALSE;*)
MarkObjectInvalid(self.objInfo, obj);
Debug.PrintAtomList("MsgHandler SharedObj.Fatal", ec);
(*
IO.Put("*** FATAL Error called object method.\n");
Debug.PrintAtomList(" Add code to Pickle reader so we can recover!!\n",
ec);
*)
| Error (al) => Debug.PrintAtomList("MsgHandler SharedObj.Error", al);
| Event.Error (al) => Debug.PrintAtomList("MsgHandler Event.Error", al);
| Rd.Failure (al) => Debug.PrintAtomList("MsgHandler Rd.Failure", al);
| Wr.Failure (al) => Debug.PrintAtomList("MsgHandler Wr.Failure", al);
| Thread.Alerted => IO.Put("MsgHandler Thread.Alerted\n");
END;
END HandlerHandleMethod;
PROCEDURE HandlerDuplicateMethod (self: EventHandler) =
BEGIN
IF debug_level >= 10 THEN
debug.print(10, "DuplicateMethod: enqueued event is a duplicate.");
END;
EventStubLib.EndRead(self.h);
END HandlerDuplicateMethod;
*************************************************************************
* sequencing of updates
*************************************************************************
PROCEDURE SequenceMsg(m: Message.T): BOOLEAN RAISES {Error} =
BEGIN
IF debug_level >= 12 THEN
debug.print(12, "SequenceMsg: begin.");
END;
TRY
IF m.objInfo.sequencer # NIL THEN
(* We are a sequencer, but not for this object.
Forward it to its sequencer. *)
IF debug_level >= 15 THEN
debug.print(15, "SequenceMsg: message unsequenced, fwd to obj seq.");
END;
ep.send(m.objInfo.sequencer, m.ev);
IF debug_level >= 12 THEN
debug.print(12, "SequenceMsg: fwded to obj seq.");
END;
RETURN FALSE;
ELSIF sequencer # NIL THEN
(* We are not a sequencer, and we have had our sequencer
set. Send it off to its sequencer. *)
IF debug_level >= 15 THEN
debug.print(15, "SequenceMsg: message unsequenced, fwd to dflt seq");
END;
ep.send(sequencer, m.ev);
IF debug_level >= 12 THEN
debug.print(12, "SequenceMsg: fwded to dflt seq.");
END;
RETURN FALSE;
ELSIF isSequencer THEN
(* Sequence ourselves and continue. *)
IF debug_level >= 15 THEN
debug.print(15, "SequenceMsg: Distributing message locally.");
END;
(* The current value of seqNo is the next sequence number! *)
EventStubLib.ChangeNumber(m.ev, m.objInfo.seqNo);
IF debug_level >= 12 THEN
debug.print(12, "SequenceMsg: assigned seqNo " &
m.objInfo.seqNo.fmt(10) & " to message");
END;
TRY
m.objInfo.seqNo.inc();
EXCEPT
| EventNumber.Overflow =>
Process.Crash("Event Number Overflowed!");
END;
ELSE
RaiseError(
Atom.FromText("SequenceMsg: Obj shared, but no sequencer."));
END;
EXCEPT
| Event.Error(ec) => RaiseEventFailure(ec);
END;
IF debug_level >= 12 THEN
debug.print(12, "SequenceMsg: end.");
END;
RETURN TRUE;
END SequenceMsg;
PROCEDURE SequenceCall(obj: T; ev: Event.T; thread: INTEGER;
objInfo: ObjectInfo.T; en: SequenceNumber;
VAR alerted: BOOLEAN)
RAISES {Error} =
BEGIN
alerted := FALSE; (* Can't be alerted for now! *)
TRY
(* Need the TRY in case AlertWait is Alerted. *)
VAR
m: Message.T := NewMessage(ev, NIL, thread, objInfo);
sequenced: BOOLEAN;
BEGIN
TRY
IF debug_level >= 15 THEN
debug.print(15, "SequenceCall: message created [" &
Message.ToText(m) & "]");
END;
LOCK objInfo DO
(* If the object died between the start of our method call
and here, raise an exception! *)
IF NOT obj.ok THEN RaiseDeadObject() END;
sequenced := SequenceMsg(m);
IF NOT sequenced THEN
(* Wait for reply. *)
IF debug_level >= 12 THEN
debug.print(12, "SequenceCall: forwarded, threadID " &
Fmt.Int(ThreadF.MyId()) & " waiting as thread " &
Fmt.Int(m.thread));
END;
(* Just before going to sleep, we must tell the event
port that this thread is no longer available for
handling incoming events, if it is such a thread *)
EVAL ep.stealWorker();
obj.mu.wait(objInfo, m.objInfo.waiting[m.thread].cv);
(* If we are Alerted, we will just return from here. This
should be ok. *)
(* If the object died while we were asleep, raise an
exception! *)
IF NOT obj.ok THEN RaiseDeadObject() END;
IF debug_level >= 12 THEN
debug.print(12, "SequenceCall: threadID " &
Fmt.Int(ThreadF.MyId()) & " (thread " &
Fmt.Int(m.thread) & ") has been woken.");
END;
(* The event number is put in tht thread slot before we are
woken, since I don't want to change the event itself. *)
EVAL en.init(objInfo.waiting[thread].en);
ELSE
(* The event number was sequenced locally, so the event
number is in the event itself. *)
EVAL en.init(ev.num);
END;
END;
FINALLY
IF debug_level >= 15 THEN
debug.print(15, "SequenceCall: done, releasing thread slot " &
Fmt.Int(thread));
END;
LOCK objInfo DO
objInfo.releaseThreadSlot(thread);
END;
FreeMessage(m);
END;
END;
TRY
LOCK objInfo DO
IF objInfo.conns # NIL THEN
IF debug_level >= 15 THEN
debug.print(15, "SequenceCall: sending message to clients.");
END;
ep.mcast(objInfo.conns, ev);
END;
END;
EXCEPT
| Event.Error =>
(* Toss this error! ConnProblem will be notified. *)
IF debug_level >= 15 THEN
debug.print(15, "SequenceCall: tossing Event.Error from mcast.");
END;
END;
FINALLY
ev.dropRef();
END;
RETURN;
END SequenceCall;
*************************************************************************
* If a client of the sequencer is deleted, or the copy of the object
* that resides on the sequencer is deleted, we must check to see if
* that was the last copy switch the object back to residing only on
* the machine with that copy!
*************************************************************************
PROCEDURE CheckForLastClient(objInfo: ObjectInfo.T) =
BEGIN
IF debug_level >= 5 THEN
debug.print(5, "CheckForLastClient: begin");
END;
(* First check to see if there are any clients. If not, we are
either standalone, or the object is completely gone. *)
IF objInfo.clients = NIL THEN
IF objInfo.hasCopy THEN
IF debug_level >= 5 THEN
debug.print(5, "CheckForLastClient: Sequencer has last copy!");
END;
objInfo.isStandalone := TRUE;
ELSE
(* We removed both the last client and the local reference
to this object. Get rid of all traces! *)
EVAL objTbl.delete(objInfo.wrep, objInfo);
IF debug_level >= 5 THEN
debug.print(5, "CheckForLastClient: No clients left!");
END;
END;
ELSIF objInfo.clients.tail = NIL AND NOT objInfo.hasCopy THEN
(* Last client! Inform them of it and then delete our info.
Won't do it for now! Just remind me! We may need to do more
than the code commented out here, since the last copy client
may have sent some events we haven't gotten and processed
yet! Or, we could have the client wake up the blocked
threads and sequence them, probably a better solution. Not
for now, though.
Perhaps have the client count the number of outstanding
methods and add to their sequence number. We will add a
"wait" after that sequence number to remove the object in the
sequencer, and the client will add a "wait" to revert to
standalone *)
(*
TRY
objInfo.clients.head.conn.objSpace.lastCopy (objInfo.wrep,
objInfo.seqNo);
(* if the lastCopy command suceeded (which it won't yet!) then
we will need to delete the object locally eventually, but
we can't yet because we might be getting messages back that
need to be forwarded, which require that we have an
objectInfo structure! There might also be messages coming
from this client that need to be returned.
To handle this, we will need to have the client (when it
reaches the object sequence number we currently are at that
we sent above) send us a message to delete the objectInfo
structure, since we will then not get any more messages.
*)
(*
EVAL objTbl.delete(obj.wrep, objInfo);
*)
EXCEPT
| SharedObj.Error, NetObj.Error, Thread.Alerted =>
(* the connection is most likely dead, so just toss this
puppy! *)
END;
*)
(*
IO.Put("CheckForLastClient: Only one client left! ");
IO.Put("Write the code to revert it to standalone!\n");
*)
ELSE
IF debug_level >= 5 THEN
debug.print(5, "CheckForLastClient: not last client.");
END;
END;
IF debug_level >= 5 THEN
debug.print(5, "CheckForLastClient: end");
END;
END CheckForLastClient;
---------------------Sequencer Control---------------------
PROCEDURE LocalSpace(): ObjectSpace.T =
BEGIN
RETURN localSpace;
END LocalSpace;
PROCEDURE SetDfltSequencer (space: ObjectSpace.T) RAISES {Error} =
BEGIN
LOCK objTblMu DO
IF debug_level >= 1 THEN
debug.print(1, "SetDfltSequencer: begin.");
END;
IF space = localSpace THEN
IF sequencer # NIL THEN
RaiseError(Atom.FromText("Space is not a sequencer!"));
END;
isSequencer := TRUE;
IF debug_level >= 1 THEN
debug.print(1, "SetDfltSequencer: we are a sequence");
END;
RETURN;
ELSE
IF isSequencer THEN
RaiseError(Atom.FromText("Space is a Sequencer!"));
END;
IF sequencer # NIL AND sequencer.objSpace # space THEN
RaiseError(Atom.FromText("Sequencer already set!"));
END;
(* done below *)
END;
(* Ok, so register it with the sequencer. It might be
registered already, but that's ok. *)
IF debug_level >= 1 THEN
debug.print(1, "SetDfltSequencer: setting sequence");
END;
sequencer := localSpace.newSpace(space);
IF debug_level >= 1 THEN
debug.print(1, "SetDfltSequencer: done setting sequence. " &
"Waking sleepers.");
END;
Thread.Broadcast(seqCV);
END;
END SetDfltSequencer;
PROCEDURE WaitForSequencer() =
BEGIN
IF isSequencer OR sequencer # NIL THEN
IF debug_level >= 15 THEN
debug.print(15, "WaitForSequencer: sequencer defined.");
END;
RETURN;
END;
IF debug_level >= 10 THEN
debug.print(10, "WaitForSequencer: sequencer not defined. " &
"Making ourself a sequencer.");
END;
isSequencer := TRUE;
RETURN;
(*
IF debug_level >= 10 THEN
debug.print(10, "WaitForSequencer: sequencer not defined. Waiting.");
END;
Thread.AlertWait(objTblMu, seqCV);
IF debug_level >= 10 THEN
debug.print(10, "WaitForSequencer: sequencer defined. returning.");
END;
*)
END WaitForSequencer;
PROCEDURE GetDfltSequencer(): ObjectSpace.T =
BEGIN
WaitForSequencer();
IF isSequencer THEN
RETURN localSpace;
ELSE
RETURN sequencer.objSpace;
END;
END GetDfltSequencer;
PROCEDURE GetSequencer(wrep: WireRep): ObjectSpace.T RAISES {Error} =
VAR
objInfo: ObjectInfo.T;
BEGIN
(* If we aren't a sequencer, ask our sequencer who sequences
for this object, or raise and exception if our sequencer
hasn't been set. *)
IF debug_level >= 1 THEN
debug.print(1, "GetSequencer: get seq for " &
EventWireRep.ToText(wrep));
END;
IF NOT isSequencer THEN
IF debug_level >= 10 THEN
debug.print(10, "GetSequencer: not seq. Asking our seq.");
END;
IF sequencer = NIL THEN
RaiseError(Atom.FromText("Sequencer is NIL"));
END;
TRY
RETURN sequencer.objSpace.getSequencer(wrep);
EXCEPT
| NetObj.Error(ec) => SequencerFailed(sequencer, ec);
| Thread.Alerted => SequencerFailed(sequencer, NIL);
END;
END;
LOCK objTblMu DO
(* If we are a sequencer, either ask the sequencer for this
object who sequences it, or return ourself as the sequencer. *)
IF debug_level >= 10 THEN
debug.print(10, "GetSequencer: we are a seq. looking up object.");
END;
IF NOT GetObjInfo(wrep, objInfo) THEN
RaiseError(Atom.FromText("Object doesn't exist"));
END;
END;
IF debug_level >= 10 THEN
debug.print(10, "GetSequencer: found objinfo.");
END;
IF objInfo.sequencer # NIL THEN
TRY
IF debug_level >= 10 THEN
debug.print(10, "GetSequencer: return custom seq " &
SpaceConn.ToText(objInfo.sequencer));
END;
RETURN objInfo.sequencer.objSpace.getSequencer(wrep);
EXCEPT
| NetObj.Error(ec) =>
SequencerFailed(objInfo.sequencer, ec);
| Thread.Alerted =>
SequencerFailed(objInfo.sequencer, NIL);
END;
END;
IF debug_level >= 10 THEN
debug.print(10, "SpaceGetSequencer: return localSpace.");
END;
RETURN localSpace;
END GetSequencer;
PROCEDURE ExportSpace(name: Text.T) RAISES {Error} =
BEGIN
LOCK objTblMu DO
TRY
NetObj.Export("SharedObjRT-" & name, localSpace, NIL);
EXCEPT
| NetObj.Error(ec) => RaiseNetObjFailure(ec);
| Thread.Alerted => RaiseNetObjAlerted();
END;
END;
END ExportSpace;
PROCEDURE ImportSpace (host: Text.T; name: Text.T): ObjectSpace.T
RAISES {Error} =
VAR
agent: NetObj.Address;
space: ObjectSpace.T;
BEGIN
TRY
agent := NetObj.Locate(host);
space := NetObj.Import("SharedObjRT-" & name, agent);
EXCEPT
| NetObj.Invalid =>
RaiseNetObjFailure(AtomList.List1(Atom.FromText("Invalid Hostname")));
| NetObj.Error(ec) => RaiseNetObjFailure(ec);
| Thread.Alerted => RaiseNetObjAlerted();
END;
RETURN space;
END ImportSpace;
PROCEDURE FlushIncomingUpdates() RAISES {Thread.Alerted} =
BEGIN
ep.flushReader();
END FlushIncomingUpdates;
PROCEDURE FlushQueuedUpdates() RAISES {Thread.Alerted} =
BEGIN
ep.flushWork();
END FlushQueuedUpdates;
-------------------SharedObj Procedures-----------------------
PROCEDURE Wait(obj: T; c: Thread.Condition; m: Thread.Mutex := NIL) =
VAR o: ObjectInfo.T := NIL;
BEGIN
IF m = NIL THEN
(* Get the object info, creating a new info entry for objects for whom
this is their first method call. *)
LOCK objTblMu DO
IF NOT GetObjInfo(obj.wrep, o) THEN
o := RegisterObject(obj, obj.wrep, NIL, TRUE, obj.seqNoCnt.value());
END;
END;
Thread.Acquire(o);
m := o;
END;
(* Just before going to sleep, we must tell the event
port that this thread is no longer available for
handling incoming events, if it is such a thread *)
EVAL ep.stealWorker();
obj.mu.wait(m, c);
IF o # NIL THEN
Thread.Release(o);
END;
END Wait;
PROCEDURE AcquireGlobalLock (<*UNUSED*>obj: T) RAISES {Error} =
BEGIN
(* Not implemented yet. Raise exception. *)
RaiseError(Atom.FromText("Locking not yet implemented."));
END AcquireGlobalLock;
PROCEDURE ReleaseGlobalLock (<*UNUSED*>obj: T) RAISES {Error} =
BEGIN
(* Not implemented yet. Raise exception. *)
RaiseError(Atom.FromText("Locking not yet implemented."));
END ReleaseGlobalLock;
PROCEDURE SetTimeliness (<*UNUSED*>obj: T; <*UNUSED*>value: Timeliness)
RAISES {Error} =
BEGIN
(* Not implemented yet. Raise exception. *)
RaiseError(Atom.FromText("Timeliness not yet implemented."));
END SetTimeliness;
PROCEDURE Own (<*UNUSED*>obj: T; <*UNUSED*>willingness: Timeliness := 0)
RAISES {Error} =
BEGIN
(* Not implemented yet. Raise exception. *)
RaiseError(Atom.FromText("Ownership not yet implemented."));
END Own;
PROCEDURE Disown (<*UNUSED*>obj: T) RAISES {Error} =
BEGIN
(* Not implemented yet. Raise exception. *)
RaiseError(Atom.FromText("Ownership not yet implemented."));
END Disown;
---------------------Error Procedures---------------------
PROCEDURE RaiseCommFailure (ec: AtomList.T) RAISES {Error} =
BEGIN
RAISE Error(AtomList.Cons(CommFailure, ec));
END RaiseCommFailure;
PROCEDURE RaiseNetObjFailure (ec: AtomList.T) RAISES {Error} =
BEGIN
RAISE Error(AtomList.Cons(NetObjFailure, ec));
END RaiseNetObjFailure;
PROCEDURE RaiseIPFailure (ec: AtomList.T) RAISES {Error} =
BEGIN
RAISE Error(AtomList.Cons(IPFailure, ec));
END RaiseIPFailure;
PROCEDURE RaiseNetObjAlerted () RAISES {Error} =
BEGIN
RAISE Error(AtomList.List1(NetObjAlerted));
END RaiseNetObjAlerted;
PROCEDURE RaiseAlerted () RAISES {Error} =
BEGIN
RAISE Error(AtomList.List1(Alerted));
END RaiseAlerted;
PROCEDURE RaiseEventFailure (ec: AtomList.T) RAISES {Error} =
BEGIN
RAISE Error(AtomList.Cons(EventFailure, ec));
END RaiseEventFailure;
PROCEDURE RaiseDeadObject () RAISES {Error} =
BEGIN
RaiseError(DeadObject);
END RaiseDeadObject;
PROCEDURE RaiseRecursiveUpdate() RAISES {Error} =
BEGIN
RaiseError(RecursiveUpdate);
END RaiseRecursiveUpdate;
PROCEDURE RaiseError(a: Atom.T) RAISES {Error} =
BEGIN
RAISE Error(AtomList.List1(a));
END RaiseError;
----------------------Debugging-------------------------
PROCEDURE ObjTblToText(): TEXT =
VAR t := "";
wrep: WireRep;
objInfo: ObjectInfo.T;
BEGIN
LOCK objTblMu DO
t := t & "Object Table: " & Fmt.Int(objTbl.size()) & " objects\n";
WITH iterator = objTbl.iterate() DO
WHILE iterator.next(wrep, objInfo) DO
LOCK objInfo DO
t := t & " " & ObjectInfo.ToText(objInfo) & "\n";
WITH obj = GetObjRef(objInfo) DO
IF obj # NIL THEN
t := t & " " & SharedObjRep.ToText(obj) & "\n";
t := t & " " & EventCounter.ToText(obj.seqNoCnt) & "\n";
END;
END;
END;
END;
END;
END;
RETURN t;
END ObjTblToText;
VAR
ep: EventPort.T := NIL;
seqCV : Thread.Condition;
sequencer: SpaceConn.T := NIL;
isSequencer: BOOLEAN := FALSE; (* Are we a sequencer? *)
objTbl: ObjectInfoTbl.T; (* The objects we know about. *)
(* For saving Messages *)
msgMu: MUTEX;
freeMessage: Message.T := NIL;
objCleaner :ObjectCleanerClosure;
BEGIN
(* Standard errors. *)
NetObjFailure := Atom.FromText("SharedObj.NetObjError");
NetObjAlerted := Atom.FromText("SharedObj.NetObjAlerted");
IPFailure := Atom.FromText("SharedObj.IPError");
CommFailure := Atom.FromText("SharedObj.CommFailure");
EventFailure := Atom.FromText("SharedObj.EventError");
DeadObject := Atom.FromText("SharedObj.DeadObject");
Alerted := Atom.FromText("SharedObj.Alerted");
RecursiveUpdate := Atom.FromText("SharedObj.RecursiveUpdate");
(* Want a static sequence number of value 1 *)
zeroSeqNo := EventNumber.New();
oneSeqNo := EventNumber.New();
TRY
oneSeqNo.inc();
EXCEPT
| EventNumber.Overflow =>
END;
debug := NEW(Debug.T).init("SharedObj", 0);
msgMu := NEW(MUTEX);
ep := NEW(EventPort.T).init(FALSE);
TRY
ep.register(ORD(Op.MethodCall), Protocol, MethodDispatcher, NIL);
ep.register(ORD(Op.MethodAck), Protocol, Space, NIL);
EXCEPT
| Event.Error =>
Process.Crash("Failed to register Shared Object Event callback handler");
END;
objTbl := NEW(ObjectInfoTbl.Default).init();
objTblMu := NEW(MUTEX);
objCleaner := NEW(ObjectCleanerClosure).init();
seqCV := NEW(Thread.Condition);
END SharedObjRT.