about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/server/main.cpp26
-rw-r--r--src/server/shared_memory_server.h49
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;
+};