diff options
author | Yaroslav De La Peña Smirnov <yaros.rus_89@live.com.mx> | 2017-11-29 11:44:34 +0300 |
---|---|---|
committer | Yaroslav De La Peña Smirnov <yaros.rus_89@live.com.mx> | 2017-11-29 11:44:34 +0300 |
commit | 67fdec20726e48ba3a934cb25bb30d47ec4a4f29 (patch) | |
tree | 37fd9f4f0b0c20103e1646fc83021e4765de3680 /node_modules/uws/src/Node.cpp | |
download | spanish-checkers-67fdec20726e48ba3a934cb25bb30d47ec4a4f29.tar.gz spanish-checkers-67fdec20726e48ba3a934cb25bb30d47ec4a4f29.zip |
Initial commit, version 0.5.3
Diffstat (limited to 'node_modules/uws/src/Node.cpp')
-rw-r--r-- | node_modules/uws/src/Node.cpp | 83 |
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(); +} + +} |