diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-03-20 17:35:29 +0100 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-03-20 17:35:29 +0100 |
| commit | 75390f5097cb3116de20663bc5fb7490b6a0c1b3 (patch) | |
| tree | 5330cd226e75d0877559c6357511cbe7c501d871 /src/server | |
| parent | 1784e4a2a938bdef104135bfbf03f7b47ca0b507 (diff) | |
| download | BT-Programming-Assignment-75390f5097cb3116de20663bc5fb7490b6a0c1b3.tar.gz BT-Programming-Assignment-75390f5097cb3116de20663bc5fb7490b6a0c1b3.zip | |
server: implement a SharedMemoryServer with (de)initilization of the memory buffer
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/main.cpp | 26 | ||||
| -rw-r--r-- | src/server/shared_memory_server.h | 49 |
2 files changed, 52 insertions, 23 deletions
diff --git a/src/server/main.cpp b/src/server/main.cpp index b2f8bed..4dd7761 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -1,8 +1,9 @@ #include <cstdint> +#include <iostream> #include <stdexcept> #include <string> -#include "hashtable.h" +#include "shared_memory_server.h" int main(int argc, char* argv[]) { @@ -18,29 +19,8 @@ int main(int argc, char* argv[]) std::cout << "Invalid argument" << '\n'; return 1; } - - HashTable<int, std::string> hash_table { size }; - std::cout << "Add various kv-pairs" << '\n'; - hash_table.insert(1, "1"); - hash_table.insert(2, "2"); - hash_table.insert(3, "3"); - hash_table.insert(4, "4"); - hash_table.insert(5, "5"); - hash_table.insert(6, "6"); - hash_table.insert(7, "7"); - - hash_table.print(); - - std::cout << '\n'; - - std::cout << "Value for key 8: " << hash_table.get(8).value_or("Key not found!") << '\n'; - std::cout << "Value for key 4: " << hash_table.get(4).value_or("Key not found!") << '\n'; - - std::cout << '\n'; - std::cout << "Remove pair with key 5" << '\n'; - hash_table.remove(5); - hash_table.print(); + SharedMemoryServer<int, std::string> shm(size); return 0; } diff --git a/src/server/shared_memory_server.h b/src/server/shared_memory_server.h new file mode 100644 index 0000000..034466d --- /dev/null +++ b/src/server/shared_memory_server.h @@ -0,0 +1,49 @@ +#pragma once + +#include "hashtable.h" +#include "shared_memory.h" +#include <fcntl.h> +#include <sys/mman.h> +#include <unistd.h> + +template <typename K, typename V> +class SharedMemoryServer { +public: + SharedMemoryServer(size_t size) + : hash_table(size) + { + shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666); + + ftruncate(shm_fd, sizeof(SharedMemory)); + + shm = (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); + } + + ~SharedMemoryServer() + { + munmap(shm, sizeof(SharedMemory)); + close(shm_fd); + shm_unlink(SHM_NAME); + } + + void process_requests(); + +private: + HashTable<K, V> hash_table; + + int shm_fd; + SharedMemory* shm; +}; |