Re: [python-qpid] Blocking on dead sockets
On 12/03/2010 01:34 PM, Andrew Stitcher wrote: On Wed, 2010-12-01 at 15:18 +0300, Dmitry Konishchev wrote: Hi! I use python-qpid and I have faced with a few bugs in it: * If you open a few connections, and one of them breaks (for example, due to a network error), another connections can be locked for time, which is equal to network timeout of the broken connection. This happens due to working with sockets in blocking mode and due to using one Selector for all connections. * All connections could become locked forever due to races between Driver and Selector objects. Driver object removes itself from the Selector non-atomically and a situation when Driver is alredy closed, but the Selector refers to it could happen. In this case select() call in the Selector raise an exeption due to self._transport.fileno() call on Driver where self._transport is None. The selector doesn't handle errors on select(), so the selector's thread will be stopped due to unhandled Exception. * There is no checks on EINTR error on os.* calls. As a temporary solution for me, I've written a patch, which fixes the errors: https://github.com/KonishchevDmitry/qpid/commit/9090f7f32f5746d00de6fc378ac4b2f4fa75b856 It would be good if you'd include this patch to a new version of Qpid. IANAL but I believe that before we could accept this patch into qpid either: * You need to sign a contributors agreement OR (much easier) * You open a ticket with our Jira bug tracker https://issues.apache.org/jira and attach the patch there ticking the "Grant License to ASF ..." box. Sorry to make this more complicated than it might seem it should be. Good point. I forgot about the legal red tape. --Rafael - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
[jira] Issue Comment Edited: (QPID-2968) Blocking on dead sockets
[ https://issues.apache.org/jira/browse/QPID-2968?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12966678#action_12966678 ] Dmitry Konishchev edited comment on QPID-2968 at 12/3/10 4:43 PM: -- This patch fixes following bugs: * If you open a few connections, and one of them breaks (for example, due to a network error), another connections can be locked for a time, which is equal to network timeout of the broken connection. * All connections could become locked forever due to races between Driver and Selector objects. * Added EINTR error handling. * Added broker connection timeout which is equal to the connection heartbeat interval. was (Author: konishchev): The following patch fixes the bugs. > Blocking on dead sockets > > > Key: QPID-2968 > URL: https://issues.apache.org/jira/browse/QPID-2968 > Project: Qpid > Issue Type: Bug > Components: Python Client >Affects Versions: Future, 0.9, 0.8, 0.7 > Environment: Does not matter >Reporter: Dmitry Konishchev > Fix For: Future, 0.9, 0.8, 0.7 > > Attachments: patch > > > * If you open a few connections, and one of them breaks (for example, > due to a network error), another connections can be locked for time, which > is > equal to network timeout of the broken connection. This happens due to > working with sockets in blocking mode and due to using one Selector for all > connections. > * All connections could become locked forever due to races between > Driver and Selector objects. Driver object removes itself from the Selector > non-atomically and a situation when Driver is alredy closed, but the > Selector > refers to it could happen. In this case select() call in the Selector raise > an exeption due to self._transport.fileno() call on Driver where > self._transport is None. The selector doesn't handle errors on select(), so > the selector's thread will be stopped due to unhandled Exception. > * There is no checks on EINTR error on os.* calls. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
[jira] Updated: (QPID-2968) Blocking on dead sockets
[ https://issues.apache.org/jira/browse/QPID-2968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Dmitry Konishchev updated QPID-2968: Attachment: patch The following patch fixes the bugs. > Blocking on dead sockets > > > Key: QPID-2968 > URL: https://issues.apache.org/jira/browse/QPID-2968 > Project: Qpid > Issue Type: Bug > Components: Python Client >Affects Versions: Future, 0.9, 0.8, 0.7 > Environment: Does not matter >Reporter: Dmitry Konishchev > Fix For: Future, 0.9, 0.8, 0.7 > > Attachments: patch > > > * If you open a few connections, and one of them breaks (for example, > due to a network error), another connections can be locked for time, which > is > equal to network timeout of the broken connection. This happens due to > working with sockets in blocking mode and due to using one Selector for all > connections. > * All connections could become locked forever due to races between > Driver and Selector objects. Driver object removes itself from the Selector > non-atomically and a situation when Driver is alredy closed, but the > Selector > refers to it could happen. In this case select() call in the Selector raise > an exeption due to self._transport.fileno() call on Driver where > self._transport is None. The selector doesn't handle errors on select(), so > the selector's thread will be stopped due to unhandled Exception. > * There is no checks on EINTR error on os.* calls. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
[jira] Created: (QPID-2968) Blocking on dead sockets
Blocking on dead sockets Key: QPID-2968 URL: https://issues.apache.org/jira/browse/QPID-2968 Project: Qpid Issue Type: Bug Components: Python Client Affects Versions: Future, 0.9, 0.8, 0.7 Environment: Does not matter Reporter: Dmitry Konishchev Fix For: Future, 0.9, 0.8, 0.7 * If you open a few connections, and one of them breaks (for example, due to a network error), another connections can be locked for time, which is equal to network timeout of the broken connection. This happens due to working with sockets in blocking mode and due to using one Selector for all connections. * All connections could become locked forever due to races between Driver and Selector objects. Driver object removes itself from the Selector non-atomically and a situation when Driver is alredy closed, but the Selector refers to it could happen. In this case select() call in the Selector raise an exeption due to self._transport.fileno() call on Driver where self._transport is None. The selector doesn't handle errors on select(), so the selector's thread will be stopped due to unhandled Exception. * There is no checks on EINTR error on os.* calls. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
[jira] Created: (QPID-2967) Windows broker fails to destroy connections if client exits abruptly
Windows broker fails to destroy connections if client exits abruptly Key: QPID-2967 URL: https://issues.apache.org/jira/browse/QPID-2967 Project: Qpid Issue Type: Bug Affects Versions: 0.8 Environment: Windows 64- and 32-bit builds of cpp/qpidd Reporter: Chuck Rolke Start the broker with a small number of connections: qpidd --auth no --no-data-dir --max-connections 2 Run a 'server' program, one that never exits on its own, and kill it with ^C. After doing this for the max-number of connections the server will not accept any more connections. Internally to the broker the Connection objects are never destroyed. If the broker's client exits normally then the connection is destroyed properly. You can run HelloWorld against the windows broker beyond the max-connections count with no problem. I know that "the broker is not supported on Windows" but the same problem is there for clients when the broker goes away abruptly. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
[jira] Assigned: (QPID-2902) LargeMessageTest fails on java.0.10 test profiles
[ https://issues.apache.org/jira/browse/QPID-2902?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Danushka Menikkumbura reassigned QPID-2902: --- Assignee: Danushka Menikkumbura > LargeMessageTest fails on java.0.10 test profiles > - > > Key: QPID-2902 > URL: https://issues.apache.org/jira/browse/QPID-2902 > Project: Qpid > Issue Type: Bug > Components: Java Broker, Java Client >Reporter: Robbie Gemmell >Assignee: Danushka Menikkumbura > > LargeMessageTest sporadically fails on the java.0.10 test profiles. It is > currently excluded. > eg: > FAILED > Excpetion occured:java.nio.charset.MalformedInputException: Input length = 1 > junit.framework.AssertionFailedError: Excpetion > occured:java.nio.charset.MalformedInputException: Input length = 1 > at > org.apache.qpid.test.unit.basic.LargeMessageTest.checkLargeMessage(LargeMessageTest.java:159) > at > org.apache.qpid.test.unit.basic.LargeMessageTest.test1024k(LargeMessageTest.java:133) > at > org.apache.qpid.test.utils.QpidBrokerTestCase.runBare(QpidBrokerTestCase.java:232) > at org.apache.qpid.test.utils.QpidTestCase.run(QpidTestCase.java:120) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: [VOTE] Release RC3 as Qpid 0.8
[X] Yes, release RC3 as Qpid 0.8 [ ] No, I have an issue which I'll discuss in a new thread. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: [VOTE] Release RC3 as Qpid 0.8
[X] Yes, release RC3 as Qpid 0.8 [ ] No, I have an issue which I'll discuss in a new thread. Andrew - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: [python-qpid] Blocking on dead sockets
On Wed, 2010-12-01 at 15:18 +0300, Dmitry Konishchev wrote: > Hi! I use python-qpid and I have faced with a few bugs in it: > > * If you open a few connections, and one of them breaks (for example, > due to a network error), another connections can be locked for time, which > is > equal to network timeout of the broken connection. This happens due to > working with sockets in blocking mode and due to using one Selector for all > connections. > * All connections could become locked forever due to races between > Driver and Selector objects. Driver object removes itself from the Selector > non-atomically and a situation when Driver is alredy closed, but the > Selector > refers to it could happen. In this case select() call in the Selector raise > an exeption due to self._transport.fileno() call on Driver where > self._transport is None. The selector doesn't handle errors on select(), so > the selector's thread will be stopped due to unhandled Exception. > * There is no checks on EINTR error on os.* calls. > > As a temporary solution for me, I've written a patch, which fixes the errors: > https://github.com/KonishchevDmitry/qpid/commit/9090f7f32f5746d00de6fc378ac4b2f4fa75b856 > > It would be good if you'd include this patch to a new version of Qpid. IANAL but I believe that before we could accept this patch into qpid either: * You need to sign a contributors agreement OR (much easier) * You open a ticket with our Jira bug tracker https://issues.apache.org/jira and attach the patch there ticking the "Grant License to ASF ..." box. Sorry to make this more complicated than it might seem it should be. Andrew - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
RE: Release notes for 0.8 announcement email ?
That I think I can squeeze into the email :) Robbie > -Original Message- > From: Chuck Rolke [mailto:cro...@redhat.com] > Sent: 03 December 2010 14:58 > To: dev@qpid.apache.org > Subject: Re: Release notes for 0.8 announcement email ? > > Right. I'll add the 'Whoa...' text to the .NET Binding chapter in > doc/book/ProgrammingInApacheQpid. > > For now, how about an executive summary of: > > The .NET Binding for the C++ Qpid Messaging API is an intermediary > program designed > to make access to C++ Qpid Messaging methods simple and in a way > familiar to the programmer. > The .NET Binding creates and manipulates actual C++ Qpid Messaging API > objects so that a .NET > program will operate the same as if the program were written in native > C++. > > -Chuck > > - "Robbie Gemmell" wrote: > > > From: "Robbie Gemmell" > > To: dev@qpid.apache.org > > Sent: Thursday, December 2, 2010 7:41:18 PM GMT -05:00 US/Canada > Eastern > > Subject: RE: Release notes for 0.8 announcement email ? > > > > Whoaa slightly larger and more detailed response than I was > > expecting :) > > > > Is this available in a file of some sort (e.g. from the repo)? If not > > I would suggest it gets put in the docbook or on a wiki page so that > > it can be linked to. > > > > Robbie > > > > > -Original Message- > > > From: Chuck Rolke [mailto:cro...@redhat.com] > > > Sent: 02 December 2010 22:50 > > > To: dev@qpid.apache.org > > > Subject: Re: Release notes for 0.8 announcement email ? > > > > > > Hi Robbie, > > > > > > > * .Net Bindings for the C++ Qpid Messaging API. > > > > > > INTRODUCTION > > > > > > The ".NET Binding for the QPID Messaging API" is a set of libraries > > for > > > developing QPID Messaging applications under Windows .NET. > > > > > > Located in qpid/cpp/bindings/qpid/dotnet, the Visual Studio > > solution > > > org.apache.qpid.messaging.sln builds the binding on top of the > > > qpid/cpp core libraries. > > > > > > .NET BINDING COMPONENT ARCHITECTURE > > > > > > ++ > > > | \dotnet_examples | > > > | Managed C# | > > > +--+---+-+ > > > | | > > > V | > > > +---+| > > > | Managed Callback || > > > | org.apache.qpid.messaging.|| > > > | sessionreceiver.dll || > > > +--++| > > >| | > > > managedV V > > > (.NET) ++ > > > :::| .NET Messaging Binding Library > > | > > > unmanaged | org.apache.qpid.messaging.dll | > > > (Native Win32/64) +---++ > > >| > > >| > > > ++ | > > > | \examples | | > > > | Unmanaged C++ | | > > > ++---+ | > > >| | > > >V V > > > +--+ > > > | QPID Messaging C++ Libraries | > > > | bin\qpid*.dll bin\qmf*.dll | > > > ++--+--+ > > >| | > > >V | > > > +-+ | > > > | Boost Libraries | | > > > +++ | > > >| | > > >V V > > > +-+ > > > | MSVC Runtime Libraries | > > > +-+ > > > > > > This diagram illustrates the code and library components of the > > binding > > > and the hierarchical relationships between them. > > > > > > Working from the bottom up the components are: > > > > > > 1.MSVC Runtime Libraries > > > Microsoft Visual C++ runtime libraries. These libraries provide > > support > > > for .NET Messaging and for any other C++ executable. > > > > > > 2.Boost Libraries > > > Supporting libraries supplied by Boost.Org. (See http://boost.org/) > > > > > > 3.QPID Messaging C++ Libraries > > > The QPID Messaging C++ core run time system. > > > > > > 4.Unmanaged C++ Example Source Programs > > > Ordinary C++ programs that illustrate using qpid/cpp Messaging > > directly > > > in a native Windows environment. > > > > > > 5..NET Messaging Binding Library > > > The .NET Messaging library provides interoprability between managed > > > .NET > > > programs and the unmanaged, native Messaging C++ run time system. > > .NET > >
Java broker flow control implementation questions
Hi Rob, I'm working on implementing producer flow control for the C++ broker, based on the 0_10 credit model. Please see https://issues.apache.org/jira/browse/QPID-2935 for more detail. Marnie indicated that you've implemented this for the Java broker, and has forwarded me a few links that describe the functionality. I'd like the look and feel of the C++ implementation to be the same as the existing Java support, so I'm following the usage model as described in https://cwiki.apache.org/qpid/use-producer-flow-control.html. Have you implemented this over the 0_10 protocol? I'd like to leverage as much of the design and implementation as possible. thanks, -K - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: [VOTE] Release RC3 as Qpid 0.8
On 12/03/2010 04:14 PM, mick wrote: On Wed, 2010-12-01 at 14:27 +, Robbie Gemmell wrote: [ ] Yes, release RC3 as Qpid 0.8 [ ] No, I have an issue which I'll discuss in a new thread. [X] Undecided I downloaded and built qpid-0.8.tar on a cluster-enabled machine, and I am seeing several cluster tests putting out many messages like this: Exception exceptions.TypeError: "poll() got an unexpected keyword argument '_deadstate'" in> ignored The tests then succeed, but I wonder if the success is spurious? Does anyone know how serious this is or is not? Anybody want to try and sway my vote? ( I am disappointingly easy to bribe/threaten. ) I believe that is an issue with the test itself and the python version. It has been fixed on trunk[1] and is not in my view a blocker. [1] http://svn.apache.org/viewvc?view=revision&revision=1034421 - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
[jira] Commented: (QPID-2935) Support "best effort" producer flow control within the AMQP 0.10 implementation.
[ https://issues.apache.org/jira/browse/QPID-2935?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12966573#action_12966573 ] Ken Giusti commented on QPID-2935: -- Marnie - thanks for those links. We'll want the C++ broker's implementation to have the same look and feel as the existing Java functionality. I'll follow up with Rob with some questions. Alan - extra work necessary for clustering - duly noted. I'll be sure to develop some flow control tests against clustered brokers, and have you review them. > Support "best effort" producer flow control within the AMQP 0.10 > implementation. > > > Key: QPID-2935 > URL: https://issues.apache.org/jira/browse/QPID-2935 > Project: Qpid > Issue Type: New Feature > Components: C++ Broker, C++ Client >Affects Versions: 0.9 > Environment: any >Reporter: Ken Giusti >Assignee: Ken Giusti > Fix For: Future > > Attachments: QPID-2935.tgz > > > To what extent, if any, could producer flow control be supported on the > existing (pre-1.0) protocol? > In the current C++ broker/client implementation, when a queue on the broker > fills to the point where it cannot accept any more messages > (--default-queue-limit hit), the broker will forcibly disconnect any client > that attempts to route a message to that queue. This is an abrupt failure - > the producing client is not privy to the queue's remaining capacity. The > broker provides no feedback to the producing client, which could be used to > throttle the client's message production rate. > The purpose of this JIRA is to explore the possible methods for implementing > producer throttling on the current 0.10 C++ codebase. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online. - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: [VOTE] Release RC3 as Qpid 0.8
On Wed, 2010-12-01 at 14:27 +, Robbie Gemmell wrote: > > [ ] Yes, release RC3 as Qpid 0.8 > [ ] No, I have an issue which I'll discuss in a new thread. > > [X] Undecided I downloaded and built qpid-0.8.tar on a cluster-enabled machine, and I am seeing several cluster tests putting out many messages like this: Exception exceptions.TypeError: "poll() got an unexpected keyword argument '_deadstate'" in > ignored The tests then succeed, but I wonder if the success is spurious? Does anyone know how serious this is or is not? Anybody want to try and sway my vote? ( I am disappointingly easy to bribe/threaten. ) - Mick . - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: [python-qpid] Blocking on dead sockets
On 12/01/2010 07:18 AM, Dmitry Konishchev wrote: Hi! I use python-qpid and I have faced with a few bugs in it: * If you open a few connections, and one of them breaks (for example, due to a network error), another connections can be locked for time, which is equal to network timeout of the broken connection. This happens due to working with sockets in blocking mode and due to using one Selector for all connections. * All connections could become locked forever due to races between Driver and Selector objects. Driver object removes itself from the Selector non-atomically and a situation when Driver is alredy closed, but the Selector refers to it could happen. In this case select() call in the Selector raise an exeption due to self._transport.fileno() call on Driver where self._transport is None. The selector doesn't handle errors on select(), so the selector's thread will be stopped due to unhandled Exception. * There is no checks on EINTR error on os.* calls. As a temporary solution for me, I've written a patch, which fixes the errors: https://github.com/KonishchevDmitry/qpid/commit/9090f7f32f5746d00de6fc378ac4b2f4fa75b856 It would be good if you'd include this patch to a new version of Qpid. Thanks, I'll have a look at this. --Rafael - Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org
Re: Release notes for 0.8 announcement email ?
Right. I'll add the 'Whoa...' text to the .NET Binding chapter in doc/book/ProgrammingInApacheQpid. For now, how about an executive summary of: The .NET Binding for the C++ Qpid Messaging API is an intermediary program designed to make access to C++ Qpid Messaging methods simple and in a way familiar to the programmer. The .NET Binding creates and manipulates actual C++ Qpid Messaging API objects so that a .NET program will operate the same as if the program were written in native C++. -Chuck - "Robbie Gemmell" wrote: > From: "Robbie Gemmell" > To: dev@qpid.apache.org > Sent: Thursday, December 2, 2010 7:41:18 PM GMT -05:00 US/Canada Eastern > Subject: RE: Release notes for 0.8 announcement email ? > > Whoaa slightly larger and more detailed response than I was > expecting :) > > Is this available in a file of some sort (e.g. from the repo)? If not > I would suggest it gets put in the docbook or on a wiki page so that > it can be linked to. > > Robbie > > > -Original Message- > > From: Chuck Rolke [mailto:cro...@redhat.com] > > Sent: 02 December 2010 22:50 > > To: dev@qpid.apache.org > > Subject: Re: Release notes for 0.8 announcement email ? > > > > Hi Robbie, > > > > > * .Net Bindings for the C++ Qpid Messaging API. > > > > INTRODUCTION > > > > The ".NET Binding for the QPID Messaging API" is a set of libraries > for > > developing QPID Messaging applications under Windows .NET. > > > > Located in qpid/cpp/bindings/qpid/dotnet, the Visual Studio > solution > > org.apache.qpid.messaging.sln builds the binding on top of the > > qpid/cpp core libraries. > > > > .NET BINDING COMPONENT ARCHITECTURE > > > > ++ > > | \dotnet_examples | > > | Managed C# | > > +--+---+-+ > > | | > > V | > > +---+| > > | Managed Callback || > > | org.apache.qpid.messaging.|| > > | sessionreceiver.dll || > > +--++| > >| | > > managedV V > > (.NET) ++ > > :::| .NET Messaging Binding Library > | > > unmanaged | org.apache.qpid.messaging.dll | > > (Native Win32/64) +---++ > >| > >| > > ++ | > > | \examples | | > > | Unmanaged C++ | | > > ++---+ | > >| | > >V V > > +--+ > > | QPID Messaging C++ Libraries | > > | bin\qpid*.dll bin\qmf*.dll | > > ++--+--+ > >| | > >V | > > +-+ | > > | Boost Libraries | | > > +++ | > >| | > >V V > > +-+ > > | MSVC Runtime Libraries | > > +-+ > > > > This diagram illustrates the code and library components of the > binding > > and the hierarchical relationships between them. > > > > Working from the bottom up the components are: > > > > 1.MSVC Runtime Libraries > > Microsoft Visual C++ runtime libraries. These libraries provide > support > > for .NET Messaging and for any other C++ executable. > > > > 2.Boost Libraries > > Supporting libraries supplied by Boost.Org. (See http://boost.org/) > > > > 3.QPID Messaging C++ Libraries > > The QPID Messaging C++ core run time system. > > > > 4.Unmanaged C++ Example Source Programs > > Ordinary C++ programs that illustrate using qpid/cpp Messaging > directly > > in a native Windows environment. > > > > 5..NET Messaging Binding Library > > The .NET Messaging library provides interoprability between managed > > .NET > > programs and the unmanaged, native Messaging C++ run time system. > .NET > > programs > > create a Reference to this library thereby exposing all of the > native > > C++ > > Messaging functionality to programs written in any .NET language. > > > > 6..NET Messaging Managed Callback Library > > An extension of the .NET Messaging Binding Library that provides > > message > > callbacks in a managed .NET environment. This component is written > > purely in C# > > > > 7.Managed C# .NET Example Source Programs > > Various C# example programs that ill