diff --git a/v2/internal/ffenestri/traymenustore_darwin.c b/v2/internal/ffenestri/traymenustore_darwin.c index 51e9b6ac..6bae5d41 100644 --- a/v2/internal/ffenestri/traymenustore_darwin.c +++ b/v2/internal/ffenestri/traymenustore_darwin.c @@ -16,6 +16,11 @@ TrayMenuStore* NewTrayMenuStore() { ABORT("[NewTrayMenuStore] Not enough memory to allocate trayMenuMap!"); } + if (pthread_mutex_init(&result->lock, NULL) != 0) { + printf("\n mutex init has failed\n"); + exit(1); + } + return result; } @@ -25,15 +30,19 @@ int dumpTrayMenu(void *const context, struct hashmap_element_s *const e) { } void DumpTrayMenuStore(TrayMenuStore* store) { + pthread_mutex_lock(&store->lock); hashmap_iterate_pairs(&store->trayMenuMap, dumpTrayMenu, NULL); + pthread_mutex_unlock(&store->lock); } void AddTrayMenuToStore(TrayMenuStore* store, const char* menuJSON) { + TrayMenu* newMenu = NewTrayMenu(menuJSON); + pthread_mutex_lock(&store->lock); //TODO: check if there is already an entry for this menu hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); - + pthread_mutex_unlock(&store->lock); } int showTrayMenu(void *const context, struct hashmap_element_s *const e) { @@ -43,9 +52,11 @@ int showTrayMenu(void *const context, struct hashmap_element_s *const e) { } void ShowTrayMenusInStore(TrayMenuStore* store) { + pthread_mutex_lock(&store->lock); if( hashmap_num_entries(&store->trayMenuMap) > 0 ) { hashmap_iterate_pairs(&store->trayMenuMap, showTrayMenu, NULL); } + pthread_mutex_unlock(&store->lock); } int freeTrayMenu(void *const context, struct hashmap_element_s *const e) { @@ -64,16 +75,24 @@ void DeleteTrayMenuStore(TrayMenuStore *store) { // Destroy tray menu map hashmap_destroy(&store->trayMenuMap); + + pthread_mutex_destroy(&store->lock); } TrayMenu* GetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) { // Get the current menu - return hashmap_get(&store->trayMenuMap, menuID, strlen(menuID)); + pthread_mutex_lock(&store->lock); + TrayMenu* result = hashmap_get(&store->trayMenuMap, menuID, strlen(menuID)); + pthread_mutex_unlock(&store->lock); + return result; } TrayMenu* MustGetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) { // Get the current menu + pthread_mutex_lock(&store->lock); TrayMenu* result = hashmap_get(&store->trayMenuMap, menuID, strlen(menuID)); + pthread_mutex_unlock(&store->lock); + if (result == NULL ) { ABORT("Unable to find TrayMenu with ID '%s' in the TrayMenuStore!", menuID); } @@ -81,8 +100,11 @@ TrayMenu* MustGetTrayMenuFromStore(TrayMenuStore* store, const char* menuID) { } void DeleteTrayMenuInStore(TrayMenuStore* store, const char* ID) { + TrayMenu *menu = MustGetTrayMenuFromStore(store, ID); + pthread_mutex_lock(&store->lock); hashmap_remove(&store->trayMenuMap, ID, strlen(ID)); + pthread_mutex_unlock(&store->lock); DeleteTrayMenu(menu); } @@ -110,7 +132,9 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) { // If we don't have a menu, we create one if ( currentMenu == NULL ) { // Store the new menu + pthread_mutex_lock(&store->lock); hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); + pthread_mutex_unlock(&store->lock); // Show it ShowTrayMenu(newMenu); @@ -121,7 +145,9 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) { // Save the status bar reference newMenu->statusbaritem = currentMenu->statusbaritem; + pthread_mutex_lock(&store->lock); hashmap_remove(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID)); + pthread_mutex_unlock(&store->lock); // Delete the current menu DeleteMenu(currentMenu->menu); @@ -130,9 +156,10 @@ void UpdateTrayMenuInStore(TrayMenuStore* store, const char* menuJSON) { // Free the tray menu memory MEMFREE(currentMenu); + pthread_mutex_lock(&store->lock); hashmap_put(&store->trayMenuMap, newMenu->ID, strlen(newMenu->ID), newMenu); + pthread_mutex_unlock(&store->lock); // Show the updated menu ShowTrayMenu(newMenu); - } diff --git a/v2/internal/ffenestri/traymenustore_darwin.h b/v2/internal/ffenestri/traymenustore_darwin.h index d2d1e008..e669a6cf 100644 --- a/v2/internal/ffenestri/traymenustore_darwin.h +++ b/v2/internal/ffenestri/traymenustore_darwin.h @@ -5,6 +5,8 @@ #ifndef TRAYMENUSTORE_DARWIN_H #define TRAYMENUSTORE_DARWIN_H +#include + typedef struct { int dummy; @@ -13,6 +15,8 @@ typedef struct { // It maps tray IDs to TrayMenu* struct hashmap_s trayMenuMap; + pthread_mutex_t lock; + } TrayMenuStore; TrayMenuStore* NewTrayMenuStore();