Last active
December 23, 2016 00:25
-
-
Save alexsilva/74c5afce166233514599 to your computer and use it in GitHub Desktop.
Server model that uses shared memory as a communication channel.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <boost/interprocess/shared_memory_object.hpp> | |
#include <boost/interprocess/mapped_region.hpp> | |
#include "shared_data.h" | |
#include "server.h" | |
using namespace std; | |
using namespace boost::interprocess; | |
class SharedMemory { | |
public: | |
SharedMemory() { | |
shm = new shared_memory_object( | |
open_or_create, // only create | |
sharedmem_key, // name | |
read_write // read-write mode | |
); | |
shm->truncate(sizeof(Message)); | |
region = new mapped_region(*shm, read_write); | |
void *addr = region->get_address(); | |
msg = new (addr) Message; // shared obj | |
} | |
~SharedMemory() { | |
delete shm; | |
delete region; | |
shared_memory_object::remove(sharedmem_key); // clean | |
} | |
mapped_region *get_region() { | |
return region; | |
} | |
shared_memory_object *get_shm() { | |
return shm; | |
} | |
Message *get_message() { | |
return msg; | |
} | |
private: | |
mapped_region *region; | |
shared_memory_object *shm; | |
Message *msg; | |
}; | |
static SharedMemory *sharedMemory = NULL; | |
static PyObject *start(PyObject *self, PyObject *args) { | |
sharedMemory = new SharedMemory(); | |
Py_INCREF(Py_None); | |
return Py_None; | |
} | |
static PyObject *wait(PyObject *self, PyObject *args) { | |
Message *message = sharedMemory->get_message(); | |
scoped_lock<interprocess_mutex> lock(message->mutex); | |
message->client.wait(lock); | |
return PyString_FromString(message->data); | |
} | |
static PyObject *notify_all(PyObject *self, PyObject *args) { | |
Message *message = sharedMemory->get_message(); | |
message->server.notify_all(); | |
Py_INCREF(Py_None); | |
return Py_None; | |
} | |
static PyObject *stop(PyObject *self, PyObject *args) { | |
delete sharedMemory; | |
Py_INCREF(Py_None); | |
return Py_None; | |
} | |
static PyMethodDef methods[] = { | |
{"start", start, METH_VARARGS, "server start"}, | |
{"wait", wait, METH_VARARGS, "server wait"}, | |
{"notify_all", notify_all, METH_VARARGS, "server notify_all"}, | |
{"stop", stop, METH_VARARGS, "server stop"}, | |
{NULL, NULL, 0, NULL} /* Sentinel */ | |
}; | |
PyMODINIT_FUNC initserver(void) { | |
PyObject *mod; | |
mod = Py_InitModule("server", methods); | |
if (mod == NULL) | |
return; | |
PyObject *err = PyErr_NewException((char *) "server.error", NULL, NULL); | |
Py_INCREF(err); | |
PyModule_AddObject(mod, "error", err); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment