summaryrefslogtreecommitdiff
path: root/libcult/examples
diff options
context:
space:
mode:
Diffstat (limited to 'libcult/examples')
-rw-r--r--libcult/examples/cli/cli.cxx65
-rw-r--r--libcult/examples/cli/makefile48
-rw-r--r--libcult/examples/dr/xdr/makefile49
-rw-r--r--libcult/examples/dr/xdr/xdr.cxx87
-rw-r--r--libcult/examples/makefile36
-rw-r--r--libcult/examples/mm/shptr/makefile48
-rw-r--r--libcult/examples/mm/shptr/shptr.cxx73
-rw-r--r--libcult/examples/mm/transfer/makefile48
-rw-r--r--libcult/examples/mm/transfer/transfer.cxx117
-rw-r--r--libcult/examples/os/net/ipv4/datagram/client.cxx66
-rw-r--r--libcult/examples/os/net/ipv4/datagram/makefile55
-rw-r--r--libcult/examples/os/net/ipv4/datagram/protocol.hxx20
-rw-r--r--libcult/examples/os/net/ipv4/datagram/server.cxx123
-rw-r--r--libcult/examples/os/net/ipv4/multicast/client.cxx66
-rw-r--r--libcult/examples/os/net/ipv4/multicast/makefile55
-rw-r--r--libcult/examples/os/net/ipv4/multicast/protocol.hxx20
-rw-r--r--libcult/examples/os/net/ipv4/multicast/server.cxx134
-rw-r--r--libcult/examples/sched/cancel/cancel.cxx63
-rw-r--r--libcult/examples/sched/cancel/makefile48
-rw-r--r--libcult/examples/sched/main/main.cxx43
-rw-r--r--libcult/examples/sched/main/makefile48
-rw-r--r--libcult/examples/trace/makefile48
-rw-r--r--libcult/examples/trace/trace.cxx51
23 files changed, 1411 insertions, 0 deletions
diff --git a/libcult/examples/cli/cli.cxx b/libcult/examples/cli/cli.cxx
new file mode 100644
index 0000000..922a23d
--- /dev/null
+++ b/libcult/examples/cli/cli.cxx
@@ -0,0 +1,65 @@
+// file : examples/cli/cli.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/cli/options.hxx>
+#include <cult/cli/options-spec.hxx>
+#include <cult/cli/options-parser.hxx>
+
+#include <iostream>
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+
+namespace
+{
+ extern Char const help[] = "help";
+ extern Char const version[] = "version";
+ extern Char const outdir[] = "outdir";
+}
+
+typedef
+CLI::Options<help, Boolean,
+ version, Boolean,
+ outdir, String>
+Options;
+
+Int
+main (Int argc, Char* argv[])
+{
+ try
+ {
+ Options options (CLI::parse<Options> (argc, argv));
+
+ if (options.value<help> ())
+ {
+ cerr << "usage: " << argv[0] << " [--help] [--version] [--outdir <dir>]"
+ << endl;
+ return 0;
+ }
+
+ if (options.value<version> ())
+ {
+ cerr << argv[0] << " 1.2.3" << endl;
+ return 0;
+ }
+
+ if (String dir = options.value<outdir> ())
+ {
+ cerr << "outdir: " << dir << endl;
+ }
+ }
+ catch (CLI::UnexpectedOption const& e)
+ {
+ cerr << "unexpected option " << e.option () <<endl;
+ }
+ catch (CLI::OptionFormat const& e)
+ {
+ cerr << "bad format for " << e.option () << endl;
+ }
+}
diff --git a/libcult/examples/cli/makefile b/libcult/examples/cli/makefile
new file mode 100644
index 0000000..004f135
--- /dev/null
+++ b/libcult/examples/cli/makefile
@@ -0,0 +1,48 @@
+# file : examples/cli/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../build/bootstrap.make
+
+cxx_tun := cli.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+cli := $(out_base)/cli
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(cli): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(cli)
+
+
+# Clean.
+#
+$(clean): $(cli).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/dr/xdr/makefile b/libcult/examples/dr/xdr/makefile
new file mode 100644
index 0000000..6a4fa8f
--- /dev/null
+++ b/libcult/examples/dr/xdr/makefile
@@ -0,0 +1,49 @@
+# file : examples/dr/xdr/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+cxx_tun := xdr.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+xdr := $(out_base)/xdr
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(xdr): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(xdr)
+
+
+# Clean.
+#
+$(clean): $(xdr).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/dr/xdr/xdr.cxx b/libcult/examples/dr/xdr/xdr.cxx
new file mode 100644
index 0000000..38e948d
--- /dev/null
+++ b/libcult/examples/dr/xdr/xdr.cxx
@@ -0,0 +1,87 @@
+// file : examples/dr/xdr/xdr.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/dr/xdr/input-stream.hxx>
+#include <cult/dr/xdr/output-stream.hxx>
+
+#include <iostream>
+
+using namespace Cult;
+using namespace DR::XDR;
+
+using std::cerr;
+using std::endl;
+
+Int
+main ()
+{
+ try
+ {
+ OutputStream o (8);
+
+ o << true << false;
+
+ UnsignedInt8 a8 (0xDE);
+ UnsignedInt16 a16 (0xDEAD);
+ UnsignedInt32 a32 (0xDEADBEEF);
+ UnsignedInt64 a64 (0xDEADBEEFDEADBEEFULL);
+
+ o << a8 << a16 << a32 << a64;
+
+ Int8 b8 (-8);
+ Int16 b16 (-16);
+ Int32 b32 (-32);
+ Int64 b64 (-64);
+
+ o << b8 << b16 << b32 << b64;
+
+ String s ("reasonably loooooooooooooong string with some junk in it");
+
+ o << s;
+
+ InputStream i (o.buffer ());
+
+ Boolean t, f;
+ String s1;
+
+ i >> t >> f;
+ i >> a8 >> a16 >> a32 >> a64;
+ i >> b8 >> b16 >> b32 >> b64;
+ i >> s1;
+
+ if (!t
+ || f
+ || a8 != 0xDE
+ || a16 != 0xDEAD
+ || a32 != 0xDEADBEEF
+ || a64 != 0xDEADBEEFDEADBEEFULL
+ || b8 != -8
+ || b16 != -16
+ || b32 != -32
+ || b64 != -64
+ || s1 != s) return 1;
+
+ try
+ {
+ i >> t;
+ }
+ catch (Extraction const&)
+ {
+ return 0;
+ }
+ }
+ catch (Insertion const&)
+ {
+ cerr << "insertion" << endl;
+ }
+ catch (Extraction const&)
+ {
+ cerr << "extraction" << endl;
+ }
+
+ return 1;
+}
diff --git a/libcult/examples/makefile b/libcult/examples/makefile
new file mode 100644
index 0000000..d264910
--- /dev/null
+++ b/libcult/examples/makefile
@@ -0,0 +1,36 @@
+# file : examples/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../build/bootstrap.make
+include $(scf_root)/configuration.make
+
+default := $(out_base)/
+clean := $(out_base)/.clean
+
+examples := $(out_base)/cli \
+ $(out_base)/mm/shptr \
+ $(out_base)/mm/transfer \
+ $(out_base)/trace
+
+ifeq ($(cult_threads),y)
+examples += $(out_base)/sched/main \
+ $(out_base)/sched/cancel
+endif
+
+
+ifeq ($(cult_network),y)
+examples += $(out_base)/os/net/ipv4/datagram \
+ $(out_base)/os/net/ipv4/multicast
+endif
+
+ifeq ($(cult_dr),y)
+examples += $(out_base)/dr/xdr
+endif
+
+
+$(default): $(addsuffix /,$(examples))
+$(clean): $(addsuffix /.clean,$(examples))
+
+$(foreach e,$(subst $(out_base),$(src_base),$(examples)),$(call import,$e/makefile))
diff --git a/libcult/examples/mm/shptr/makefile b/libcult/examples/mm/shptr/makefile
new file mode 100644
index 0000000..2bf1598
--- /dev/null
+++ b/libcult/examples/mm/shptr/makefile
@@ -0,0 +1,48 @@
+# file : examples/mm/shptr/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+cxx_tun := shptr.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+shptr := $(out_base)/shptr
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(shptr): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(shptr)
+
+
+# Clean.
+#
+$(clean): $(shptr).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/mm/shptr/shptr.cxx b/libcult/examples/mm/shptr/shptr.cxx
new file mode 100644
index 0000000..cb026d4
--- /dev/null
+++ b/libcult/examples/mm/shptr/shptr.cxx
@@ -0,0 +1,73 @@
+// file : examples/mm/shptr/shptr.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/mm/shptr.hxx>
+#include <cult/mm/new.hxx> // MM::locate
+#include <cult/mm/counter.hxx> // MM::inc_ref
+
+#include <iostream>
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace MM;
+
+struct Foo
+{
+ virtual ~Foo () {}
+ char c;
+};
+
+struct Bar: virtual Foo {char c;};
+
+struct Baz: virtual Foo {char c;};
+
+struct Fox: Bar, Baz {};
+
+
+struct A
+{
+ char c[8];
+};
+
+struct B
+{
+ char c[8];
+};
+
+struct C : A, B
+{
+ char c[8];
+};
+
+int
+main ()
+{
+ {
+ Baz* bp (new Fox);
+ Foo* fp (bp);
+
+ Counter* cp (locate (fp, *counted));
+
+ inc_ref (bp);
+
+ cp->dec_ref ();
+
+ if (cp->dec_ref ()) cerr << "good: destroying" << endl;
+ else cerr << "bad: leaking" << endl;
+
+ delete bp;
+ }
+
+ {
+ Shptr<Fox> pfox (new Fox);
+ Shptr<Bar> pbar (pfox);
+
+ Shptr<Foo> pfoo;
+
+ pfoo = pbar;
+ }
+}
diff --git a/libcult/examples/mm/transfer/makefile b/libcult/examples/mm/transfer/makefile
new file mode 100644
index 0000000..3380f10
--- /dev/null
+++ b/libcult/examples/mm/transfer/makefile
@@ -0,0 +1,48 @@
+# file : examples/mm/transfer/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+cxx_tun := transfer.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+transfer := $(out_base)/transfer
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(transfer): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(transfer)
+
+
+# Clean.
+#
+$(clean): $(transfer).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/mm/transfer/transfer.cxx b/libcult/examples/mm/transfer/transfer.cxx
new file mode 100644
index 0000000..81014d0
--- /dev/null
+++ b/libcult/examples/mm/transfer/transfer.cxx
@@ -0,0 +1,117 @@
+// file : examples/mm/transfer/transfer.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/mm/evptr.hxx>
+
+#include <iostream>
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+
+unsigned long count = 0;
+unsigned long clone_count = 0;
+
+struct Type
+{
+ Type ()
+ {
+ ++count;
+ }
+
+ ~Type ()
+ {
+ --count;
+ }
+
+ Evptr<Type>
+ clone () const
+ {
+ ++clone_count;
+ return Evptr<Type> (new Type);
+ }
+
+ Void
+ f () const
+ {
+ Int i = i_;
+ ++i;
+ }
+
+ Int i_;
+};
+
+
+Evptr<Type>
+source ()
+{
+ return Evptr<Type> (new Type);
+}
+
+Void
+sink (Evptr<Type> a, Boolean r = true)
+{
+ if (r)
+ {
+ sink (a, false);
+ }
+ else
+ {
+ Evptr<Type> b (a);
+
+ cerr << "\tshare count: " << b.count () << endl;
+
+ // Any of these will trigger cloning.
+ //
+ b->f ();
+ }
+}
+
+Int
+main ()
+{
+ // case 1
+ //
+ {
+ cerr << "sink (new type)" << endl;
+
+ clone_count = 0;
+ sink (new Type);
+
+ cerr << "\tclone count: " << clone_count << endl
+ << endl;
+ }
+
+ // case 2
+ //
+ {
+ cerr << "sink (source ())" << endl;
+
+ clone_count = 0;
+ sink (source ());
+
+ cerr << "\tclone count: " << clone_count << endl
+ << endl;
+ }
+
+
+ // case 3
+ //
+ {
+ cerr << "sink (p)" << endl;
+
+ clone_count = 0;
+
+ Evptr<Type> p (new Type);
+ sink (p);
+
+ cerr << "\tclone count: " << clone_count << endl
+ << endl;
+ }
+
+
+ cerr << "balance: " << count << endl;
+}
diff --git a/libcult/examples/os/net/ipv4/datagram/client.cxx b/libcult/examples/os/net/ipv4/datagram/client.cxx
new file mode 100644
index 0000000..863fc25
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/datagram/client.cxx
@@ -0,0 +1,66 @@
+// file : examples/os/net/ipv4/datagram/client.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/os/net/ipv4/address.hxx>
+#include <cult/os/net/ipv4/datagram-socket.hxx>
+
+#include <iostream>
+#include <unistd.h> // usleep
+
+#include "protocol.hxx"
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace OS::Net::IPv4;
+
+class Args {};
+
+Int
+main (Int argc, Char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ throw Args ();
+
+ Address addr (argv[1], 10000);
+
+ DatagramSocket socket;
+
+ Message msg;
+ msg.sn = 0;
+
+ cerr << "message size : " << sizeof (msg) << " bytes" << endl;
+ cerr << "send buffer : " << socket.send_buffer_size () << " bytes" << endl;
+
+ for (Index i = 0; i < payload_size; i++)
+ {
+ msg.payload[i] = i;
+ }
+
+ for (; msg.sn < message_count; msg.sn++)
+ {
+ socket.send (&msg, sizeof (msg), addr);
+
+ // ::usleep (10);
+ }
+
+ return 0;
+ }
+ catch (OS::Exception const& e)
+ {
+ cerr << "errno: " << strerror (e.code ()) << endl;
+ }
+ catch (Args const&)
+ {
+ cerr << "usage: client <IPv4 address>" << endl;
+ }
+
+ return 1;
+}
diff --git a/libcult/examples/os/net/ipv4/datagram/makefile b/libcult/examples/os/net/ipv4/datagram/makefile
new file mode 100644
index 0000000..2dc8e1b
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/datagram/makefile
@@ -0,0 +1,55 @@
+# file : examples/os/net/ipv4/datagram/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make
+
+client_cxx_tun := client.cxx
+server_cxx_tun := server.cxx
+
+client_cxx_obj := $(addprefix $(out_base)/,$(client_cxx_tun:.cxx=.o))
+server_cxx_obj := $(addprefix $(out_base)/,$(server_cxx_tun:.cxx=.o))
+
+cxx_obj := $(client_cxx_obj) $(server_cxx_obj)
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+client := $(out_base)/client
+server := $(out_base)/server
+clean := $(out_base)/.clean
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(client) $(server)
+
+# Build.
+#
+
+$(client): $(client_cxx_obj) $(cult.l)
+$(server): $(server_cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Clean.
+#
+$(clean): $(client).o.clean \
+ $(server).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/os/net/ipv4/datagram/protocol.hxx b/libcult/examples/os/net/ipv4/datagram/protocol.hxx
new file mode 100644
index 0000000..0f418e8
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/datagram/protocol.hxx
@@ -0,0 +1,20 @@
+// file : examples/os/net/ipv4/datagram/protocol.hxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef PROTOCOL_HXX
+#define PROTOCOL_HXX
+
+#include <cult/types.hxx>
+
+Cult::UnsignedShort const payload_size = 256;
+Cult::UnsignedLong const message_count = 100;
+
+struct Message
+{
+ Cult::UnsignedLong sn;
+ Cult::UnsignedShort payload[payload_size];
+};
+
+#endif // PROTOCOL_HXX
diff --git a/libcult/examples/os/net/ipv4/datagram/server.cxx b/libcult/examples/os/net/ipv4/datagram/server.cxx
new file mode 100644
index 0000000..e788056
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/datagram/server.cxx
@@ -0,0 +1,123 @@
+// file : examples/os/net/ipv4/datagram/server.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+#include <cult/containers/vector.hxx>
+
+#include <cult/os/net/ipv4/address.hxx>
+#include <cult/os/net/ipv4/datagram-socket.hxx>
+
+#include <iostream>
+#include <cstring> // memcmp
+
+#include "protocol.hxx"
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace OS::Net::IPv4;
+
+typedef Containers::Vector<Boolean> StatusList;
+
+Int
+main ()
+{
+ try
+ {
+ Address addr (INADDR_ANY, 10000);
+
+ DatagramSocket socket (addr);
+
+ Message expected_msg;
+ expected_msg.sn = 0;
+
+ for (UnsignedShort i = 0; i < payload_size; ++i)
+ {
+ expected_msg.payload[i] = i;
+ }
+
+ StatusList received (message_count, 0);
+ StatusList damaged (message_count, 0);
+ StatusList duplicate (message_count, 0);
+
+ Message msg;
+
+ while (true)
+ {
+ socket.recv (&msg, sizeof (msg));
+
+ if (received[msg.sn])
+ {
+ duplicate[msg.sn] = true;
+ }
+ else
+ {
+ received[msg.sn] = true;
+
+ if (std::memcmp (expected_msg.payload, msg.payload, payload_size) != 0)
+ {
+ damaged[msg.sn] = true;
+ }
+ }
+
+ if (msg.sn + 1 == message_count) break;
+ }
+
+ UnsignedLong lost_count (0), damaged_count (0), duplicate_count (0);
+
+ for (StatusList::Iterator i (received.begin ()), end (received.end ());
+ i != end;
+ ++i)
+ if (!*i) ++lost_count;
+
+ for (StatusList::Iterator i (damaged.begin ()), end (damaged.end ());
+ i != end;
+ ++i)
+ if (*i) ++damaged_count;
+
+ for (StatusList::Iterator i (duplicate.begin ()), end (duplicate.end ());
+ i != end;
+ ++i)
+ if (*i) ++duplicate_count;
+
+ cerr << "lost : " << lost_count << endl
+ << "damaged : " << damaged_count << endl
+ << "duplicate : " << duplicate_count << endl << endl;
+
+ if (lost_count != 0)
+ {
+ cerr << "lost message dump:" << endl;
+
+ UnsignedLong total = 0;
+
+ for (StatusList::Iterator
+ begin (received.begin ()), i (begin), end (received.end ());
+ i != end;)
+ {
+ if (!*i)
+ {
+ UnsignedLong count = 1;
+
+ for (StatusList::Iterator j = i + 1; j < end && !*j; j++, count++) ;
+
+ cerr << '\t' << i - begin << " : " << count << endl;
+
+ i += count;
+ total += count;
+ }
+ else
+ ++i;
+ }
+
+ if (total != lost_count)
+ cerr << "trouble" << endl;
+ }
+ }
+ catch (OS::Exception const& e)
+ {
+ cerr << "errno: " << e.code () << endl;
+ }
+}
diff --git a/libcult/examples/os/net/ipv4/multicast/client.cxx b/libcult/examples/os/net/ipv4/multicast/client.cxx
new file mode 100644
index 0000000..863fc25
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/multicast/client.cxx
@@ -0,0 +1,66 @@
+// file : examples/os/net/ipv4/datagram/client.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/os/net/ipv4/address.hxx>
+#include <cult/os/net/ipv4/datagram-socket.hxx>
+
+#include <iostream>
+#include <unistd.h> // usleep
+
+#include "protocol.hxx"
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace OS::Net::IPv4;
+
+class Args {};
+
+Int
+main (Int argc, Char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ throw Args ();
+
+ Address addr (argv[1], 10000);
+
+ DatagramSocket socket;
+
+ Message msg;
+ msg.sn = 0;
+
+ cerr << "message size : " << sizeof (msg) << " bytes" << endl;
+ cerr << "send buffer : " << socket.send_buffer_size () << " bytes" << endl;
+
+ for (Index i = 0; i < payload_size; i++)
+ {
+ msg.payload[i] = i;
+ }
+
+ for (; msg.sn < message_count; msg.sn++)
+ {
+ socket.send (&msg, sizeof (msg), addr);
+
+ // ::usleep (10);
+ }
+
+ return 0;
+ }
+ catch (OS::Exception const& e)
+ {
+ cerr << "errno: " << strerror (e.code ()) << endl;
+ }
+ catch (Args const&)
+ {
+ cerr << "usage: client <IPv4 address>" << endl;
+ }
+
+ return 1;
+}
diff --git a/libcult/examples/os/net/ipv4/multicast/makefile b/libcult/examples/os/net/ipv4/multicast/makefile
new file mode 100644
index 0000000..cb35bf6
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/multicast/makefile
@@ -0,0 +1,55 @@
+# file : examples/os/net/ipv4/multicast/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../../../build/bootstrap.make
+
+client_cxx_tun := client.cxx
+server_cxx_tun := server.cxx
+
+client_cxx_obj := $(addprefix $(out_base)/,$(client_cxx_tun:.cxx=.o))
+server_cxx_obj := $(addprefix $(out_base)/,$(server_cxx_tun:.cxx=.o))
+
+cxx_obj := $(client_cxx_obj) $(server_cxx_obj)
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+client := $(out_base)/client
+server := $(out_base)/server
+clean := $(out_base)/.clean
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(client) $(server)
+
+# Build.
+#
+
+$(client): $(client_cxx_obj) $(cult.l)
+$(server): $(server_cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Clean.
+#
+$(clean): $(client).o.clean \
+ $(server).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/os/net/ipv4/multicast/protocol.hxx b/libcult/examples/os/net/ipv4/multicast/protocol.hxx
new file mode 100644
index 0000000..a4057de
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/multicast/protocol.hxx
@@ -0,0 +1,20 @@
+// file : examples/os/net/ipv4/multicast/protocol.hxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef PROTOCOL_HXX
+#define PROTOCOL_HXX
+
+#include <cult/types.hxx>
+
+Cult::UnsignedShort const payload_size = 256;
+Cult::UnsignedLong const message_count = 100;
+
+struct Message
+{
+ Cult::UnsignedLong sn;
+ Cult::UnsignedShort payload[payload_size];
+};
+
+#endif // PROTOCOL_HXX
diff --git a/libcult/examples/os/net/ipv4/multicast/server.cxx b/libcult/examples/os/net/ipv4/multicast/server.cxx
new file mode 100644
index 0000000..5d8fe99
--- /dev/null
+++ b/libcult/examples/os/net/ipv4/multicast/server.cxx
@@ -0,0 +1,134 @@
+// file : examples/os/net/ipv4/datagram/server.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+#include <cult/containers/vector.hxx>
+
+#include <cult/os/net/ipv4/address.hxx>
+#include <cult/os/net/ipv4/multicast-socket.hxx>
+
+#include <iostream>
+#include <cstring> // memcmp
+
+#include "protocol.hxx"
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace OS::Net::IPv4;
+
+typedef Containers::Vector<Boolean> StatusList;
+
+class Args {};
+
+Int
+main (Int argc, Char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ throw Args ();
+
+ Address addr (argv[1], 10000);
+
+ MulticastSocket socket;
+
+ socket.join (addr);
+
+ Message expected_msg;
+ expected_msg.sn = 0;
+
+ for (UnsignedShort i = 0; i < payload_size; ++i)
+ {
+ expected_msg.payload[i] = i;
+ }
+
+ StatusList received (message_count, 0);
+ StatusList damaged (message_count, 0);
+ StatusList duplicate (message_count, 0);
+
+ Message msg;
+
+ while (true)
+ {
+ socket.recv (&msg, sizeof (msg));
+
+ if (received[msg.sn])
+ {
+ duplicate[msg.sn] = true;
+ }
+ else
+ {
+ received[msg.sn] = true;
+
+ if (std::memcmp (expected_msg.payload, msg.payload, payload_size) != 0)
+ {
+ damaged[msg.sn] = true;
+ }
+ }
+
+ if (msg.sn + 1 == message_count) break;
+ }
+
+ UnsignedLong lost_count (0), damaged_count (0), duplicate_count (0);
+
+ for (StatusList::Iterator i (received.begin ()), end (received.end ());
+ i != end;
+ ++i)
+ if (!*i) ++lost_count;
+
+ for (StatusList::Iterator i (damaged.begin ()), end (damaged.end ());
+ i != end;
+ ++i)
+ if (*i) ++damaged_count;
+
+ for (StatusList::Iterator i (duplicate.begin ()), end (duplicate.end ());
+ i != end;
+ ++i)
+ if (*i) ++duplicate_count;
+
+ cerr << "lost : " << lost_count << endl
+ << "damaged : " << damaged_count << endl
+ << "duplicate : " << duplicate_count << endl << endl;
+
+ if (lost_count != 0)
+ {
+ cerr << "lost message dump:" << endl;
+
+ UnsignedLong total = 0;
+
+ for (StatusList::Iterator
+ begin (received.begin ()), i (begin), end (received.end ());
+ i != end;)
+ {
+ if (!*i)
+ {
+ UnsignedLong count = 1;
+
+ for (StatusList::Iterator j = i + 1; j < end && !*j; j++, count++) ;
+
+ cerr << '\t' << i - begin << " : " << count << endl;
+
+ i += count;
+ total += count;
+ }
+ else
+ ++i;
+ }
+
+ if (total != lost_count)
+ cerr << "trouble" << endl;
+ }
+ }
+ catch (OS::Exception const& e)
+ {
+ cerr << "errno: " << e.code () << endl;
+ }
+ catch (Args const&)
+ {
+ cerr << "usage: client <IPv4 address>" << endl;
+ }
+}
diff --git a/libcult/examples/sched/cancel/cancel.cxx b/libcult/examples/sched/cancel/cancel.cxx
new file mode 100644
index 0000000..ee71449
--- /dev/null
+++ b/libcult/examples/sched/cancel/cancel.cxx
@@ -0,0 +1,63 @@
+// file : examples/sched/cancel/cancel.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/mm/shptr.hxx>
+
+#include <cult/sched/lock.hxx>
+#include <cult/sched/mutex.hxx>
+#include <cult/sched/thread.hxx>
+#include <cult/sched/condition.hxx>
+
+
+#include <iostream>
+#include <unistd.h> // sleep
+
+using std::cerr;
+using std::endl;
+
+using namespace Cult;
+using namespace Sched;
+
+Void*
+cond_wait_thread_proc (Void*)
+{
+ try
+ {
+ Mutex mutex;
+ Condition cond (mutex);
+
+ Lock lock (mutex);
+
+ cond.wait ();
+ }
+ /*
+ catch (std::thread_canceled const& e)
+ {
+ cerr << "caught thread_canceled" << endl;
+ throw;
+ }
+ */
+ catch (...)
+ {
+ cerr << "presumably caught thread_canceled" << endl;
+ throw;
+ }
+
+ return 0;
+}
+
+
+Int
+main ()
+{
+ Shptr<Thread> thread (new Thread (cond_wait_thread_proc));
+
+ sleep (1);
+
+ thread->cancel ();
+ thread->join ();
+}
diff --git a/libcult/examples/sched/cancel/makefile b/libcult/examples/sched/cancel/makefile
new file mode 100644
index 0000000..38a96bd
--- /dev/null
+++ b/libcult/examples/sched/cancel/makefile
@@ -0,0 +1,48 @@
+# file : examples/sched/cancel/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+cxx_tun := cancel.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+cancel := $(out_base)/cancel
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(cancel): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(cancel)
+
+
+# clean
+#
+$(clean): $(cancel).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/sched/main/main.cxx b/libcult/examples/sched/main/main.cxx
new file mode 100644
index 0000000..58cc2cc
--- /dev/null
+++ b/libcult/examples/sched/main/main.cxx
@@ -0,0 +1,43 @@
+// file : examples/sched/main/main.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/mm/shptr.hxx>
+#include <cult/sched/thread.hxx>
+
+#include <iostream>
+#include <unistd.h> // sleep
+
+using namespace Cult;
+using namespace Sched;
+
+using std::cerr;
+using std::endl;
+
+Void*
+thread_func (Void*)
+{
+ cerr << "second thread: going to sleep for a few seconds" << endl;
+
+ sleep (2);
+
+ cerr << "second thread: woke up, now exiting" << endl;
+
+ return 0;
+}
+
+
+Int
+main ()
+{
+ Shptr<Thread> self (new Thread);
+
+ Shptr<Thread> other (new Thread (thread_func));
+
+ cerr << "initial thread: exiting" << endl;
+
+ Thread::exit (0);
+}
diff --git a/libcult/examples/sched/main/makefile b/libcult/examples/sched/main/makefile
new file mode 100644
index 0000000..945237f
--- /dev/null
+++ b/libcult/examples/sched/main/makefile
@@ -0,0 +1,48 @@
+# file : examples/sched/main/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../../build/bootstrap.make
+
+cxx_tun := main.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+main := $(out_base)/main
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(main): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(main)
+
+
+# Clean.
+#
+$(clean): $(main).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/trace/makefile b/libcult/examples/trace/makefile
new file mode 100644
index 0000000..57e2b7b
--- /dev/null
+++ b/libcult/examples/trace/makefile
@@ -0,0 +1,48 @@
+# file : examples/trace/makefile
+# author : Boris Kolpackov <boris@kolpackov.net>
+# copyright : Copyright (c) 2005-2010 Boris Kolpackov
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../build/bootstrap.make
+
+cxx_tun := trace.cxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+cult.l := $(out_root)/cult/cult.l
+cult.l.cpp-options := $(out_root)/cult/cult.l.cpp-options
+
+trace := $(out_base)/trace
+clean := $(out_base)/.clean
+
+
+# Build.
+#
+$(trace): $(cxx_obj) $(cult.l)
+
+$(cxx_obj) $(cxx_od): $(cult.l.cpp-options)
+
+$(call include-dep,$(cxx_od))
+
+
+# Convenience alias for default target.
+#
+$(out_base)/: $(trace)
+
+
+# Clean.
+#
+$(clean): $(trace).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od))
+
+
+# How to.
+#
+$(call include,$(bld_root)/cxx/o-e.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/cxx-d.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/cult/makefile)
diff --git a/libcult/examples/trace/trace.cxx b/libcult/examples/trace/trace.cxx
new file mode 100644
index 0000000..e2a09d4
--- /dev/null
+++ b/libcult/examples/trace/trace.cxx
@@ -0,0 +1,51 @@
+// file : examples/trace/trace.cxx
+// author : Boris Kolpackov <boris@kolpackov.net>
+// copyright : Copyright (c) 2005-2010 Boris Kolpackov
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#include <cult/types.hxx>
+
+#include <cult/trace/log.hxx>
+#include <cult/trace/record.hxx>
+#include <cult/trace/stream.hxx>
+
+#include <ostream>
+
+using namespace Cult;
+
+struct Foo {};
+
+std::ostream&
+operator<< (std::ostream& o, Foo const&)
+{
+ return o << "::Foo";
+}
+
+Trace::Stream tout ("Examples::Trace", 4);
+
+Int
+main ()
+{
+ using Trace::Record;
+
+ Trace::Log::instance ().level (9);
+
+ Record a ("main", 2);
+ a << "notationally burdensome";
+ tout << a;
+
+ Record b ("main", 2);
+ tout << (b << "a bit better, but still burdensome");
+
+ tout << (Record ("main", 2) << "this is"
+ << " somewhat"
+ << " twisted but nice to be able to");
+
+ tout << "concise, using default level";
+
+ tout << 9 << "concise, using custom level";
+
+ Foo f;
+
+ tout << 3 << f << " " << 5;
+}