<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Rambling Comments</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.lenholgate.com/blog/atom.xml" />
    <id>tag:www.lenholgate.com,2010-12-10:/blog//12</id>
    <updated>2010-12-29T14:18:05Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 5.12</generator>

<entry>
    <title>Why not to compile as 64 bit...</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2009/06/why-not-to-compile-as-64-bit.html" />
    <id>tag:www.socketframework.com,2009:/blog//12.904</id>

    <published>2009-06-11T13:06:55Z</published>
    <updated>2010-12-29T14:18:05Z</updated>

    <summary>Here&apos;s a nice piece by Rico Mariani about why Visual Studio is unlikely to go 64 bit any time soon. In a nut shell, unless you have very large data sets that need to be kept in memory you might...</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Geek Speak" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<a href="http://blogs.msdn.com/ricom/archive/2009/06/10/visual-studio-why-is-there-no-64-bit-version.aspx">Here's a nice piece</a> by <a href="http://blogs.msdn.com/ricom">Rico Mariani</a> about why Visual Studio is unlikely to go 64 bit any time soon.  In a nut shell, unless you have very large data sets that need to be kept in memory you might be worse off as a 64 bit process than you are as a 32 bit process on a 64 bit operating system. Food for thought.]]>
        
    </content>
</entry>

<entry>
    <title>Summary of x64 Win32 Debug API issues</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/10/summary-of-x64-win32-debug-api-issues.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.780</id>

    <published>2007-10-04T07:41:35Z</published>
    <updated>2010-12-27T22:00:36Z</updated>

    <summary>I&apos;ve finished porting my debugging tools support libraries to x64 now and thought it was worth putting up a summary of the issues that I&apos;ve noticed: A 32bit exe can&apos;t start a 64bit exe for debugging - pretty obvious really....</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Debugging Tools" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>I've finished porting my debugging tools support libraries to x64 now and thought it was worth putting up a summary of the issues that I've noticed:<br />
</p><ul>
<li>A 32bit exe can't start a 64bit exe for debugging - pretty obvious really.</li><br />
<li>When a 64bit debugger is running a 32bit debugee the debugger seems to get TWO "loader breakpoints" one when the 64bit dlls are loaded and a second when the 32bit dlls have been loaded.</li><br />
<li>In a 32bit debugger running on WOW64 a call to <code>DebugSetProcessKillOnExit()</code> succeeds but doesn't seem to do what it's supposed to do.</li><br />
<li>When a CLR process is started on an x64 machine you can't rely on the image type of the stub to tell you if it will be a native x64 process or an x86 process; the stub for a .Net 2.0 process can be x86 yet can still cause a native x64 CLR host to run the app...</li><br />
<li>When running a CLR app under the Win32 debug interface you only ever seem to hit the native entry point if you're running under WOW64. In all other situations you don't hit the native entry point ever. If you rely on it to pause your debug tools once the process is completely loaded and ready to roll then you need to stick a break point in <code>_CorExeMain</code> in <code>mscoree.dll</code>. What's more, if you're on x64 you might not even be able to access the native entry point's memory...</li><br />
<li>When injecting a dll into a process using the "Richter" thread calls <code>LoadLibrary()</code> approach remember that a) the dll image type (x86/x64) must match the process image type and b) if you're injecting into a 32bit process from a 64bit process you'll need to enumerate the modules in the 32bit process to get the <code>HMODULE</code> to <code>Kernel32.dll</code> so that you're function pointer to <code>LoadLibrary()</code> is offset correctly...</li>
</ul>
And now to update the tools themselves so that they run as 32bit processes with 64bit processes stored as resources (along with the 32bit and 64bit injection dlls) so that they can switch over to 64bit if appropriate and can run natively on 32bit and 64bit OSs and inject into either 32bit or 64bit targets...]]>
        
    </content>
</entry>

