Skip to content

Commit 1c13ce2

Browse files
committed
Fix crash on exit, update label on load, use RAII in thread
1 parent 40086da commit 1c13ce2

4 files changed

Lines changed: 27 additions & 14 deletions

File tree

Source/Plugins/NetworkEvents/NetworkEvents.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ NetworkEvents::NetworkEvents()
169169
createZmqContext();
170170

171171
firstTime = true;
172-
responder = nullptr;
173172
urlport = 5556;
174173
threadRunning = false;
175174

@@ -213,7 +212,6 @@ bool NetworkEvents::closesocket()
213212
if (threadRunning)
214213
{
215214
lock.enter();
216-
zmq_close (responder);
217215
zmq_ctx_destroy (zmqcontext); // this will cause the thread to exit
218216
zmqcontext = nullptr;
219217
lock.exit();
@@ -557,24 +555,24 @@ void NetworkEvents::opensocket()
557555
void NetworkEvents::run()
558556
{
559557
#ifdef ZEROMQ
560-
responder = zmq_socket (zmqcontext, ZMQ_REP);
558+
SocketPtr responder(zmq_socket(zmqcontext, ZMQ_REP), &closeZmqSocket);
561559
String url= String ("tcp://*:") + String (urlport);
562-
int rc = zmq_bind (responder, url.toRawUTF8());
560+
int rc = zmq_bind (responder.get(), url.toRawUTF8());
563561

564562
if (rc != 0)
565563
{
566-
// failed to open socket?
564+
// failed to open or bind socket?
567565
std::cout << "Failed to open socket: " << zmq_strerror (zmq_errno()) << std::endl;
568566
return;
569567
}
570568

571569
threadRunning = true;
572-
unsigned char* buffer = new unsigned char[MAX_MESSAGE_LENGTH];
570+
HeapBlock<unsigned char> buffer(MAX_MESSAGE_LENGTH);
573571
int result = -1;
574572

575573
while (threadRunning)
576574
{
577-
result = zmq_recv (responder, buffer, MAX_MESSAGE_LENGTH - 1, 0); // blocking
575+
result = zmq_recv (responder.get(), buffer, MAX_MESSAGE_LENGTH - 1, 0); // blocking
578576

579577
juce::int64 timestamp_software = timer.getHighResolutionTicks();
580578

@@ -592,20 +590,17 @@ void NetworkEvents::run()
592590
// handle special messages
593591
String response = handleSpecialMessages (Msg);
594592

595-
zmq_send (responder, response.getCharPointer(), response.length(), 0);
593+
zmq_send (responder.get(), response.getCharPointer(), response.length(), 0);
596594
}
597595
else
598596
{
599597
String zeroMessageError = "Recieved Zero Message?!?!?";
600598
//std::cout << "Received Zero Message!" << std::endl;
601599

602-
zmq_send (responder, zeroMessageError.getCharPointer(), zeroMessageError.length(), 0);
600+
zmq_send (responder.get(), zeroMessageError.getCharPointer(), zeroMessageError.length(), 0);
603601
}
604602
}
605603

606-
zmq_close (responder);
607-
608-
delete[] buffer;
609604
threadRunning = false;
610605

611606
return;
@@ -656,7 +651,9 @@ void NetworkEvents::loadCustomParametersFromXml()
656651
{
657652
if (mainNode->hasTagName ("NETWORKEVENTS"))
658653
{
659-
setNewListeningPort (mainNode->getIntAttribute("port"));
654+
auto ed = static_cast<NetworkEventsEditor*>(getEditor());
655+
if (!ed) { return; }
656+
ed->setPortString(mainNode->getStringAttribute("port"));
660657
}
661658
}
662659
}
@@ -674,6 +671,14 @@ void NetworkEvents::createZmqContext()
674671
}
675672

676673

674+
void NetworkEvents::closeZmqSocket(void* socket)
675+
{
676+
#ifdef ZEROMQ
677+
zmq_close(socket);
678+
#endif
679+
}
680+
681+
677682
StringPairArray NetworkEvents::parseNetworkMessage (String msg)
678683
{
679684
StringArray splitted;

Source/Plugins/NetworkEvents/NetworkEvents.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
#include <list>
4141
#include <queue>
42+
#include <memory>
4243

4344
class StringTS
4445
{
@@ -123,13 +124,15 @@ class NetworkEvents : public GenericProcessor
123124
private:
124125
void createZmqContext();
125126

127+
static void closeZmqSocket(void* socket);
128+
typedef std::unique_ptr<void, decltype(&closeZmqSocket)> SocketPtr;
129+
126130
//* Split network message into name/value pairs (name1=val1 name2=val2 etc) */
127131
StringPairArray parseNetworkMessage (String msg);
128132

129133
StringTS createStringTS (String S, int64 t);
130134

131135
static void* zmqcontext;
132-
void* responder;
133136

134137
float threshold;
135138
float bufferZone;

Source/Plugins/NetworkEvents/NetworkEventsEditor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ void NetworkEventsEditor::setLabelColor(juce::Colour color)
115115
labelPort->setColour(Label::backgroundColourId, color);
116116
}
117117

118+
void NetworkEventsEditor::setPortString(const String& port)
119+
{
120+
labelPort->setText(port, sendNotification);
121+
}
118122

119123
void NetworkEventsEditor::labelTextChanged(juce::Label *label)
120124
{

Source/Plugins/NetworkEvents/NetworkEventsEditor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class NetworkEventsEditor : public GenericEditor,public Label::Listener
4747
void buttonEvent(Button* button);
4848
void labelTextChanged(juce::Label *);
4949
void setLabelColor(juce::Colour color);
50+
void setPortString(const String& port);
5051
private:
5152

5253
ScopedPointer<UtilityButton> restartConnection;

0 commit comments

Comments
 (0)