diff options
| author | Christian Krinitsin <mail@krinitsin.com> | 2025-03-21 15:12:27 +0100 |
|---|---|---|
| committer | Christian Krinitsin <mail@krinitsin.com> | 2025-03-21 15:12:27 +0100 |
| commit | 4d0d9f183d7f92a41d66ffdcde15b040ff4032ef (patch) | |
| tree | 0e862837248107e4c0a323fffb2632da0bbb4482 /src/server | |
| parent | fb3fdf2262a7ced18009516f00473aa975aaa08a (diff) | |
| download | BT-Programming-Assignment-4d0d9f183d7f92a41d66ffdcde15b040ff4032ef.tar.gz BT-Programming-Assignment-4d0d9f183d7f92a41d66ffdcde15b040ff4032ef.zip | |
implement the server to process the queue
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/shared_memory_server.h | 78 |
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); } } |