<entry>
    <title>x64, IOCP, Socket Server framework</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/10/x64-iocp-socket-server-framework.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.779</id>

    <published>2007-10-03T08:18:06Z</published>
    <updated>2010-12-27T21:59:37Z</updated>

    <summary><![CDATA[The x64 version of our I/O completion port based, networking client and server framework, The&nbsp;Server&nbsp;Framework, is now shipping. This is the licensed version of the free server framework that's available here. An overview of the licensed version can be found...]]></summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Socket Servers" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>The x64 version of our I/O completion port based, networking client and server framework, <a href="http://www.serverframework.com/">The&nbsp;Server&nbsp;Framework</a>, is now shipping. This is the licensed version of the free server framework that's available <a href="http://www.serverframework.com/products---the-free-framework.html">here</a>. An overview of the licensed version can be found <a href="http://www.lenholgate.com/archives/000682.html">here</a>. The changes from that version to the latest version can be found <a href="http://www.serverframework.com/ServerFramework/latest/Docs/sockettoolsreleasenotes.html">here</a>.</p>

<p>The documentation for this version is available online, <a href="http://www.serverframework.com/ServerFramework/latest/Docs/index.html">here</a>. Please be patient, the docs are a work in progress and I know they could be better. </p>

<p>This release sees a first cut at full documentation for all of the example servers; see <a href="http://www.serverframework.com/ServerFramework/latest/Docs/socketsamples.html">here</a>.</p>

<p>Apart from the x64 work this release also includes the changes to our PerfMon library (and therefore supports performance <a href="http://www.lenholgate.com/archives/000699.html">counter installation on Vista</a>, side by side x86 and x64 counter dlls, multiple instances and multiple languages - more details <a href="http://www.lenholgate.com/archives/000706.html">here</a>, docs <a href="http://www.serverframework.com/ServerFramework/latest/Docs/examples-echoservermultiinstanceperf.html">here</a>.).</p>

<p>There are also some changes to our Service library; you can now install multiple 'instances' of a service (essentially your exe can be configured to run as multiple different services) and you can still run these instances without the SCM in the IDE for debugging by simply specifying a command line <a href="http://www.serverframework.com/ServerFramework/latest/Docs/examples-echoserverservice.html">switch</a>. </p>

If you want to integrate with .Net then there are <a href="http://www.serverframework.com/ServerFramework/latest/Docs/examples-echoserverclr.html">CLR hosting samples</a> that allow you to write your business logic in a .Net language and write your networking layer in C++.]]>
        
    </content>
</entry>

<entry>
    <title>WOW64 Win32 DebugAPI and managed code</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/10/wow64-win32-debugapi-and-managed-code.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.778</id>

    <published>2007-10-02T08:48:28Z</published>
    <updated>2010-12-27T21:59:02Z</updated>

    <summary>It seems that I&apos;ve located the &quot;issues&quot; in my Debug Tools library. This library is used in my TickShifter (time control) tool and my native Win32 Deadlock Detection tool. Due to how I wanted to control the debugged processes start...</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Debugging Tools" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>It seems that I've located the "issues" in my Debug Tools library. This library is used in my <a href="http://www.lenholgate.com/archives/000648.html">TickShifter</a> (time control) tool and my <a href="http://www.lenholgate.com/archives/000643.html">native Win32 Deadlock Detection tool</a>. Due to how I wanted to control the debugged processes start up and how I needed to halt the debugged process at a particular time there were some hoops that I found I had to jump through. Those hoops have changed shape; either because of differences between Vista and XP or due to x64 and the WOW64 layer, I'm not sure which yet.</p>

