aboutsummaryrefslogtreecommitdiffhomepage
path: root/node_modules/uws/src/Node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/uws/src/Node.cpp')
-rw-r--r--node_modules/uws/src/Node.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/node_modules/uws/src/Node.cpp b/node_modules/uws/src/Node.cpp
new file mode 100644
index 0000000..cd20e79
--- /dev/null
+++ b/node_modules/uws/src/Node.cpp
@@ -0,0 +1,83 @@
+#include "Node.h"
+
+namespace uS {
+
+// this should be Node
+void NodeData::asyncCallback(Async *async)
+{
+ NodeData *nodeData = (NodeData *) async->getData();
+
+ nodeData->asyncMutex->lock();
+ for (Poll *p : nodeData->transferQueue) {
+ Socket *s = (Socket *) p;
+ TransferData *transferData = (TransferData *) s->getUserData();
+
+ s->reInit(nodeData->loop, transferData->fd);
+ s->setCb(transferData->pollCb);
+ s->start(nodeData->loop, s, s->setPoll(transferData->pollEvents));
+
+ s->nodeData = transferData->destination;
+ s->setUserData(transferData->userData);
+ auto *transferCb = transferData->transferCb;
+
+ delete transferData;
+ transferCb(s);
+ }
+
+ for (Poll *p : nodeData->changePollQueue) {
+ Socket *s = (Socket *) p;
+ s->change(s->nodeData->loop, s, s->getPoll());
+ }
+
+ nodeData->changePollQueue.clear();
+ nodeData->transferQueue.clear();
+ nodeData->asyncMutex->unlock();
+}
+
+Node::Node(int recvLength, int prePadding, int postPadding, bool useDefaultLoop) {
+ nodeData = new NodeData;
+ nodeData->recvBufferMemoryBlock = new char[recvLength];
+ nodeData->recvBuffer = nodeData->recvBufferMemoryBlock + prePadding;
+ nodeData->recvLength = recvLength - prePadding - postPadding;
+
+ nodeData->tid = pthread_self();
+ loop = Loop::createLoop(useDefaultLoop);
+
+ // each node has a context
+ nodeData->netContext = new Context();
+
+ nodeData->loop = loop;
+ nodeData->asyncMutex = &asyncMutex;
+
+ int indices = NodeData::getMemoryBlockIndex(NodeData::preAllocMaxSize) + 1;
+ nodeData->preAlloc = new char*[indices];
+ for (int i = 0; i < indices; i++) {
+ nodeData->preAlloc[i] = nullptr;
+ }
+
+ nodeData->clientContext = SSL_CTX_new(SSLv23_client_method());
+ SSL_CTX_set_options(nodeData->clientContext, SSL_OP_NO_SSLv3);
+}
+
+void Node::run() {
+ nodeData->tid = pthread_self();
+ loop->run();
+}
+
+Node::~Node() {
+ delete [] nodeData->recvBufferMemoryBlock;
+ SSL_CTX_free(nodeData->clientContext);
+
+ int indices = NodeData::getMemoryBlockIndex(NodeData::preAllocMaxSize) + 1;
+ for (int i = 0; i < indices; i++) {
+ if (nodeData->preAlloc[i]) {
+ delete [] nodeData->preAlloc[i];
+ }
+ }
+ delete [] nodeData->preAlloc;
+ delete nodeData->netContext;
+ delete nodeData;
+ loop->destroy();
+}
+
+}