Project

General

Profile

Segmentation Fault when using C callback API » minimal_example.cpp

Source code in a single file - Tobias N, 09/19/2016 04:21 PM

 

#include <Wt/WApplication>
#include <Wt/WObject>
#include <Wt/WSignal>
#include <Wt/WContainerWidget>
#include <Wt/WText>

#include <csignal>


extern "C" {
void interrupt_func(int signum);
}

class CallbackWrapper;
static CallbackWrapper * device;

class CallbackWrapper : public Wt::WObject {
public:
CallbackWrapper(Wt::WObject *parent=0)
: Wt::WObject(parent),
sig(this)
{
device=this;
signal(SIGUSR1, interrupt_func);
}

Wt::Signal<>& intReceived() { return sig; }
void interrupt() { sig.emit(); }

private:
Wt::Signal<> sig;
};

void interrupt_func(int signum) {
device->interrupt();
}



class MyWidget : public Wt::WContainerWidget {
public:
MyWidget(Wt::WContainerWidget * parent=0)
: Wt::WContainerWidget(parent),
callback_wrapper(new CallbackWrapper()),
int_nr(0)
{
int_nr_text=new Wt::WText("interrupts: 0");
addWidget(int_nr_text);
addWidget(new Wt::WBreak());

callback_wrapper->intReceived().connect(this, &MyWidget::increment_int_nr);
}

void increment_int_nr() {
int_nr_text->setText(Wt::WString::fromUTF8("interrupts: {1}").arg(++int_nr));
}

private:
CallbackWrapper * callback_wrapper;
int int_nr;
Wt::WText * int_nr_text;
};



class DisplayApplication : public Wt::WApplication {
public:
DisplayApplication(const Wt::WEnvironment& env)
: Wt::WApplication(env)
{
root()->addWidget(new MyWidget());
}
};

Wt::WApplication *createApplication(const Wt::WEnvironment& env) {

return new DisplayApplication(env);
}

int main(int argc, char *argv[]) {

return Wt::WRun(argc, argv, &createApplication);
}

(1-1/2)