<p>Anyway, when starting a native process under the Debug API it was always easy enough to set a break point in the process' entry point and halt the debugger at that point so that I could inject code and fiddle around. On XP I found that managed processes never hit the native entry point that's written into the PE file and so I had to spot that the process was managed and shove a break point into <code>_CorExeMain</code> in <code>mscoree.dll</code> as that was the nearest alternative. Under x64 using .Net 2.0 I still have to do this (and what's more the entry point in the PE isn't in writable memory, so perhaps it's an offset to a managed entry point...). However, when running with .Net 1.0 or .Net 1.1 on x64 I end up with the WOW64 layer coming to life (which complicates matters a little) and the native entry point IS hit as you'd expect... An added complication is that I can't just use the code that assumes that the native entry point wont be hit and ignore it if it is because under WOW64 I start getting notifications from other threads before my managed entry point is hit and I need to gain control before other threads are running...</p>

<p>Fun, fun, fun... The good news is that I know what's going on now and I expect I can build in some checks that will work out how to take control of the processes that are being started up. I don't really want to look at the managed debug api just yet as that's not really what I need...</p>

Now I just need to work out how to programatically disable the "program has stopped working, dialog" which pops up when my application under test exits due to an exception as my debugger is in control and I don't want windows trying to do 'clever' things for me... And, of course, it's all different under a Win32 build on x64...]]>
        
    </content>
</entry>

<entry>
    <title>x64 Debugger, ExceptionCode == 0x4000001f</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/10/x64-debugger-exceptioncode-0x4000001f.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.777</id>

    <published>2007-10-01T12:50:33Z</published>
    <updated>2010-12-27T19:40:53Z</updated>

    <summary><![CDATA[I should be finishing some docs for the x64 release of The&nbsp;Server&nbsp;Framework... But this is more interesting... When running my Win32 debugging code on x64, this time when compiled natively as x64 code and when debugging an x64 CLR process,...]]></summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Debugging Tools" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>I should be finishing some docs for the x64 release of <a href="http://www.serverframework.com/">The&nbsp;Server&nbsp;Framework</a>... But this is more interesting...</p>

<p>When running my Win32 debugging code on x64, this time when compiled natively as x64 code and when debugging an x64 CLR process, I've been getting an 'unexpected' ExceptionCode in an <code>EXCEPTION_DEBUG_EVENT</code>. The code is 0x4000001f and, after some searching around, it seems that it's a <code>STATUS_WX86_BREAKPOINT</code> event and I sometimes get these instead of <code>EXCEPTION_BREAKPOINT</code> events...</p>

This is a bit of a surprise, some breakpoints that I've set generate the expected debug event and some generate the 0x4000001f one... This isn't too bad to handle in code except for the fact that I'm getting one of these debug events generated for a break point that I havent set and know nothing about...]]>
        
    </content>
</entry>

<entry>
    <title>DebugSetProcessKillOnExit and Win32 processes on x64</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/10/debugsetprocesskillonexit-and-win32-processes-on-x64.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.776</id>

    <published>2007-10-01T09:55:03Z</published>
    <updated>2010-12-27T19:40:36Z</updated>

    <summary>I spent a little time looking at an x64 port of my debugging tools library at the weekend. Since this requires me to set breakpoints and manipulate process memory and image files and all sorts I expected it to be...</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Debugging Tools" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>I spent a little time looking at an x64 port of my debugging tools library at the weekend. Since this requires me to set breakpoints and manipulate process memory and image files and all sorts I expected it to be a little more complex to port than the higher level sockets code and the bulk of my Win32 code. So far things are going reasonably well, but I've just come across a strangeness with <code>DebugSetProcessKillOnExit(TRUE)</code> in an x86 debugger that's running an x86 process on an x64 machine. It seems like when the debug thread terminates the debugged process doesn't get terminated, it should do, but it doesn't... :(</p>

<p>What's more, changing my code to terminate the process forcibly, with <code>TerminateProcess()</code> if my wait for the debugged process to terminate cleanly times out also fails... The call to <code>TerminateProcess()</code> returns without error but the process is still alive and remains that way until the debugger process itself terminates...</p>

My current best guess is that my code is subtly broken and there's a race condition being exposed on my x64 box that never shows up (the tests don't fail) on my x86 box...]]>
        
    </content>
</entry>

