diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-03-21 10:42:09 +0100 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-03-21 10:42:09 +0100 |
| commit | 44f772a7442e617d4a93c0b3ed318ffb42991d8b (patch) | |
| tree | b8cb1009b3a089a75fe15c600386cd96cac5c9d9 /src/server | |
| parent | 20ae154d21b8b9111e550b936ea23325a6de8e84 (diff) | |
| download | BT-Programming-Assignment-44f772a7442e617d4a93c0b3ed318ffb42991d8b.tar.gz BT-Programming-Assignment-44f772a7442e617d4a93c0b3ed318ffb42991d8b.zip | |
implement communication between server and client (without mutexes and with queue_length of 1)
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/main.cpp | 2 | ||||
| -rw-r--r-- | src/server/shared_memory_server.h | 61 |
2 files changed, 47 insertions, 16 deletions
diff --git a/src/server/main.cpp b/src/server/main.cpp index 4dd7761..424326f 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -22,5 +22,7 @@ int main(int argc, char* argv[]) SharedMemoryServer<int, std::string> shm(size); + shm.process_requests(); + return 0; } diff --git a/src/server/shared_memory_server.h b/src/server/shared_memory_server.h index 034466d..6d4fe19 100644 --- a/src/server/shared_memory_server.h +++ b/src/server/shared_memory_server.h @@ -2,7 +2,9 @@ #include "hashtable.h" #include "shared_memory.h" +#include <cstring> #include <fcntl.h> +#include <optional> #include <sys/mman.h> #include <unistd.h> @@ -16,34 +18,61 @@ public: ftruncate(shm_fd, sizeof(SharedMemory)); - shm = (SharedMemory*) + shared_memory = (SharedMemory*) mmap(0, sizeof(SharedMemory), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); - - pthread_mutexattr_t mutex_attr; - pthread_condattr_t cond_attr; - pthread_mutexattr_init(&mutex_attr); - pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED); - pthread_condattr_init(&cond_attr); - pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED); - - pthread_mutex_init(&shm->mutex, &mutex_attr); - pthread_cond_init(&shm->cond_var, &cond_attr); - - shm->head = (shm->tail = 0); + shared_memory->processed = true; } ~SharedMemoryServer() { - munmap(shm, sizeof(SharedMemory)); + munmap(shared_memory, sizeof(SharedMemory)); close(shm_fd); shm_unlink(SHM_NAME); + std::cout << "bye" << '\n'; } - void process_requests(); + void process_requests() + { + while (true) { + sleep(1); // TODO: remove sleep, add a mutex for shared memory, should then work with + // queue size 1 + if (!shared_memory->processed) { + std::cout << "Got a request!" << '\n'; + + Request request = shared_memory->request; + shared_memory->processed = true; + + K key = deserialize<K>(request.key); + V value = deserialize<V>(request.value); + + switch (request.type) { + case INSERT: + hash_table.insert(key, value); + break; + case GET: { + std::optional<V> result = hash_table.get(key); + if (result.has_value()) { + std::string response = serialize<V>(result.value()); + strncpy(shared_memory->response, response.c_str(), MAX_VALUE_SIZE); + } + break; + } + case DELETE: + hash_table.remove(key); + break; + case PRINT: + hash_table.print(); + break; + default: + break; + } + } + } + } private: HashTable<K, V> hash_table; int shm_fd; - SharedMemory* shm; + SharedMemory* shared_memory; }; |