diff --git a/tools/signal-test/makefile b/tools/signal-test/makefile new file mode 100644 index 0000000000..594febce6c --- /dev/null +++ b/tools/signal-test/makefile @@ -0,0 +1,18 @@ +AD = ../.. +CXXFLAGS = -Wall -pthread -g +CPPFLAGS = -I $(AD)/libs/pbd -I $(AD)/build/libs/pbd +CPPFLAGS += `pkg-config --cflags glibmm-2.4` + +LDFLAGS = -L$(AD)/build/libs/pbd -Wl,-rpath=$(AD)/build/libs/pbd +LDLIBS = `pkg-config --libs glibmm-2.4` -lpbd + +signal-test: signal-test.cc + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ signal-test.cc $(LDLIBS) + +clean: + rm -f signal-test + +test: signal-test + while test $$? = 0 ; do echo -n "."; ./signal-test; done + +.PHONY: clean test diff --git a/tools/signal-test/signal-test.cc b/tools/signal-test/signal-test.cc new file mode 100644 index 0000000000..6f4ae58241 --- /dev/null +++ b/tools/signal-test/signal-test.cc @@ -0,0 +1,65 @@ +#include +#include +#include + +#include "pbd/pbd.h" +#include "pbd/signals.h" + +class Tx { +public: + PBD::Signal1 sig1; +}; + +class Rx { +public: + Rx (Tx& sender) { + sender.sig1.connect_same_thread (_connection, boost::bind (&Rx::cb, this, _1)); + } + +private: + void cb (int i) { + printf ("CB %d\n", i); + } + + PBD::ScopedConnection _connection; +}; + +pthread_barrier_t barrier; + +static void* delete_t (void* arg) { + Tx* t = static_cast (arg); + pthread_barrier_wait (&barrier); + delete t; + //printf ("Deleted tx\n"); + return 0; +} + +static void* delete_r (void* arg) { + Rx* r = static_cast (arg); + pthread_barrier_wait (&barrier); + delete r; + //printf ("Deleted rx\n"); + return 0; +} + +int +main (int argc, char** argv) +{ + PBD::init (); + Tx* t = new Tx (); + Rx* r = new Rx (*t); + + //t->sig1 (11); /* EMIT SIGNAL */ + + pthread_barrier_init (&barrier, NULL, 2); + pthread_t dt, dr; + pthread_create (&dt, NULL, delete_t, (void*)t); + pthread_create (&dr, NULL, delete_r, (void*)r); + + pthread_join (dt, NULL); + pthread_join (dr, NULL); + + pthread_barrier_destroy (&barrier); + PBD::cleanup (); + return 0; +}