<entry>
    <title>How to liquidise perfmon&apos;s guts but still leave the body standing...</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/07/how-to-liquidise-perfmons-guts-but-still-leave-the-body-standing.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.762</id>

    <published>2007-07-19T08:22:16Z</published>
    <updated>2010-12-27T19:34:14Z</updated>

    <summary>I&apos;m still working on my performance counter library. I&apos;ve got parent and child objects working and multiple instances and I have a sample server that publishes performance data using two objects, one for the executable (io threads, sockets and buffers...</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>I'm still working on my <a href="http://www.serverframework.com/products---the-performance-counters-option.html">performance counter library</a>. I've got parent and child objects working and multiple instances and I have a sample server that publishes performance data using two objects, one for the executable (io threads, sockets and buffers in use, etc) and one for each of the server instances within the executable (connections active, bytes/sec, etc). The per server instance counters have the server executable as a parent and it has some totaled up counters for each instance... In turn there's a _Total instance in the server executable object's instances and that totals all executables... You can run multiple servers and they all just plug themselves in to the system and show their counters. It's nice and provides the functionality that one of my clients might need, which is handy, and exposes functionality that should have been exposed anyway...</p>

<p>Once I got all of the above working on my x64 dev box I decided to try a build on my older 32-bit XP box. Everything was good (once I dealt with the fact that the <code>InterlockedIncrement64()</code> family of functions exist in the headers but not in Kernel32.lib on the 32-bit XP box and so I was getting a run-time failure). However, registering the counters caused <code>perfmon</code> on the XP box to hang, it got to the point where it should display counters and just stopped. This was the problem that I was having with the side by side installation of 32-bit and 64-bit counter dlls on the Vista machine... What was strange was the the calls to <code>OutputDebugString()</code> that I'd put into the performance counter dll's <code>Open()</code> call were working, the dll was being opened, the call to open was returning without error and then, at some point after that, <code>perfmon</code> simply died inside. The shell and GUI remained somewhat responsive for a period of time but there was no monitoring going on.</p>

<p>I shut down my boxes, wandered off to the station to meet Gaelle after her skate and let the problem float around in my head looking for a solution... Sometime later I was just about to drift off to sleep when I realised what the issue was. Calling convention. Way back at the start of the project I'd had some issues with getting the counter dll exports working and had changed the calling convention to explicitly be <code>__cdecl</code>. This worked fine, on x64 (because all of the calling convention compiler modifiers are ignored on x64 and there's only one calling convention!) and looked like it worked back on Win32, well it gave the right entry points... However, a moment's thought (or a quick look at this <a href="http://www.codeproject.com/cpp/calling_conventions_demystified.asp">dummy's guide to win32 calling conventions</a>) will reveal that if the calling code expects a function to use <code>__stdcall</code> and the called code is actually using <code>__cdecl</code> then Bad Things will happen when the stack is cleaned up by both parties... Of course the name mangling is supposed to be different to help protect you from this, but, well...</p>

<p>So, this morning I adjusted the code so that it built as <code>__stdcall</code>, well, <code>WINAPI</code> actually, on both platforms and then used some <code>#pragma</code> magic to rename the exports to the desired names on Win32. The result is that I now have side-by-side performance counters working on x64 and the 32-bit code works on XP! Woo!</p>

Tasks for today include writing a test to prevent the calling convention issue biting me again with this code and then adding multi-language counter and help string support. Once that's done it's pretty much all over bar the refactoring.]]>
        
    </content>
</entry>

