You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@etch.apache.org by jd...@apache.org on 2009/04/22 19:25:51 UTC
svn commit: r767594 [7/43] - in /incubator/etch/trunk/binding-c/runtime/c:
./ ext/ ext/hashtab/ ext/lib/ inc/ lib/ project/ project/$etchstop/
project/bin/ project/etch/ project/logcli/ project/logsrv/ project/notes/
project/test/ project/test/logcli/ ...
Added: incubator/etch/trunk/binding-c/runtime/c/inc/etchutl.h
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/inc/etchutl.h?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/inc/etchutl.h (added)
+++ incubator/etch/trunk/binding-c/runtime/c/inc/etchutl.h Wed Apr 22 17:25:43 2009
@@ -0,0 +1,92 @@
+/* $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version
+ * 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * etchutl.h -- utility methods
+ */
+
+#ifndef ETCHUTL_H
+#define ETCHUTL_H
+
+#include "etch_arrayval.h"
+#include "etchhash.h"
+
+#define ETCH_ARRAYTYPE_NONE 0
+#define ETCH_ARRAYTYPE_NATIVE 1
+#define ETCH_ARRAYTYPE_LIST 2
+#define ETCH_ARRAYTYPE_ARRAYVAL 3
+
+typedef struct etch_arrayinfo
+{
+ int numdims;
+ int numitems;
+ unsigned char array_type;
+ unsigned char is_content_object;
+
+} etch_arrayinfo;
+
+
+etch_arraylist* get_map_keys(etch_hashtable*);
+
+etch_arraylist* get_map_values(etch_hashtable*);
+
+int is_etcharray(objmask*, etch_arrayinfo*);
+
+int hexchar_to_int (const unsigned char hexchar);
+int hexwchar_to_int(const wchar_t hexwchar);
+
+int etchlog_countfiles(char* dirpath);
+int etchlog_purgefiles(char* dirpath, const int, const int);
+int etch_existsfile(char* path);
+
+
+#if IS_WINDOWS_ETCH
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * etch windows emulation of POSIX directory browsing functions
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+typedef struct dirent /* directory entry descriptor */
+{ /* *nix includes various other fields but dirent.d_name is usual reference
+ * and using it as our only field lets us cast a string to a dirent*
+ */
+ wchar_t d_name [MAXPATHSIZE+1];
+} dirent;
+
+
+typedef struct DIR /* "directory stream" descriptor */
+{
+ void* dirhandle; /* HANDLE */
+ wchar_t dirname[1];
+} DIR;
+
+
+DIR* opendir (char *dirname);
+dirent* readdir (DIR*);
+int closedir (DIR*);
+void rewinddir(DIR*);
+
+#else /* IS_WINDOWS_ETCH */
+
+#include "dirent.h" /* linux opendir, readir, etc. */
+
+#endif /* IS_WINDOWS_ETCH */
+
+
+#endif /* #ifndef ETCHUTL_H */
\ No newline at end of file
Added: incubator/etch/trunk/binding-c/runtime/c/inc/etchwarn.h
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/inc/etchwarn.h?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/inc/etchwarn.h (added)
+++ incubator/etch/trunk/binding-c/runtime/c/inc/etchwarn.h Wed Apr 22 17:25:43 2009
@@ -0,0 +1,25 @@
+/* $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version
+ * 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _UNICODE
+#pragma message("WARNING: _UNICODE not defined")
+#endif
+
+#ifndef UNICODE
+#pragma message("WARNING: UNICODE not defined")
+#endif
\ No newline at end of file
Added: incubator/etch/trunk/binding-c/runtime/c/project/$etchstop/$etchstop.vcproj
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/%24etchstop/%24etchstop.vcproj?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/$etchstop/$etchstop.vcproj (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/$etchstop/$etchstop.vcproj Wed Apr 22 17:25:43 2009
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="$etchstop"
+ ProjectGUID="{F6652EA0-E9D5-4BBF-A31E-650F79163D0B}"
+ RootNamespace="etchstop"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(APRPATH)\inc""
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;APR_DECLARE_STATIC"
+ MinimalRebuild="false"
+ ExceptionHandling="0"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ WarnAsError="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="1"
+ CompileAs="1"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/NODEFAULTLIB:LIBCMTD"
+ AdditionalDependencies="apr-1.lib WS2_32.LIB"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories=""$(APRPATH)\lib""
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\src\support\etch_stop.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ <File
+ RelativePath="..\..\..\..\..\..\..\..\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib\MsWSock.Lib"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
Added: incubator/etch/trunk/binding-c/runtime/c/project/debugnotes.txt
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/debugnotes.txt?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/debugnotes.txt (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/debugnotes.txt Wed Apr 22 17:25:43 2009
@@ -0,0 +1,474 @@
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+I M M E D I A T E T O D O
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+O P E N B U G S
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+BUG: DEADEND LEAK IN SERVER WHEN A MESSAGE IS REJECTED
+==========================================================
+description
+-----------
+when a message arrives at server, and is rejected (forwarded), the message leaks.
+
+symptoms
+---------
+leaks are logged
+
+analysis
+----------
+message is i believe session_notify()'ed, and is apparently never destroyed at that terminal.
+
+
+
+BUG: CLIENT READ THREAD DESTRUCTION EXCEPTION IN destroy_hashtable()
+=====================================================================
+
+SYMPTOMS
+1. usually happens in destroy_plainmailboxmgr()::ETCHOBJ_DESTROY(thisx->mailboxes);
+ but if this is commented out, will occur at some other destroy_hashtable().
+
+2. occurs at the jenkins refree:: free(x); call which exceptions in crt _output_l()
+ trying to write some humongous text.
+
+ANALYSIS
+1. the fact that it exceptions somewhere else when we comment out the exception call,
+ may mean that we have recently corrupted the heap.
+ a. back up from crash and try to find where heap may have been clobbered.
+
+2. it always happens on the stress run, even with a single message, but
+ it does not *usually* occur during the singles run, so what is the defining event?
+
+3. it does not occur outside the debugger.
+ it always occurs in the debugger, at ETCHOBJ_DESTROY(thisx->mailboxes);
+
+4. call stack:
+ perftest_threadproc_add():
+ a. result = remote->remote_base->start_waitup (remote->remote_base, p->waitms);
+ b. etch_int32* resultobj = remote->add (remote, new_int32(1000000000), new_int32(2000000000));
+ c. ETCHOBJ_DESTROY(resultobj);
+ d. result = remote->remote_base->stop_waitdown (remote->remote_base, p->waitms);
+ perftest_threadproc_add(): calls ETCHOBJ_DESTROY(remote);
+ destroy_perf_remote_server() calls ETCHOBJ_DESTROY(thisx->client_factory);
+ destroy_etch_client_factory() calls ETCHOBJ_DESTROY(thisx->dsvc);
+ destroy_delivery_service_via_interface() calls deliveryservice_implobj->destroy (deliveryservice_implobj);
+ destroy_tcp_delivery_service() calls ETCHOBJ_DESTROY(((etch_mailbox_manager*) thisx->mailboxmgr));
+ destroy_plainmailboxmgr() calls ETCHOBJ_DESTROY(thisx->mailboxes);
+ destroy_hashtable_default() calls destroy_hashtable
+ destroy_hashtable() calls map->vtab->hdestroy(map->realtable)
+ jenkins_destroy() calls hdestroy((htab*) realtable);
+ hdestroy() calls refree()
+ refree() calls free()
+ free() calls _free_dbg()
+ _free_dbg() calls HeapFree()
+ msvcr80d.dll::_output_l crashes
+
+5. experiment to remove stop_waitdown() from perftest_threadproc_add()
+ to see if exception stops.
+ a. if exception does stop, the stop_waitdown() clobbered the heap.
+ b. first thing we noticed was that with stop_waitdown() removed, the behavior was unchanged
+ outside the debugger, i.e., no leaks, good result.
+ c. however inside the debugger, the exception happens at the same spot.
+ d. CONCLUSION: the problem must be higher in perftest_threadproc_add()
+
+6. log state on breaking just prior to ETCHOBJ_DESTROY(remote):
+ 0202 165504 CONX D connxn 1 start receive pump
+ 0202 165504 CONX D connxn 1 thread 1 receiving ...
+ 0202 165504 CONX X connxn 1 begin blocking receive ...
+ 0202 165506 CONX X connxn 1 begin send
+ 0202 165506 CONX D connxn 1 end send 46 bytes
+ 0202 165508 TRAN X reading mailbox (wait 3000) ...
+ 0202 165508 CONX D connxn 1 end receive 46 bytes
+ 0202 165508 MBOX X etchmbox_message acquiring mailbox read lock
+ 0202 165510 MBOX X tcpdelsvc_endcall acquiring mailbox read lock
+ 0202 165510 MBOX X etchmbox_message releasing mailbox read lock
+ 0202 165510 MBOX X tcpdelsvc_endcall releasing mailbox read lock
+ 0202 165510 CONX D connxn 1 thread 1 receiving ...
+ 0202 165510 CONX X connxn 1 begin blocking receive ...
+
+7. experiment: try removing read lock set and reset
+ a. tried that but it reintroduced the race condition crash that existed before we put the locks in.
+
+8. experiment: try removing the remote->add and just do the start and stop.
+ a. OK that gets rid of the exception at the ETCHOBJ_DESTROY(remote); hdestroy(); jenkhtab::refree() calls;
+ b. this is a good clue
+ c. now add stuff back - first determine what we are in process of freeing at the exception,
+ then find where this gets previously freed after remote->add
+ d. ETCHOBJ_DESTROY(mboxmgr->mailboxes);
+ e. find the destructor being called and breakpoint there to see if called twice
+ dtor is just destroy_hashtable
+ f. so instead, find where "mailboxes" is instantiated, save the pointer globally,
+ and in destroy_hashtable, test to see if hashtable is that global address.
+ g. when we remove the particular hdestroy(), the crash simply moves elsewhere to a HeapAlloc() or a HeapFree.
+ meaning the problem is not with a hashtable at all, it is due to a corrupt heap.
+ h. ask: what is the diff between the verify tests and this stress test call?
+ run a verify add() again and see if the same heap problem exists. yes, it exists there as well.
+
+9. FOUND CODE triggering heap corruption
+ ----------------------------------------------
+ *** if we comment out the imailbox free the heap corruption is no longer evident however the imailbox object leaks.
+ *** perhaps then this free is not the actual problem but somehow triggers the problem.
+ xmpl_perf_remote_server::perf_remote_add()
+ result = perf_remote_dispose_mailbox (thisx, &mbox);
+ int destroy_mailbox(etch_plainmailbox* thisx)
+ etch_free(thisx->imailbox); // comment out and heap issue gone but this item leaks
+
+10. TEST POINTS
+
+ 0. xmpl_perf_client_main.c:: int _tmain (int argc, _TCHAR* argv[])
+ result = perf_xmpl_test_server (uri, new_perf_client, waitms);
+
+ 1. xmpl_perf_client_tests.c:: int perf_xmpl_test_server (wchar_t* uri, new_client_funcptr user_ctor, const int waitms)
+ #if(1)
+ etchlog (ETCHTEST, ETCHLOG_INFO, "run perf add test ...\n");
+ result = run_perftest ("add", uri, waitms, runtime, trials, numthreads,
+ perftest_threadproc_add, user_ctor);
+ #endif
+
+ 2. xmpl_perf_client_tests.c:: int run_perftest (char* descr, wchar_t* uri, const int waitms, const int runtime,
+ const int count, const int threads, perftest_threadproc testproc, new_client_funcptr new_perfclient)
+
+ //mask = "%s %d took %f -- trying %d to get >= 1 second\n";
+ //while(time < 1.0)
+ //{
+ // if (time > 0.1)
+ // etchlog(ETCHTEST, ETCHLOG_INFO, mask, descr, oldn, time, n);
+ // oldn = n;
+ // time = perftest_run_one(&perftest, n, testproc);
+ // n *= 2;
+ //}
+ n = oldn;
+
+
+ 3. xmpl_perf_client_tests.c:: int perftest_threadproc_add (perftestobj* p)
+ //while(iterations--) /* execute perf.add() n times */
+ //{
+ // etch_int32* resultobj = remote->add (remote, new_int32(1000000000), new_int32(2000000000));
+ // assert(resultobj);
+ // ETCHOBJ_DESTROY(resultobj);
+ //}
+
+
+ 4. perf_remote_server.c:: etch_int32* perf_remote_add (perf_remote_server* thisx, etch_int32* x, etch_int32* y)
+
+ i_mailbox* mbox = perf_remote_add_begin (thisx, x, y);
+
+ if (mbox)
+ { // TESTING NOTE we can comment the _end() call out without leaking anything
+ resultobj = perf_remote_add_end (thisx, mbox);
+
+ // another thing to try - comment prior mailbox access to see if problem is there.
+ result = perf_remote_dispose_mailbox (thisx, &mbox);
+ }
+
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+F I X E D B U G S
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+BUG: CLIENT MAILBOX READ TIMEOUT *** F I X E D ***
+=================================
+
+description
+-----------
+a. there is a race condition wherein a mailbox write does not complete thru notify
+ before a mailbox read completes and the service destroys itself.
+ mutexes and waits do not seem to work, they deadlock, apparently on same thread.
+ we added a sleep in stop_perf_client() to see if this forces write to complete.
+ however we would prefer to have write complete before read starts.
+ *** could we possibly signal the read wait when we finish writing, rather than
+ at etchqueue_put_withwait(), earlier in the same function (etchmbox_message)?
+ currently etch_apr_queue_push() does apr_thread_cond_signal(queue->not_empty);
+ we would have to pull this way out to the tcp client receive listener on_data call,
+ in order to leave as little of the write stack as possible unwound after the
+ mailbox read kicks in and completes. see Q: who calls etchmbox_message()
+ for the entire call stack from mailbox down to receive listener proc.
+
+ HOW ABOUT if we establish a callback on the mailbox close which accesses the
+ mutex? need to start at "stopping perf client ..." and find the best spot
+ on the main thread to wait on the mutex set in mailbox.message().
+
+ if we can pass a mutex into perf from client main, which get acquired in etchmbox_message(),
+ we can also acquire it in stop_perf_client(), which causes the thread to continue.
+ first trace start_perf_client to see how we can get the mutex up to the mailbox.
+
+ we should pass the mutex in via the parameter bundle.
+ we should still be able to prevent reads from occuring until write has completed and vv,
+ but we need to find where we can lock the read from outside of the receive thread, to do so.
+ this should be in tcpdelsvc_endcall()
+
+b. if the mailbox read times out, the message leaks. seems to be just the message, not wrapper.
+ it would seem that the message is eventually in the mailbox however, is it?
+ if so it should be wrapped but also should be destroyed with the mailbox.
+ if not, what happens to the message?
+ ideally the message is either redelivered, destroyed if not redelivered, or remains
+ in the mailbox and is destroyed with the mailbox. so why does the message leak?
+
+notes - leak case
+-----------------
+___ in etch_plainmailbox.c: etchmbox_read_result()
+ *out = new_mailbox_element (NULL, NULL); **** LEAKS ****
+___ in perf_remote_server.c: perf_remote_add_end()
+ we return the leaked object to perf_remote_add()
+___ in perf_remote_server.c: perf_remote_add()
+ we return the leaked object to perf_xmpl_verify_server()
+___ in perf_xmpl_verify_server()
+ the leaked object is addresult. we ETCHOBJ_DESTROY(addresult);
+
+todo
+------------
+___ the short-circuited code is in etchremote_stop_waitdown. NO LONGER SHORTED
+___ etch_tcpconx_transport_control CLASSID_CONTROL_STOP now if client does etch_tcpclient_stop_listener,
+ it appears as if either client or server can just do etch_tcpconx_close()
+___ after etch_tcpconx_closem etch_tcpclient object can perhaps be destroyed in perf_remote_server destructor
+ which is invoked from [main].
+___ mailbox read times out even though wait is infinite. THOUGHT 2B FIXED BUT STILL TIMES OUT 50% OF TIME
+ a. first do mailbox test to test wait mechanism ALL TESTS PASS INCLUDING READ WAITS
+ b. test wait ms -1 OK this means DO NOT WAIT
+ c. then trace start waitup
+___ determine where waitms gets set to -1, since it starts out zero
+ NO IT DOES NOT it is the start/wait that is zero, the mailbox wait is per-type.
+ we now specify ETCH_DEFAULT_MAILBOX_READ_WAITMS to force a short wait.
+
+to investigate:
+---------------
+___ see redeliver() in etchmbox_close_read() for possible leaks.
+OK_ TODO close the socket forcibly instead of sending data, in etch_tcpclient_stop_listener
+___ there may be connection closes and mailbox reads going on at the same time, investigate and synchronize perhaps.
+ we've got a stop_perf_client() going on on top of a mbox.close_read(). the stop_perf_client() closes the client listener,
+ the close_read closes what?
+
+
+
+
+BUG: URI DISAPPEARS AFTER ONE ROUND TRIP TO SERVER * * * F I X E D * * *
+==================================================
+description
+-----------
+the uri allocated on the stack in main is no longer present after one test.
+
+analysis
+--------
+it may be the case that it is simply cleared out by the URL parser. investigate.
+
+call sequence
+-------------
+1. _tmain
+2. perf_xmpl_test_server(uri)
+3. run_perftest("add", uri, perftest_threadproc_add);
+4. perftest_run_one(perftestparams, perftest_threadproc_add)
+5. perftest_run_threads(perftestparams, perftest_threadproc_add)
+6. perftest_threadproc_add
+7. perf_remote_server* remote = new_remote_server (p->uri, impl_factory);
+8. deliverysvc = new_etch_transport (uri, (etch_factory_params*) p, NULL);
+9a. etch_url* url = new_url(uri);
+9b. i_delivery_service* newds = new_etch_transport_a (url, params, conximpl);
+ uri is still OK to this point. it is 0x00454070
+9c. url->destroy(url);
+ uri is still OK
+10. (perf_remote_add) i_mailbox* mbox = perf_remote_add_begin (thisx, x, y);
+11. (perf_remote_add) resultobj = perf_remote_add_end (thisx, mbox);
+ uri is still OK
+12. (perf_remote_add) perf_remote_dispose_mailbox (thisx, &mbox);
+13. (perftest_threadproc_add) return from etch_int32* resultobj = remote->add (remote, ...));
+14. (perftest_threadproc_add) ETCHOBJ_DESTROY(remote);
+15. (destroy_perf_remote_server) ETCHOBJ_DESTROY(thisx->remote_base);
+16. (destroy_perf_remote_server) ETCHOBJ_DESTROY(thisx->server_base);
+17. (destroy_perf_remote_server) ETCHOBJ_DESTROY(thisx->client_factory);
+18. (etch_transport.c destroy_etch_client_factory)
+19. (etch_transport.c destroy_etch_client_factory ETCHOBJ_DESTROY(thisx->dsvc);
+20. (etch_transport.c destroy_tcp_delivery_service) ETCHOBJ_DESTROY(((etch_mailbox_manager*) thisx->mailboxmgr));
+ *** the above triggers the stack problem - note that we previously destroyed the mailbox in (12), this is significant.
+21. (destroy_etch_client_factory) uri is still OK after destroying the delivery service.
+22. (xmpl_perf.client_tests.c perf_xmpl_test_server) i is now 1, numthreadcounts is now 2, uri is still OK
+ run_perftest ("add", uri, perftest_threadproc_add); see (3)
+23. (xmpl_perf.client_tests.c run_perftest) perftest_run_one (perftest_threadproc_add);
+24. (xmpl_perf.client_tests.c perftest_run_one) perftest_run_threads (perftestobj, perftest_threadproc_add)
+ note that uri is still good and that perftestobj.uri is 0x00454070
+24. (xmpl_perf.client_tests.c perftest_run_threads)
+ for(; i < p->threads; i++) etch_thread* newthread = pool->run (pool, runner, p);
+25. (etch_thread.c etch_threadpool_run_freethread)
+26. (etch_threadpool_run_freethread) newthread->start (newthread);
+27. (xmpl_perf.client_tests.c perftest_threadproc_add (perftestobj* p)) // OK the perftestobj here is now invalid
+ perf_remote_server* remote = new_remote_server (p->uri, impl_factory);
+ NOTE that the original uri memory is still OK, but the perftestobj object passed to the threadproc is bad,
+ therefore the uri extracted from this object is garbage.
+ **** THE PROBLEM is that etch_apr_threadproc passes etch_threadparams* to the threadproc, (perftestobj is params.data)
+ whereas when we're unthreaded we pass a perftestobj
+
+
+
+BUG: ETCH HEAP ERROR AFTER DESTROYING CLIENT RESOURCES * * * F I X E D * * *
+=======================================================
+description
+-----------
+when a client runs a service on simultaneous threads, all threads after the first crash on
+etch_transport::destroy_etch_client_factory(): ETCHOBJ_DESTROY(thisx->in_resx);
+WRONG: actually the crash is in the perftest_threadproc_add thread, since threadparams.is_own_data = TRUE,
+we etch_free(userdata). recall that userdata is the perftestobj.
+
+symptoms
+---------
+0211 150537 TRAN D destroying resources ...
+0211 150537 MEMX E etch heap tracking store missing key '0012feb8'
+
+analysis
+---------
+the same resources are passed to all threads. one or more objects in resources are destroyed in the first thread
+and then an ateempt is made to destroy them again.
+a. eventually we want to get rid of the reources map, not sure if this is the time to do so.
+b. explore possibility of factory not owning resources.
+ 1. Q: where is client factory allocated/populated?
+ A: etch_transport::new_client_factory (objmask* session, i_session* isession, new_client_funcptr)
+ called from: helper::start_perf_client (wchar_t* uri, new_client_funcptr);
+ HOWEVER resources have not been populated yet.
+ 2. Q: where are resources populated to client factory?
+ A: helper::new_remote_server (uri, etch_client_factory)
+ there does not seem to be anything volatile populated in resources there
+ 3. Q: what does the resx destruction crash on?
+ A: it doesn't. the crash is on the message thread exit, when the thread exit handler frees userdata.
+ and userdata is the perftestobj.
+ 4. Q: where is the perftestobj allocated?
+ A: it is allocated on the run_perftest() stack (!!!!)
+ 5. Q: since it is on the stack, why didn't it crash on the main thread test?
+ A: because the main thread test does not go thru the thread exit proc.
+ 6: Q: should we try to clone the user params, or should we set the thread to not destroy params?
+ A: threadpool.is_free_data *should* control whether the pool's threads free their userdata.
+ THAT FIXED IT!
+
+
+BUG: FOPEN() ABSOLUTE PATHS CHANGE WHEN RUNNING IN DEBUGGER * * * F I X E D * * *
+============================================================
+description
+-----------
+when running from command line, "../logsrv/etchserver.log" is "C:\workspace\etch\src\etch\bindings\c\project\logsrv"
+when running in debugger, it is "C:\workspace\etch\src\etch\bindings\c\project\xamples\xmpl_perf\xmpl_perf_server\logsrv"
+NOTE that this will be a similar problem for the config file.
+
+symptoms
+---------
+fails to open log file, since subdirectory does not exist.
+
+analysis
+----------
+possible solution 1: ensure directory exists using c runtime
+possible solution 2: don't use a subdirectory, use file extensions of ".srvlog" and ".clilog"
+
+resolution
+----------
+1. create log directory prior to log open ../srvlog or ../clilog
+2. expect config file in ../etch-c-server.properties or ../etch-c-client.properties
+
+
+
+BUG: LOG FILES WILL CONTINUE TO ACCUMULATE * * * F I X E D * * *
+===========================================
+description
+-----------
+log files will accumulate in the log directories without manual intervention
+
+analysis
+----------
+need a logfile back filename generator
+need portable directory file enumeration code
+at startup or when log file lines exceed configured maximum, need code to rename log file to backup.
+when log file count exceeds configured maximum, need code to purge some number of files from log directory
+
+resolution
+----------
+1. coded and tested POSIX-style (dirent) functions for directory browsing (etchutl.h).
+ these are compiled in windows builds. presumably in linux builds the c runtime dirent functions will work the same.
+2. added code to create backup log file names
+3. added code to backup log files
+4. added code to purge log files
+
+
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+F A Q
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+Q: where do we catch mailbox read timeout?
+A: etch_transport::tcpdelsvc_endcall() calls mbox->read_withwait ()
+
+Q: what is call stack prior leading up to mailbox read?
+A: perf_xmpl_verify_server() calls remote->add(1,2);
+ perf_remote_add() calls perf_remote_add_end (mailbox
+ perf_remote_add_end() calls remote_base->end_call (imailbox, &result);
+ etchremote_endcall() calls deliveryservice->end_call(mailbox);
+ tcpdelsvc_endcall() calls mailbox->read_withwait(timeoutms, &mailboxelt);
+ etchmbox_read_withwait() calls etchqueue_get_withwait(delay, out);
+ etchqueue_get_withwait() calls etch_apr_queue_pop(wait_usec, out);
+
+Q: what is call stack for client data receive?
+A: etch_tcpclient_listenerproc
+ etch_tcpclient_on_data()
+ etch_pktizer_session_data
+ etch_msgizer_session_packet
+ pmboxmgr_session_message *** here we do pmboxmgr_get_mailbox() *** check if mbox closed here
+ etchmbox_message
+ etchmbox_fire_notify (etch_plainmailbox* thisx)
+
+Q: what are values for infinite wait, and no wait?
+A: #define ETCH_INFWAIT 0
+ #define ETCH_NOWAIT (-1)
+
+Q: where is timeout value for mailbox reads determined?
+A: tcpdelsvc_endcall()
+ etch_type_impl* typeinfo = response_type? (etch_type_impl*) response_type->impl: NULL;
+ timeout = typeinfo->timeout > 0? typeinfo->timeout: ETCH_DEFAULT_MAILBOX_READ_WAITMS;
+
+Q: where is the message return object created, what is the return chain, and where is it destroyed?
+A: return object is created either in etchmbox_check_read_result(), called from etchmbox_read()
+ or etchmbox_read_withwait(), or in etchmbox_message(), calling new_mailbox_element(), called
+ when the message is queued to the mailbox. if the etchmbox_read is successful, the
+ etch_mailbox_element return object is the object read from the mailbox queue, otherwise the
+ return object is instantiated only to host the resultant exception.
+
+Q: who calls etchmbox_message() to queue a message to mailbox?
+A: pmboxmgr_session_message(), called by etch_msgizer_session_packet() via
+ is_message_handled = (0 == thisx->session->session_message (thisx->session->thisx, whofrom, msg));
+ *** this is also where the inbound message is created and can be destroyed if unwanted
+ this is called by etch_pktizer_session_data via
+ pzr->session->session_packet (pzr->session->thisx, whofrom, fbuf);
+ this is called by etch_tcpconxn.c::etch_tcpclient_on_data() via
+ session->session_data (session->thisx, NULL, data)))
+ this is called by etch_tcpclient_listenerproc() via cx->on_data (cx, 0, result, fbuf);
+
+ SO the tcp receive listener is at the head of the stack, owning the call stack up through the
+ mailbox waiting to be unwound. IT WOULD BE GOOD IF WE COULD EXIT THIS THREAD FIRST rather than
+ last when we tear down.
+
+Q: where is inbound message created?
+A: see previous question.
+
+Q: what is the return path of an exception arriving at the client returned from a one-way message?
+A. * messagizer.session_packet calls tdi.read_message().
+ * messagizer.session_packet calls session.session_message(), with the message.
+ * mailboxmgr.session_message calls get_mailbox(in_reply_to), returning error because there is none.
+ * messagizer.session_packet calls session.session_notify(), passing a new unwanted message.
+ * mailboxmgr.session_notify calls deliverysvc.session_notify().
+ * deliverysvc.session_notify calls stub.session_notify().
+ * etchstub.session_notify calls etchstub_session_notify_ex with the stub's _obj which is the EXECLIENTIMPL.
+ * etchstub_session_notify_ex gets the session callbacks from the client impl object.
+ * etchsession_def_session_notify destroys the payload (the exception message) and returns.
+
+
+Q: what is call sequence for client main calling stop_xxxx_client()?
+A: * etchremote_stop_waitdown()
+ * etchremote_transport_control()
+ * tcpdelsvc_transport_control()
+ * pmboxmgr_transport_control()
+ * msgizer_transport_control()
+ * pktizer_transport_control()
+ * tcpconx_transport_control()
+ * tcpclient_stop_listener()
+ * tcpconx_closex()
+
+
+
+
+
+
\ No newline at end of file
Added: incubator/etch/trunk/binding-c/runtime/c/project/etch-c-client.properties
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/etch-c-client.properties?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/etch-c-client.properties (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/etch-c-client.properties Wed Apr 22 17:25:43 2009
@@ -0,0 +1,21 @@
+#
+# etch c binding client configuration file etch-c-client.properties
+#
+
+logLevel = "X" # X, D, I, W, E
+memoryWatchID = 0 # allocation ID for heap tracking: if > 0 DEBUGGER BREAK occurs
+isLogToFile = 1 # (1/0) log to file
+isLogToConsole = 1 # (1/0) log to console
+isDisplayMemoryLeakDetail = 1 # (1/0) log individual leaked memory allocations
+isDestroyMessagesWithMailbox = 1 # (1/0) destroy any remaining messages when destroying mailbox
+isValidateOnWrite = 1 # (1/0) invoke validators when writing message parameters
+defaultMailboxReadWaitms = 3000 # -1 no wait, 0 use internal default, > 0 timeout in millseconds
+sleepSecondsPriorClientExit = 0 # test client sleep after tests complete - normally zero
+
+testString = foobar; # should elicit semicolon warning from parser
+
+
+
+
+
+
Added: incubator/etch/trunk/binding-c/runtime/c/project/etch-c-server.properties
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/etch-c-server.properties?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/etch-c-server.properties (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/etch-c-server.properties Wed Apr 22 17:25:43 2009
@@ -0,0 +1,19 @@
+#
+# etch c binding server side configuration file etch-c-server.properties
+#
+
+logLevel = "X" # X, D, I, W, E
+memoryWatchID = 0 # allocation ID for heap tracking: if > 0 DEBUGGER BREAK occurs
+isLogToFile = 1 # (1/0) log to file
+isLogToConsole = 1 # (1/0) log to console
+isDisplayMemoryLeakDetail = 1 # (1/0) log individual leaked allocations
+isDestroyMessagesWithMailbox = 1 # (1/0) destroy any remaining messages when destroying mailbox
+isValidateOnWrite = 1 # (1/0) invoke validators when writing message parameters
+
+# testString = foobar; # this line will elicit a semicolon warning from parser
+
+
+
+
+
+
Added: incubator/etch/trunk/binding-c/runtime/c/project/etch-c.sln
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/etch-c.sln?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/etch-c.sln (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/etch-c.sln Wed Apr 22 17:25:43 2009
@@ -0,0 +1,316 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "etch", "etch\etch.vcproj", "{858504A1-BA1B-47B1-834A-4993B633F9A4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xamples", "xamples", "{2DB68E23-7E57-4452-ADC2-D04797A03ED2}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution items", "solution items", "{DCC674BF-DBE1-4698-876C-C6D4A268FBEF}"
+ ProjectSection(SolutionItems) = preProject
+ notes\todo.txt = notes\todo.txt
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "notes", "notes", "{26DD31E0-875A-44E7-9337-16691F60FC88}"
+ ProjectSection(SolutionItems) = preProject
+ notes\accepted.txt = notes\accepted.txt
+ notes\array.txt = notes\array.txt
+ notes\assignable.txt = notes\assignable.txt
+ notes\clientsession.txt = notes\clientsession.txt
+ debugnotes.txt = debugnotes.txt
+ notes\packet.txt = notes\packet.txt
+ notes\run.txt = notes\run.txt
+ notes\servexe.txt = notes\servexe.txt
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{02B7DD4B-4770-4C31-968F-6FC9778782DC}"
+ ProjectSection(SolutionItems) = preProject
+ test\test-readme-first.txt = test\test-readme-first.txt
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{4870CCF9-A246-4981-B22B-A59FE65EC087}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "message", "message", "{F7369390-5BAB-418C-823F-09E99AED521D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "support", "support", "{F2178333-ED41-45CE-BC08-122362330563}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "transport", "transport", "{B273E98C-CCA4-49C4-A194-9EE529B800FF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_allocator", "test\test_allocator\test_allocator.vcproj", "{9D561956-7962-45B7-9DFE-E3A114534CC7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {858504A1-BA1B-47B1-834A-4993B633F9A4} = {858504A1-BA1B-47B1-834A-4993B633F9A4}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_arraylist", "test\test_arraylist\test_arraylist.vcproj", "{84DED881-0E5C-4218-B981-4F9D2E9448CA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_assignment", "test\test_assignment\test_assignment.vcproj", "{42A0BA98-B199-4CA0-AA59-6EDFF376E193}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_cache", "test\test_cache\test_cache.vcproj", "{5504E4BC-AA75-45F8-A8B4-060CE1B2E3AE}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_etchobject", "test\test_etchobject\test_etchobject.vcproj", "{40FDF4B3-2C70-4213-819A-71ECBCC8CAF1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_flexbuf", "test\test_flexbuf\test_flexbuf.vcproj", "{8EBC71B4-992B-48C3-BAE0-2B00EB9DE2EB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_hashing", "test\test_hashing\test_hashing.vcproj", "{76BBAC3B-168E-4C52-9774-818730886537}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_hashtable", "test\test_hashtable\test_hashtable.vcproj", "{0129BDDD-C6EA-42B4-8941-C4D5281643D9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_iterator", "test\test_iterator\test_iterator.vcproj", "{76B6EFEF-0C29-46C1-BEC8-9378847BBA86}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_arrayvalue", "test\test_arrayvalue\test_arrayvalue.vcproj", "{B1A0942D-9C49-4339-8CD8-A790D3AE573C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_binarytditdo", "test\test_binarytditdo\test_binarytditdo.vcproj", "{ADA0E60B-5592-44E3-8822-B392368776CB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_defvalufact", "test\test_defvalufact\test_defvalufact.vcproj", "{ADDAC8DC-1E51-42DF-A81A-1775C7DBDF1D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_field", "test\test_field\test_field.vcproj", "{45DA3528-D67B-4564-93C0-AE5682AFD5B8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_idname", "test\test_idname\test_idname.vcproj", "{1DB7CDAF-62A1-425D-BC66-B7F4600637DA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_message", "test\test_message\test_message.vcproj", "{0CAE3F5A-F353-4C9F-BCFE-E63B9E05C046}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_structvalue", "test\test_structvalue\test_structvalue.vcproj", "{0403656D-FE78-46AE-B7CF-5A42D3B1DDBC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_type", "test\test_type\test_type.vcproj", "{98FA4624-86A2-40D5-B225-0ED6B8B05ECA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {858504A1-BA1B-47B1-834A-4993B633F9A4} = {858504A1-BA1B-47B1-834A-4993B633F9A4}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_validator", "test\test_validator\test_validator.vcproj", "{EB6BFFFB-AFD9-4261-A18E-DA5B77C05045}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_stub", "test\test_stub\test_stub.vcproj", "{328CE2CF-B2C7-4236-9BC7-304FEB8C7282}"
+ ProjectSection(ProjectDependencies) = postProject
+ {858504A1-BA1B-47B1-834A-4993B633F9A4} = {858504A1-BA1B-47B1-834A-4993B633F9A4}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_mailboxmgr", "test\test_mailboxmgr\test_mailboxmgr.vcproj", "{F6E6F8C0-5A0B-45EE-B9E1-DABA41EA222B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_messagizer", "test\test_messagizer\test_messagizer.vcproj", "{262CF558-3BF6-4618-8DEE-1D0CB2B86221}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_packetizer", "test\test_packetizer\test_packetizer.vcproj", "{389AFED9-BBC0-40DA-B404-02B97F12CE17}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_plainmailbox", "test\test_plainmailbox\test_plainmailbox.vcproj", "{6C336037-08B2-4AA3-A11B-5613753F036D}"
+ ProjectSection(ProjectDependencies) = postProject
+ {858504A1-BA1B-47B1-834A-4993B633F9A4} = {858504A1-BA1B-47B1-834A-4993B633F9A4}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_queue", "test\test_queue\test_queue.vcproj", "{49F868CF-15AA-418C-A63F-76DD6DED477E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_tcpconn", "test\test_tcpconn\test_tcpconn.vcproj", "{BA19E78D-4C03-4751-9538-42482BECFBD9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {858504A1-BA1B-47B1-834A-4993B633F9A4} = {858504A1-BA1B-47B1-834A-4993B633F9A4}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_threadpool", "test\test_threadpool\test_threadpool.vcproj", "{55786A73-E53B-4AAA-B59E-E44A972B23B6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_transport", "test\test_transport\test_transport.vcproj", "{EC735A75-FB7A-42A5-BB8F-2656EECC3239}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_url", "test\test_url\test_url.vcproj", "{C0B217EF-184F-4130-9379-0E2EC23830BA}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xmpl_perf", "xmpl_perf", "{B5E41AA2-E7EB-46B5-B647-7444B4C93B06}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmpl_perf_client", "xamples\xmpl_perf\xmpl_perf_client\xmpl_perf_client.vcproj", "{DE24F3F4-A5CB-43DE-9187-6F1846CB5A15}"
+ ProjectSection(ProjectDependencies) = postProject
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5} = {FE0F6ED2-5880-4FB8-9C62-917BE97712D5}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmpl_perf_server", "xamples\xmpl_perf\xmpl_perf_server\xmpl_perf_server.vcproj", "{D5EF8211-999C-4FB5-9218-DDCFD51D0611}"
+ ProjectSection(ProjectDependencies) = postProject
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5} = {FE0F6ED2-5880-4FB8-9C62-917BE97712D5}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_remote", "test\test_remote\test_remote.vcproj", "{45456E09-7986-4697-ACEE-A717148636B1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "$etchstop", "$etchstop\$etchstop.vcproj", "{F6652EA0-E9D5-4BBF-A31E-650F79163D0B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmpl_perflib", "xamples\xmpl_perf\xmpl_perflib\xmpl_perflib.vcproj", "{FE0F6ED2-5880-4FB8-9C62-917BE97712D5}"
+ ProjectSection(ProjectDependencies) = postProject
+ {858504A1-BA1B-47B1-834A-4993B633F9A4} = {858504A1-BA1B-47B1-834A-4993B633F9A4}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {858504A1-BA1B-47B1-834A-4993B633F9A4}.Debug|Win32.ActiveCfg = Debug|Win32
+ {858504A1-BA1B-47B1-834A-4993B633F9A4}.Debug|Win32.Build.0 = Debug|Win32
+ {858504A1-BA1B-47B1-834A-4993B633F9A4}.Release|Win32.ActiveCfg = Release|Win32
+ {858504A1-BA1B-47B1-834A-4993B633F9A4}.Release|Win32.Build.0 = Release|Win32
+ {9D561956-7962-45B7-9DFE-E3A114534CC7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9D561956-7962-45B7-9DFE-E3A114534CC7}.Debug|Win32.Build.0 = Debug|Win32
+ {9D561956-7962-45B7-9DFE-E3A114534CC7}.Release|Win32.ActiveCfg = Release|Win32
+ {9D561956-7962-45B7-9DFE-E3A114534CC7}.Release|Win32.Build.0 = Release|Win32
+ {84DED881-0E5C-4218-B981-4F9D2E9448CA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {84DED881-0E5C-4218-B981-4F9D2E9448CA}.Debug|Win32.Build.0 = Debug|Win32
+ {84DED881-0E5C-4218-B981-4F9D2E9448CA}.Release|Win32.ActiveCfg = Release|Win32
+ {84DED881-0E5C-4218-B981-4F9D2E9448CA}.Release|Win32.Build.0 = Release|Win32
+ {42A0BA98-B199-4CA0-AA59-6EDFF376E193}.Debug|Win32.ActiveCfg = Debug|Win32
+ {42A0BA98-B199-4CA0-AA59-6EDFF376E193}.Debug|Win32.Build.0 = Debug|Win32
+ {42A0BA98-B199-4CA0-AA59-6EDFF376E193}.Release|Win32.ActiveCfg = Release|Win32
+ {42A0BA98-B199-4CA0-AA59-6EDFF376E193}.Release|Win32.Build.0 = Release|Win32
+ {5504E4BC-AA75-45F8-A8B4-060CE1B2E3AE}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5504E4BC-AA75-45F8-A8B4-060CE1B2E3AE}.Debug|Win32.Build.0 = Debug|Win32
+ {5504E4BC-AA75-45F8-A8B4-060CE1B2E3AE}.Release|Win32.ActiveCfg = Release|Win32
+ {5504E4BC-AA75-45F8-A8B4-060CE1B2E3AE}.Release|Win32.Build.0 = Release|Win32
+ {40FDF4B3-2C70-4213-819A-71ECBCC8CAF1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {40FDF4B3-2C70-4213-819A-71ECBCC8CAF1}.Debug|Win32.Build.0 = Debug|Win32
+ {40FDF4B3-2C70-4213-819A-71ECBCC8CAF1}.Release|Win32.ActiveCfg = Release|Win32
+ {40FDF4B3-2C70-4213-819A-71ECBCC8CAF1}.Release|Win32.Build.0 = Release|Win32
+ {8EBC71B4-992B-48C3-BAE0-2B00EB9DE2EB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8EBC71B4-992B-48C3-BAE0-2B00EB9DE2EB}.Debug|Win32.Build.0 = Debug|Win32
+ {8EBC71B4-992B-48C3-BAE0-2B00EB9DE2EB}.Release|Win32.ActiveCfg = Release|Win32
+ {8EBC71B4-992B-48C3-BAE0-2B00EB9DE2EB}.Release|Win32.Build.0 = Release|Win32
+ {76BBAC3B-168E-4C52-9774-818730886537}.Debug|Win32.ActiveCfg = Debug|Win32
+ {76BBAC3B-168E-4C52-9774-818730886537}.Debug|Win32.Build.0 = Debug|Win32
+ {76BBAC3B-168E-4C52-9774-818730886537}.Release|Win32.ActiveCfg = Release|Win32
+ {76BBAC3B-168E-4C52-9774-818730886537}.Release|Win32.Build.0 = Release|Win32
+ {0129BDDD-C6EA-42B4-8941-C4D5281643D9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0129BDDD-C6EA-42B4-8941-C4D5281643D9}.Debug|Win32.Build.0 = Debug|Win32
+ {0129BDDD-C6EA-42B4-8941-C4D5281643D9}.Release|Win32.ActiveCfg = Release|Win32
+ {0129BDDD-C6EA-42B4-8941-C4D5281643D9}.Release|Win32.Build.0 = Release|Win32
+ {76B6EFEF-0C29-46C1-BEC8-9378847BBA86}.Debug|Win32.ActiveCfg = Debug|Win32
+ {76B6EFEF-0C29-46C1-BEC8-9378847BBA86}.Debug|Win32.Build.0 = Debug|Win32
+ {76B6EFEF-0C29-46C1-BEC8-9378847BBA86}.Release|Win32.ActiveCfg = Release|Win32
+ {76B6EFEF-0C29-46C1-BEC8-9378847BBA86}.Release|Win32.Build.0 = Release|Win32
+ {B1A0942D-9C49-4339-8CD8-A790D3AE573C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B1A0942D-9C49-4339-8CD8-A790D3AE573C}.Debug|Win32.Build.0 = Debug|Win32
+ {B1A0942D-9C49-4339-8CD8-A790D3AE573C}.Release|Win32.ActiveCfg = Release|Win32
+ {B1A0942D-9C49-4339-8CD8-A790D3AE573C}.Release|Win32.Build.0 = Release|Win32
+ {ADA0E60B-5592-44E3-8822-B392368776CB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ADA0E60B-5592-44E3-8822-B392368776CB}.Debug|Win32.Build.0 = Debug|Win32
+ {ADA0E60B-5592-44E3-8822-B392368776CB}.Release|Win32.ActiveCfg = Release|Win32
+ {ADA0E60B-5592-44E3-8822-B392368776CB}.Release|Win32.Build.0 = Release|Win32
+ {ADDAC8DC-1E51-42DF-A81A-1775C7DBDF1D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {ADDAC8DC-1E51-42DF-A81A-1775C7DBDF1D}.Debug|Win32.Build.0 = Debug|Win32
+ {ADDAC8DC-1E51-42DF-A81A-1775C7DBDF1D}.Release|Win32.ActiveCfg = Release|Win32
+ {ADDAC8DC-1E51-42DF-A81A-1775C7DBDF1D}.Release|Win32.Build.0 = Release|Win32
+ {45DA3528-D67B-4564-93C0-AE5682AFD5B8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {45DA3528-D67B-4564-93C0-AE5682AFD5B8}.Debug|Win32.Build.0 = Debug|Win32
+ {45DA3528-D67B-4564-93C0-AE5682AFD5B8}.Release|Win32.ActiveCfg = Release|Win32
+ {45DA3528-D67B-4564-93C0-AE5682AFD5B8}.Release|Win32.Build.0 = Release|Win32
+ {1DB7CDAF-62A1-425D-BC66-B7F4600637DA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1DB7CDAF-62A1-425D-BC66-B7F4600637DA}.Debug|Win32.Build.0 = Debug|Win32
+ {1DB7CDAF-62A1-425D-BC66-B7F4600637DA}.Release|Win32.ActiveCfg = Release|Win32
+ {1DB7CDAF-62A1-425D-BC66-B7F4600637DA}.Release|Win32.Build.0 = Release|Win32
+ {0CAE3F5A-F353-4C9F-BCFE-E63B9E05C046}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0CAE3F5A-F353-4C9F-BCFE-E63B9E05C046}.Debug|Win32.Build.0 = Debug|Win32
+ {0CAE3F5A-F353-4C9F-BCFE-E63B9E05C046}.Release|Win32.ActiveCfg = Release|Win32
+ {0CAE3F5A-F353-4C9F-BCFE-E63B9E05C046}.Release|Win32.Build.0 = Release|Win32
+ {0403656D-FE78-46AE-B7CF-5A42D3B1DDBC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0403656D-FE78-46AE-B7CF-5A42D3B1DDBC}.Debug|Win32.Build.0 = Debug|Win32
+ {0403656D-FE78-46AE-B7CF-5A42D3B1DDBC}.Release|Win32.ActiveCfg = Release|Win32
+ {0403656D-FE78-46AE-B7CF-5A42D3B1DDBC}.Release|Win32.Build.0 = Release|Win32
+ {98FA4624-86A2-40D5-B225-0ED6B8B05ECA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {98FA4624-86A2-40D5-B225-0ED6B8B05ECA}.Debug|Win32.Build.0 = Debug|Win32
+ {98FA4624-86A2-40D5-B225-0ED6B8B05ECA}.Release|Win32.ActiveCfg = Release|Win32
+ {98FA4624-86A2-40D5-B225-0ED6B8B05ECA}.Release|Win32.Build.0 = Release|Win32
+ {EB6BFFFB-AFD9-4261-A18E-DA5B77C05045}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EB6BFFFB-AFD9-4261-A18E-DA5B77C05045}.Debug|Win32.Build.0 = Debug|Win32
+ {EB6BFFFB-AFD9-4261-A18E-DA5B77C05045}.Release|Win32.ActiveCfg = Release|Win32
+ {EB6BFFFB-AFD9-4261-A18E-DA5B77C05045}.Release|Win32.Build.0 = Release|Win32
+ {328CE2CF-B2C7-4236-9BC7-304FEB8C7282}.Debug|Win32.ActiveCfg = Debug|Win32
+ {328CE2CF-B2C7-4236-9BC7-304FEB8C7282}.Debug|Win32.Build.0 = Debug|Win32
+ {328CE2CF-B2C7-4236-9BC7-304FEB8C7282}.Release|Win32.ActiveCfg = Release|Win32
+ {328CE2CF-B2C7-4236-9BC7-304FEB8C7282}.Release|Win32.Build.0 = Release|Win32
+ {F6E6F8C0-5A0B-45EE-B9E1-DABA41EA222B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F6E6F8C0-5A0B-45EE-B9E1-DABA41EA222B}.Debug|Win32.Build.0 = Debug|Win32
+ {F6E6F8C0-5A0B-45EE-B9E1-DABA41EA222B}.Release|Win32.ActiveCfg = Release|Win32
+ {F6E6F8C0-5A0B-45EE-B9E1-DABA41EA222B}.Release|Win32.Build.0 = Release|Win32
+ {262CF558-3BF6-4618-8DEE-1D0CB2B86221}.Debug|Win32.ActiveCfg = Debug|Win32
+ {262CF558-3BF6-4618-8DEE-1D0CB2B86221}.Debug|Win32.Build.0 = Debug|Win32
+ {262CF558-3BF6-4618-8DEE-1D0CB2B86221}.Release|Win32.ActiveCfg = Release|Win32
+ {262CF558-3BF6-4618-8DEE-1D0CB2B86221}.Release|Win32.Build.0 = Release|Win32
+ {389AFED9-BBC0-40DA-B404-02B97F12CE17}.Debug|Win32.ActiveCfg = Debug|Win32
+ {389AFED9-BBC0-40DA-B404-02B97F12CE17}.Debug|Win32.Build.0 = Debug|Win32
+ {389AFED9-BBC0-40DA-B404-02B97F12CE17}.Release|Win32.ActiveCfg = Release|Win32
+ {389AFED9-BBC0-40DA-B404-02B97F12CE17}.Release|Win32.Build.0 = Release|Win32
+ {6C336037-08B2-4AA3-A11B-5613753F036D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6C336037-08B2-4AA3-A11B-5613753F036D}.Debug|Win32.Build.0 = Debug|Win32
+ {6C336037-08B2-4AA3-A11B-5613753F036D}.Release|Win32.ActiveCfg = Release|Win32
+ {6C336037-08B2-4AA3-A11B-5613753F036D}.Release|Win32.Build.0 = Release|Win32
+ {49F868CF-15AA-418C-A63F-76DD6DED477E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {49F868CF-15AA-418C-A63F-76DD6DED477E}.Debug|Win32.Build.0 = Debug|Win32
+ {49F868CF-15AA-418C-A63F-76DD6DED477E}.Release|Win32.ActiveCfg = Release|Win32
+ {49F868CF-15AA-418C-A63F-76DD6DED477E}.Release|Win32.Build.0 = Release|Win32
+ {BA19E78D-4C03-4751-9538-42482BECFBD9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {BA19E78D-4C03-4751-9538-42482BECFBD9}.Debug|Win32.Build.0 = Debug|Win32
+ {BA19E78D-4C03-4751-9538-42482BECFBD9}.Release|Win32.ActiveCfg = Release|Win32
+ {BA19E78D-4C03-4751-9538-42482BECFBD9}.Release|Win32.Build.0 = Release|Win32
+ {55786A73-E53B-4AAA-B59E-E44A972B23B6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {55786A73-E53B-4AAA-B59E-E44A972B23B6}.Debug|Win32.Build.0 = Debug|Win32
+ {55786A73-E53B-4AAA-B59E-E44A972B23B6}.Release|Win32.ActiveCfg = Release|Win32
+ {55786A73-E53B-4AAA-B59E-E44A972B23B6}.Release|Win32.Build.0 = Release|Win32
+ {EC735A75-FB7A-42A5-BB8F-2656EECC3239}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EC735A75-FB7A-42A5-BB8F-2656EECC3239}.Debug|Win32.Build.0 = Debug|Win32
+ {EC735A75-FB7A-42A5-BB8F-2656EECC3239}.Release|Win32.ActiveCfg = Release|Win32
+ {EC735A75-FB7A-42A5-BB8F-2656EECC3239}.Release|Win32.Build.0 = Release|Win32
+ {C0B217EF-184F-4130-9379-0E2EC23830BA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C0B217EF-184F-4130-9379-0E2EC23830BA}.Debug|Win32.Build.0 = Debug|Win32
+ {C0B217EF-184F-4130-9379-0E2EC23830BA}.Release|Win32.ActiveCfg = Release|Win32
+ {C0B217EF-184F-4130-9379-0E2EC23830BA}.Release|Win32.Build.0 = Release|Win32
+ {DE24F3F4-A5CB-43DE-9187-6F1846CB5A15}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DE24F3F4-A5CB-43DE-9187-6F1846CB5A15}.Debug|Win32.Build.0 = Debug|Win32
+ {DE24F3F4-A5CB-43DE-9187-6F1846CB5A15}.Release|Win32.ActiveCfg = Release|Win32
+ {DE24F3F4-A5CB-43DE-9187-6F1846CB5A15}.Release|Win32.Build.0 = Release|Win32
+ {D5EF8211-999C-4FB5-9218-DDCFD51D0611}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D5EF8211-999C-4FB5-9218-DDCFD51D0611}.Debug|Win32.Build.0 = Debug|Win32
+ {D5EF8211-999C-4FB5-9218-DDCFD51D0611}.Release|Win32.ActiveCfg = Release|Win32
+ {D5EF8211-999C-4FB5-9218-DDCFD51D0611}.Release|Win32.Build.0 = Release|Win32
+ {45456E09-7986-4697-ACEE-A717148636B1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {45456E09-7986-4697-ACEE-A717148636B1}.Debug|Win32.Build.0 = Debug|Win32
+ {45456E09-7986-4697-ACEE-A717148636B1}.Release|Win32.ActiveCfg = Release|Win32
+ {45456E09-7986-4697-ACEE-A717148636B1}.Release|Win32.Build.0 = Release|Win32
+ {F6652EA0-E9D5-4BBF-A31E-650F79163D0B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F6652EA0-E9D5-4BBF-A31E-650F79163D0B}.Debug|Win32.Build.0 = Debug|Win32
+ {F6652EA0-E9D5-4BBF-A31E-650F79163D0B}.Release|Win32.ActiveCfg = Release|Win32
+ {F6652EA0-E9D5-4BBF-A31E-650F79163D0B}.Release|Win32.Build.0 = Release|Win32
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5}.Debug|Win32.Build.0 = Debug|Win32
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5}.Release|Win32.ActiveCfg = Release|Win32
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {B5E41AA2-E7EB-46B5-B647-7444B4C93B06} = {2DB68E23-7E57-4452-ADC2-D04797A03ED2}
+ {26DD31E0-875A-44E7-9337-16691F60FC88} = {DCC674BF-DBE1-4698-876C-C6D4A268FBEF}
+ {4870CCF9-A246-4981-B22B-A59FE65EC087} = {02B7DD4B-4770-4C31-968F-6FC9778782DC}
+ {F7369390-5BAB-418C-823F-09E99AED521D} = {02B7DD4B-4770-4C31-968F-6FC9778782DC}
+ {F2178333-ED41-45CE-BC08-122362330563} = {02B7DD4B-4770-4C31-968F-6FC9778782DC}
+ {B273E98C-CCA4-49C4-A194-9EE529B800FF} = {02B7DD4B-4770-4C31-968F-6FC9778782DC}
+ {9D561956-7962-45B7-9DFE-E3A114534CC7} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {84DED881-0E5C-4218-B981-4F9D2E9448CA} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {42A0BA98-B199-4CA0-AA59-6EDFF376E193} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {5504E4BC-AA75-45F8-A8B4-060CE1B2E3AE} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {40FDF4B3-2C70-4213-819A-71ECBCC8CAF1} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {8EBC71B4-992B-48C3-BAE0-2B00EB9DE2EB} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {76BBAC3B-168E-4C52-9774-818730886537} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {0129BDDD-C6EA-42B4-8941-C4D5281643D9} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {76B6EFEF-0C29-46C1-BEC8-9378847BBA86} = {4870CCF9-A246-4981-B22B-A59FE65EC087}
+ {B1A0942D-9C49-4339-8CD8-A790D3AE573C} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {ADA0E60B-5592-44E3-8822-B392368776CB} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {ADDAC8DC-1E51-42DF-A81A-1775C7DBDF1D} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {45DA3528-D67B-4564-93C0-AE5682AFD5B8} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {1DB7CDAF-62A1-425D-BC66-B7F4600637DA} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {0CAE3F5A-F353-4C9F-BCFE-E63B9E05C046} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {0403656D-FE78-46AE-B7CF-5A42D3B1DDBC} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {98FA4624-86A2-40D5-B225-0ED6B8B05ECA} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {EB6BFFFB-AFD9-4261-A18E-DA5B77C05045} = {F7369390-5BAB-418C-823F-09E99AED521D}
+ {328CE2CF-B2C7-4236-9BC7-304FEB8C7282} = {F2178333-ED41-45CE-BC08-122362330563}
+ {45456E09-7986-4697-ACEE-A717148636B1} = {F2178333-ED41-45CE-BC08-122362330563}
+ {F6E6F8C0-5A0B-45EE-B9E1-DABA41EA222B} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {262CF558-3BF6-4618-8DEE-1D0CB2B86221} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {389AFED9-BBC0-40DA-B404-02B97F12CE17} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {6C336037-08B2-4AA3-A11B-5613753F036D} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {49F868CF-15AA-418C-A63F-76DD6DED477E} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {BA19E78D-4C03-4751-9538-42482BECFBD9} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {55786A73-E53B-4AAA-B59E-E44A972B23B6} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {EC735A75-FB7A-42A5-BB8F-2656EECC3239} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {C0B217EF-184F-4130-9379-0E2EC23830BA} = {B273E98C-CCA4-49C4-A194-9EE529B800FF}
+ {DE24F3F4-A5CB-43DE-9187-6F1846CB5A15} = {B5E41AA2-E7EB-46B5-B647-7444B4C93B06}
+ {D5EF8211-999C-4FB5-9218-DDCFD51D0611} = {B5E41AA2-E7EB-46B5-B647-7444B4C93B06}
+ {FE0F6ED2-5880-4FB8-9C62-917BE97712D5} = {B5E41AA2-E7EB-46B5-B647-7444B4C93B06}
+ EndGlobalSection
+EndGlobal
Added: incubator/etch/trunk/binding-c/runtime/c/project/etch/etch.vcproj
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/etch/etch.vcproj?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/etch/etch.vcproj (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/etch/etch.vcproj Wed Apr 22 17:25:43 2009
@@ -0,0 +1,739 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="etch"
+ ProjectGUID="{858504A1-BA1B-47B1-834A-4993B633F9A4}"
+ RootNamespace="etch"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\inc;..\..\ext\hashtab;"$(APRPATH)\inc";"
+ PreprocessorDefinitions="WIN32;_DEBUG;_LIB;APR_DECLARE_STATIC"
+ MinimalRebuild="false"
+ ExceptionHandling="0"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ WarnAsError="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="1"
+ CompileAs="1"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ OutputFile="..\..\lib\$(ProjectName).lib"
+ AdditionalLibraryDirectories=""
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="4"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\src\common\etch_apr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_arraylist.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_arrayval.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_collection.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_config.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_encoding.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_global.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_linklist.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etch_natarray.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_syncobj.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_url.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchexcp.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchflexbuf.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchhash.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchhashfunc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchlog.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchmap.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchmem.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchobj.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchrun.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\common\etchutl.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="message"
+ >
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_field.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_id_name.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_message.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_structval.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_tagdata.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_type.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_validator.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_valufact.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="transport"
+ >
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_binary_tdi.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_binary_tdo.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_connection.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_conxevent.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_mailboxint.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_mailboxmgr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_messagizer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_packetizer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_plainmailbox.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_plainmboxmgr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_sessiondata.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_sessionint.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_sessionlisten.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_sessionmsg.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_sessionpkt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_simpletimer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_sourceint.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_tagdata_inp.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_tagdata_out.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_tcpconxn.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_tcpserver.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_tdformat.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_transport.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_transportdata.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_transportint.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_transportmsg.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_transportpkt.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etchmutex.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etchthread.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="support"
+ >
+ <File
+ RelativePath="..\..\src\bindings\msg\etch_defvalufact.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\transport\etch_queue.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_queue_apr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_remote.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\bindings\support\etch_resources.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_serializer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_stub.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\support\etch_threadpool_apr.c"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <Filter
+ Name="common"
+ >
+ <File
+ RelativePath="..\..\inc\etch.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_apr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_arraylist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_arrayval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_collection.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_config.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_encoding.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_global.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_linklist.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_svcobj_masks.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_syncobj.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_url.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchdefs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchexcp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchflexbuf.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchhash.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchlog.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchmap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchmem.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchobj.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchobjtypes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchrun.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchutl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchwarn.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="message"
+ >
+ <File
+ RelativePath="..\..\inc\etch_field.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_id_name.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_message.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_structval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_tagdata.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_type.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_validator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_valufact.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchmsgutl.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="transport"
+ >
+ <File
+ RelativePath="..\..\inc\etch_binary_tdi.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_binary_tdo.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_connection.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_mailboxint.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_mailboxmgr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_messagizer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_packetizer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_plainmailbox.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_plainmboxmgr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_sessiondata.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_sessionint.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_sessionlisten.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_sessionmsg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_sessionpkt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_simpletimer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_sourceint.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_tagdata_inp.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_tagdata_out.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_tcpconxn.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_tcpserver.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_tdformat.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_transport.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_transportdata.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_transportint.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_transportmsg.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_transportpkt.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchmutex.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etchthread.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="support"
+ >
+ <File
+ RelativePath="..\..\inc\etch_defvalufact.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_queue.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_queue_apr.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_remote.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_resources.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_serializer.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\inc\etch_stub.h"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
Added: incubator/etch/trunk/binding-c/runtime/c/project/notes/accepted.txt
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-c/runtime/c/project/notes/accepted.txt?rev=767594&view=auto
==============================================================================
--- incubator/etch/trunk/binding-c/runtime/c/project/notes/accepted.txt (added)
+++ incubator/etch/trunk/binding-c/runtime/c/project/notes/accepted.txt Wed Apr 22 17:25:43 2009
@@ -0,0 +1,121 @@
+ =====================================================
+ c accepted
+ =====================================================
+
+tcpxfact_session_accepted (i_sessionlistener* thisx, etch_socket* socket)
+
+ ETCH_RESXKEY_SOCKET
+ delivery_service = new_etch_transport_a (url, resources);
+
+ params->server_stub = HELPER.new_helper_accepted_server (etch_server_factory* p)
+
+ perf_remote_client* client = new_remote_client (0, ds, vf);
+
+ i_perf_server* iserver = p->main_new_server (p);
+ perf_remote_client* client = (perf_remote_client*) p->client;
+ perf_server_impl* newserver = new_perf_server_impl (client);
+ return newserver->perf_server_base;
+
+ perf_server_stub* stub = new_perf_server_stub (p);
+
+ stub->destroy = destroy_stub_object; /* private */
+ stub->destroyex = destroy_my_server_stub; /* public */
+
+ stub->stub_base = new_stub (implobj, stubtype, ids, qp, fp);
+ stubbase->ds->mbm->set_session (ds, stubbase->isessionmsg);
+ stubbase->impl_callbacks = etchstub_get_session_callbacks_from (implobj);
+
+ stub->stub_base->stubobj = (objmask*) newstub;
+ stub->stub_base->params = params;
+ set stub helper run procedures for each message type.
+
+ // delivery.itm is mailbox manager. its transport_control was overriden to
+ // tcpdelsvc_transport_control in tcpdelsvc_init().
+ // this in turn calls tcpds->transport->transport_control()
+ // delivery.transport is the mailbox manager.
+
+ delivery_service->itm->transport_control (CONTROL_START);
+
+
+ =====================================================
+ java accepted
+ =====================================================
+
+ TcpListener.onSessionAccepted(socket)
+
+ resources.add(socket);
+ DeliveryService = newTransport();
+
+
+ new TcpConnection();
+ TcpConnection implements TransportData
+ send(buffer);
+ C-NOTE: OK, etch_tcp_connection.its is i_transportdata, etch_tcpconx_transport_data does the send()
+ C-QUESTION: etch_tcp_connection.transport_control etc. where are they assigned? should they be same as itd?
+ implements Transport
+ TransportQuery(START, STOP, etc),
+ TransportControl (START, STOP, etc)
+ TcpConnection HOSTS SessionData as session.
+ NOTE: SessionData (including sessionData()), is null until set by inheritor (Packetizer).
+ this.session.sessionData(buffer) is invoked by this.fireData(buffer);
+
+ new Packetizer(TcpConnection(transport));
+ (NOTE: Packetizer.transport IS-A TransportData, but Packetizer IMPLEMENTS TransportPacket);
+
+ this.transport = TcpConnection.TransportData;
+ C-NOTE: HERE'S HOW:
+ C-NOTE: TcpConnection's TransportData interface is passed to Packetizer's ctor
+ C-NOTE THIS AND ALL SUBSEQUENT: it is only necessary to replace each method if we do not destroy
+ and replace the transport object. otherwise we would destroy existing transport object,
+ and simply replace that with the transport object passed in the ctor.
+ Packetizer.transport.transportData = TcpConnection.TransportData;
+ Packetizer.transport.transportControl = TcpConnection.transportControl; ETC. ETC. query and notify
+ Packetizer.transportPacket has new logic, and then calls Packetizer.transport.transportData().
+ Packetizer.transportControl, Notify, and Query, call Packetizer.transport.transportControl, Query, Notify.
+
+ Tcpconnection.setSession(this);
+ C-NOTE: HERE'S HOW: TcpConnection HOSTS SessionData
+ TcpConnection.sessionData = Packetizer.sessionData; C-NOTE: does tcpconx even have a session_data()?
+ TcpConnection.sessionControl = Packetizer.sessionControl; ETC. ETC. query and notify
+
+
+ new Messagizer(Packetizer(TransportPacket));
+ (NOTE: Messagizer.transport IS-A TransportPacket, but Messagizer IMPLEMENTS TransportMessage);
+
+ this.transport = Packetizer.TransportPacket
+ C-NOTE: HERE'S HOW:
+ C-NOTE: Packetizer's TransportPacket interface is passed to Messagizer's ctor
+ Messagizer.transport.transportPacket = Packetizer.transportPacket;
+ Messagizer.transport.transportControl = Packetizer.transportControl; ETC. ETC.
+
+ Packetizer.setSession(this);
+ C-NOTE: HERE'S HOW: Packetizer IMPLEMENTS SessionData but HOSTS SessionPacket. Messagizer IMPLEMENTS SessionPacket
+ Packetizer.session.sessionPacket = Messagizer.sessionPacket;
+ Packetizer.session.sessionControl = Messagizer.sessionControl; ETC. ETC.
+
+
+ new PlainMailboxManager(Messagizer(transport));
+ (NOTE: MailboxManager.transport IS-A TransportMessage, AND MailboxManager EXTENDS TransportMessage);
+
+ this.transport = Messagizer.TransportMessage;
+ C-NOTE: HERE'S HOW: C-NOTE: Messagizer's i_transportmessage is passed in MailboxManager ctor
+ MailboxManager.transport.TransportMessage = Messagizer.TransportMessage
+ MailboxManager.transport.TransportControl = Messagizer.TransportControl; ETC. ETC.
+
+ Messagizer.setSession(this);
+ C-NOTE: HERE'S HOW: Messagizer IMPLEMENTS SessionPacket but HOSTS SessionMessage. MailboxManager EXTENDS SessionMessage
+ Messagizer.session.sessionMessage = MailboxManager.sessionMessage;
+ Messagizer.session.sessionControl = MailboxManager.sessionControl; ETC. ETC.
+
+
+ new DefaultDeliveryService(MailboxManager(transport));
+ NOTE: DeliveryService transport IS-A MBM IS-A TransportMessage, AND DeliveryService EXTENDS TransportMessage
+
+ this.transport = MailboxManager ;
+ C-NOTE: HERE'S HOW:
+ delsvc->transport = mboxmgr->imanager; OR: THE FOLLOWING
+ delsvc->transport->transportMessage = mboxmgr->transportMessage; ETC ETC ETC
+
+ MailboxManager.setSession(this);
+ C-NOTE: HERE'S HOW: MailboxManager EXTENDS SessionMessage AND HOSTS SessionMessage. DeliveryService EXTENDS SessionMessage
+ MailboxManager.session.sessionMessage = delsvc->sessionMessage; ETC ETC ETC
\ No newline at end of file