Skip to content

Instantly share code, notes, and snippets.

@alexsilva
Last active December 23, 2016 00:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexsilva/74c5afce166233514599 to your computer and use it in GitHub Desktop.
Save alexsilva/74c5afce166233514599 to your computer and use it in GitHub Desktop.
Server model that uses shared memory as a communication channel.
#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