Преглед изворни кода

Core: simplify record container (#1776)

Co-authored-by: あく <alleteam@gmail.com>
Sergey Gavrilov пре 3 година
родитељ
комит
92e440c77d
2 измењених фајлова са 42 додато и 37 уклоњено
  1. 25 37
      furi/core/record.c
  2. 17 0
      lib/toolbox/m_cstr_dup.h

+ 25 - 37
furi/core/record.c

@@ -6,6 +6,7 @@
 
 
 #include <m-string.h>
 #include <m-string.h>
 #include <m-dict.h>
 #include <m-dict.h>
+#include <toolbox/m_cstr_dup.h>
 
 
 #define FURI_RECORD_FLAG_READY (0x1)
 #define FURI_RECORD_FLAG_READY (0x1)
 
 
@@ -15,7 +16,7 @@ typedef struct {
     size_t holders_count;
     size_t holders_count;
 } FuriRecordData;
 } FuriRecordData;
 
 
-DICT_DEF2(FuriRecordDataDict, string_t, STRING_OPLIST, FuriRecordData, M_POD_OPLIST)
+DICT_DEF2(FuriRecordDataDict, const char*, M_CSTR_DUP_OPLIST, FuriRecordData, M_POD_OPLIST)
 
 
 typedef struct {
 typedef struct {
     FuriMutex* mutex;
     FuriMutex* mutex;
@@ -24,6 +25,19 @@ typedef struct {
 
 
 static FuriRecord* furi_record = NULL;
 static FuriRecord* furi_record = NULL;
 
 
+static FuriRecordData* furi_record_get(const char* name) {
+    return FuriRecordDataDict_get(furi_record->records, name);
+}
+
+static void furi_record_put(const char* name, FuriRecordData* record_data) {
+    FuriRecordDataDict_set_at(furi_record->records, name, *record_data);
+}
+
+static void furi_record_erase(const char* name, FuriRecordData* record_data) {
+    furi_event_flag_free(record_data->flags);
+    FuriRecordDataDict_erase(furi_record->records, name);
+}
+
 void furi_record_init() {
 void furi_record_init() {
     furi_record = malloc(sizeof(FuriRecord));
     furi_record = malloc(sizeof(FuriRecord));
     furi_record->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
     furi_record->mutex = furi_mutex_alloc(FuriMutexTypeNormal);
@@ -31,16 +45,16 @@ void furi_record_init() {
     FuriRecordDataDict_init(furi_record->records);
     FuriRecordDataDict_init(furi_record->records);
 }
 }
 
 
-static FuriRecordData* furi_record_data_get_or_create(string_t name_str) {
+static FuriRecordData* furi_record_data_get_or_create(const char* name) {
     furi_assert(furi_record);
     furi_assert(furi_record);
-    FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str);
+    FuriRecordData* record_data = furi_record_get(name);
     if(!record_data) {
     if(!record_data) {
         FuriRecordData new_record;
         FuriRecordData new_record;
         new_record.flags = furi_event_flag_alloc();
         new_record.flags = furi_event_flag_alloc();
         new_record.data = NULL;
         new_record.data = NULL;
         new_record.holders_count = 0;
         new_record.holders_count = 0;
-        FuriRecordDataDict_set_at(furi_record->records, name_str, new_record);
-        record_data = FuriRecordDataDict_get(furi_record->records, name_str);
+        furi_record_put(name, &new_record);
+        record_data = furi_record_get(name);
     }
     }
     return record_data;
     return record_data;
 }
 }
@@ -59,35 +73,25 @@ bool furi_record_exists(const char* name) {
 
 
     bool ret = false;
     bool ret = false;
 
 
-    string_t name_str;
-    string_init_set_str(name_str, name);
-
     furi_record_lock();
     furi_record_lock();
-    ret = (FuriRecordDataDict_get(furi_record->records, name_str) != NULL);
+    ret = (furi_record_get(name) != NULL);
     furi_record_unlock();
     furi_record_unlock();
 
 
-    string_clear(name_str);
-
     return ret;
     return ret;
 }
 }
 
 
 void furi_record_create(const char* name, void* data) {
 void furi_record_create(const char* name, void* data) {
     furi_assert(furi_record);
     furi_assert(furi_record);
 
 
-    string_t name_str;
-    string_init_set_str(name_str, name);
-
     furi_record_lock();
     furi_record_lock();
 
 
     // Get record data and fill it
     // Get record data and fill it
-    FuriRecordData* record_data = furi_record_data_get_or_create(name_str);
+    FuriRecordData* record_data = furi_record_data_get_or_create(name);
     furi_assert(record_data->data == NULL);
     furi_assert(record_data->data == NULL);
     record_data->data = data;
     record_data->data = data;
     furi_event_flag_set(record_data->flags, FURI_RECORD_FLAG_READY);
     furi_event_flag_set(record_data->flags, FURI_RECORD_FLAG_READY);
 
 
     furi_record_unlock();
     furi_record_unlock();
-
-    string_clear(name_str);
 }
 }
 
 
 bool furi_record_destroy(const char* name) {
 bool furi_record_destroy(const char* name) {
@@ -95,35 +99,26 @@ bool furi_record_destroy(const char* name) {
 
 
     bool ret = false;
     bool ret = false;
 
 
-    string_t name_str;
-    string_init_set_str(name_str, name);
-
     furi_record_lock();
     furi_record_lock();
 
 
-    FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str);
+    FuriRecordData* record_data = furi_record_get(name);
     furi_assert(record_data);
     furi_assert(record_data);
     if(record_data->holders_count == 0) {
     if(record_data->holders_count == 0) {
-        furi_event_flag_free(record_data->flags);
-        FuriRecordDataDict_erase(furi_record->records, name_str);
+        furi_record_erase(name, record_data);
         ret = true;
         ret = true;
     }
     }
 
 
     furi_record_unlock();
     furi_record_unlock();
 
 
-    string_clear(name_str);
-
     return ret;
     return ret;
 }
 }
 
 
 void* furi_record_open(const char* name) {
 void* furi_record_open(const char* name) {
     furi_assert(furi_record);
     furi_assert(furi_record);
 
 
-    string_t name_str;
-    string_init_set_str(name_str, name);
-
     furi_record_lock();
     furi_record_lock();
 
 
-    FuriRecordData* record_data = furi_record_data_get_or_create(name_str);
+    FuriRecordData* record_data = furi_record_data_get_or_create(name);
     record_data->holders_count++;
     record_data->holders_count++;
 
 
     furi_record_unlock();
     furi_record_unlock();
@@ -136,24 +131,17 @@ void* furi_record_open(const char* name) {
             FuriFlagWaitAny | FuriFlagNoClear,
             FuriFlagWaitAny | FuriFlagNoClear,
             FuriWaitForever) == FURI_RECORD_FLAG_READY);
             FuriWaitForever) == FURI_RECORD_FLAG_READY);
 
 
-    string_clear(name_str);
-
     return record_data->data;
     return record_data->data;
 }
 }
 
 
 void furi_record_close(const char* name) {
 void furi_record_close(const char* name) {
     furi_assert(furi_record);
     furi_assert(furi_record);
 
 
-    string_t name_str;
-    string_init_set_str(name_str, name);
-
     furi_record_lock();
     furi_record_lock();
 
 
-    FuriRecordData* record_data = FuriRecordDataDict_get(furi_record->records, name_str);
+    FuriRecordData* record_data = furi_record_get(name);
     furi_assert(record_data);
     furi_assert(record_data);
     record_data->holders_count--;
     record_data->holders_count--;
 
 
     furi_record_unlock();
     furi_record_unlock();
-
-    string_clear(name_str);
 }
 }

+ 17 - 0
lib/toolbox/m_cstr_dup.h

@@ -0,0 +1,17 @@
+#pragma once
+#include <m-core.h>
+
+#define M_INIT_DUP(a) ((a) = strdup(""))
+#define M_SET_DUP(a, b) (M_CHECK_DEFAULT_TYPE(a), free((void*)a), (a) = strdup(b))
+#define M_CLEAR_DUP(a) (free((void*)a))
+
+#define M_CSTR_DUP_OPLIST    \
+    (INIT(M_INIT_DUP),       \
+     INIT_SET(M_SET_DUP),    \
+     SET(M_SET_DUP),         \
+     CLEAR(M_CLEAR_DUP),     \
+     HASH(m_core_cstr_hash), \
+     EQUAL(M_CSTR_EQUAL),    \
+     CMP(strcmp),            \
+     TYPE(const char*),      \
+     OUT_STR(M_CSTR_OUT_STR))