about summary refs log tree commit diff stats
path: root/src/server/shared_memory_server.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/server/shared_memory_server.h78
1 files changed, 48 insertions, 30 deletions
diff --git a/src/server/shared_memory_server.h b/src/server/shared_memory_server.h
index 6d4fe19..74abedf 100644
--- a/src/server/shared_memory_server.h
+++ b/src/server/shared_memory_server.h
@@ -20,7 +20,18 @@ public:
 
         shared_memory = (SharedMemory*)
             mmap(0, sizeof(SharedMemory), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
-        shared_memory->processed = true;
+
+        shared_memory->tail = shared_memory->head = 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(&shared_memory->mutex, &mutex_attr);
+        pthread_cond_init(&shared_memory->cond_var, &cond_attr);
     }
 
     ~SharedMemoryServer()
@@ -28,45 +39,52 @@ public:
         munmap(shared_memory, sizeof(SharedMemory));
         close(shm_fd);
         shm_unlink(SHM_NAME);
-        std::cout << "bye" << '\n';
     }
 
     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';
+            pthread_mutex_lock(&shared_memory->mutex);
 
-                Request request = shared_memory->request;
-                shared_memory->processed = true;
+            if (shared_memory->tail == shared_memory->head && !shared_memory->full) {
+                pthread_cond_wait(&shared_memory->cond_var, &shared_memory->mutex);
+            }
 
-                K key = deserialize<K>(request.key);
-                V value = deserialize<V>(request.value);
+            Request* request = &shared_memory->request[shared_memory->tail];
 
-                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;
+            K key = deserialize<K>(request->key);
+            V value = deserialize<V>(request->value);
+
+            switch (request->type) {
+            case INSERT:
+                std::cout << "Inserting" << '\n';
+                hash_table.insert(key, value);
+                break;
+            case GET: {
+                std::cout << "Getting" << '\n';
+                hash_table.insert(key, value);
+                std::optional<V> result = hash_table.get(key);
+                if (result.has_value()) {
+                    std::string response = serialize<V>(result.value());
+                    strncpy(request->response, response.c_str(), MAX_VALUE_SIZE);
+                    pthread_cond_signal(&shared_memory->cond_var);
                 }
+                break;
+            }
+            case DELETE:
+                std::cout << "Deleting" << '\n';
+                hash_table.remove(key);
+                break;
+            case PRINT:
+                std::cout << "Printing" << '\n';
+                hash_table.print();
+                break;
+            default:
+                break;
             }
+            shared_memory->tail = (1 + shared_memory->tail) % QUEUE_SIZE;
+            shared_memory->full = false;
+            pthread_mutex_unlock(&shared_memory->mutex);
         }
     }