<entry>
    <title>Performance counter rewrite almost complete</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/07/performance-counter-rewrite-almost-complete.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.759</id>

    <published>2007-07-17T16:54:00Z</published>
    <updated>2010-12-27T19:30:31Z</updated>

    <summary>Around a week ago I started looking at rewriting my performance counter library so that it worked on Vista. That work is almost complete and I&apos;m at the stage where the new library does everything the old one did but...</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Socket Servers" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[Around a week ago <a href="http://www.lenholgate.com/archives/000704.html">I started looking at rewriting</a> my <a href="http://www.serverframework.com/products---the-performance-counters-option.html">performance counter library</a> so that it worked on Vista. That work is almost complete and I'm at the stage where the new library does everything the old one did but there's a list of 'nice to have' new items that I haven't completed yet. The work was reasonably easy once I got into it. I wasted an afternoon or so trying to understand the original code that I'd hacked a little way back in <a href="http://www.lenholgate.com/archives/000551.html">2000</a> and eventually gave up and went to the documentation (and the book from whence the original code came). It's not that the original code was bad in any way, indeed it was clever and tight and worked well, it's just that it was a little obtuse. I'm not convinced that my new code is any less obtuse but at least I've split the code into several classes which just do one thing rather than having a single class with parts of it that are compiled out depending on whether you're building the application that logs data or the dll that collects it... I also wrote the whole thing in a test driven manner, which means I have tests for all of it, which is nice and will make the next step, refactoring it a little, easier.]]>
        <![CDATA[<p>My new design has, at its core, a "data block" class which manages the shared memory and associated interprocess locking that's needed to communicate between the application(s) that are logging and the dll that's collecting. This is where the first of the improvements comes in; the old code always allowed multiple instances of a performance object but they weren't especially easy to manage. The new code makes this much easier. It's now possible for applications to dynamically add and remove counter instances and for multiple applications to connect to different instances of the same counter set. This means that there'll soon be an example server that logs performance information per server instance within a server process and across server processes - which a client currently requires.</p>

<p>The next class is a schema class. This allows you to define your performance objects and replaces the macros and clever compile time construction of the performance objects that the old code allowed. There are some TODO's for the schema class, I'd like to be able to save the structure to a resource in the exe and dll so that you dont need to explicitly build the schema in code in both of them (it's not so terrible to do so, you simply include your custom schema class in each project) but it would make the collection dll's slightly smaller and more efficient if they didn't need to pull in the STL just because of the schema.</p>

<p>Then we have a monitoring class for use by the application, this provides access to the performance objects, instances and their counters. I'm pleased that this class basically just helps you map from the schema to the correct memory blobs in the data block so that actually incrementing a counter is still simply a case of doing an <code>InterlockedIncrement()</code> on a block of shared memory.</p>

<p>Then there's a collector class which is used by the collection dll. This works with the data block to format and return the performance data in the correct way. It doesn't need to do a great deal as most of the data is formatted in the right way in the data block anyway...</p>

<p>Finally there's an installer class that takes a schema and writes out the appropriate registry entries and calls the appropriate APIs to register your counter DLL. This uses a 'file exporter' that takes the schema and writes out an appropriately formatted <code>.h</code> and <code>.ini</code> file into a temporary directory and so that we can call <code>LoadPerfCounterTextStrings()</code>. The installer makes it easy for us to load localised strings for the counter names and help, so there's an open TODO item on the schema class to support this.</p>

<p>I'd like to be able to say that since I wrote all of the code in a test driven manner that when I came to install a performance counter DLL and look at the results in <code>perfmon</code> it just worked. It didn't. The tests made sure that the code did what I understood the spec to be. My understanding was slightly flawed in places and so I needed to do some debugging to get the counters to work. The debugging was pretty easy since the resulting changes were supported by the tests that I had. As I brought my understanding of the spec in line with what the spec actually said and adjusted my tests to suit it was easy to then adjust the code so that the tests passed again. So, next on the list is an example server to show off the mutliple instances stuff and then one that uses multiple languages in the counters.</p>

My only currently outstanding "strangeness" is how to install the 64bit and 32bit counter dlls so that I can run a 64bit version of <code>perfmon</code> locally and a 32bit version remotely... Putting the dlls in <code>System32</code> and <code>SysWOW64</code> doesn't seem to be enough...]]>
    </content>
</entry>

<entry>
    <title>x64 port - a diversion</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/06/x64-port---a-diversion.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.754</id>

    <published>2007-06-14T11:44:45Z</published>
    <updated>2010-12-27T14:14:47Z</updated>

    <summary><![CDATA[The x64 port of The&nbsp;Server&nbsp;Framework is going well. I've run the tests for the OpenSSL servers and things are looking good there; this is always an important stage to get to for me as these servers and their tests really...]]></summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Socket Servers" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>The x64 port of <a href="http://www.serverframework.com/">The&nbsp;Server&nbsp;Framework</a> is going well. I've run the tests for <a href="http://www.serverframework.com/products---the-ssltls-using-openssl-option.html">the OpenSSL servers</a> and things are looking good there; this is always an important stage to get to for me as these servers and their tests really thrash the framework and are good at shaking out any bugs that might be hiding... </p>

<p>So, now I'm faced with the monkey work of adjusting all of the other example servers to build cleanly on all platforms and (in addition to the x64 work) to support either IPv4 or IPv6... My problem is that I now support 5 compilers; VC6 through VS2005  + x64 and, since both I and my clients like being able to work in the IDEs, this means 4 project files to maintain per example. Add to this the fact that when I test the example servers I build and run each of the 5 build configurations on each of the 5 compilers and you can start to realise the amount of work that's ahead... Then when you add in the fact that on most compiler/platform combinations I support either the built in STL or STLPort (various flavours) and also like to be able to build against various flavours of Platform SDK and, well, it's a lot of work...</p>

<p>I'm currently thinking about how to make this a bit easier to manage. I'm switching to VS2005 as my 'every day' compiler which means I need to either manually maintain the other compiler's project files or finally write the converter that I've been thinking about ... Each of the server tests assumes it's the only test running on the machine at the time (they all use the same port) and, besides, they thrash the box... But... I now have two dev boxes and a couple of laptops so a distributed build and test system would be nice, perhaps using VMWare...</p>

So, right now, I'm thinking, and I'm sure that it's best to solve these problems now, rather than plugging on with the monkey work by hand... So, if you're in desperate need for the x64 version of <a href="http://www.serverframework.com/">The&nbsp;Server&nbsp;Framework</a> then get in touch and I'm sure I can put together an interim release for you, but otherwise the official release date is likely to be some time from now...]]>
        
    </content>
</entry>

<entry>
    <title>x64 Socket Server framework</title>
    <link rel="alternate" type="text/html" href="http://www.lenholgate.com/blog/2007/06/x64-socket-server-framework.html" />
    <id>tag:www.socketframework.com,2007:/blog//12.751</id>

    <published>2007-06-07T16:27:34Z</published>
    <updated>2010-12-27T14:12:22Z</updated>

    <summary>My new development box arrived last week. It&apos;s a bit of a monster, dual processor (Intel Xeon E5320 quad core, 1.86 GHz), 8GB ram, and it runs 64bit Vista very nicely indeed. Since it&apos;s an x64 box I have started...</summary>
    <author>
        <name>Len</name>
        
    </author>
    
        <category term="Socket Servers" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="x64" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://www.lenholgate.com/blog/">
        <![CDATA[<p>My new development box arrived last week. It's a bit of a monster, dual processor (Intel Xeon E5320 quad core, 1.86 GHz), 8GB ram, and it runs 64bit Vista very nicely indeed. Since it's an x64 box I have started work on porting <a href="http://www.serverframework.com/">The&nbsp;Server&nbsp;Framework</a> to x64. So far things are going very smoothly. The main issue is that I have, in the past, tended to overuse <code>size_t</code> when I really mean "a reasonable sized unsigned value". Since <code>size_t</code> doesn't really fit the bill for that on x64 most of the changes I've had to make are to reduce <code>size_t</code> counts and lengths to <code>DWORD</code>s. In all honesty, in a lot of cases, they should always have been <code>DWORD</code>s... </p>

I have the framework compiling cleanly and the first of the example servers running nicely, but there's a long way to go until I can ship this version to clients. I have to make sure that all the other libraries of code that depend on the socket tools library and the libraries that it depends on are also clean on x64 and then all the tests have to build and run and pass on all compilers and platforms... As I said when I finished the last major changes to the framework, it's about time I automated all my build and test scenarios...]]>
        
    </content>
</entry>

</feed>



