@@ -37,12 +37,7 @@ struct logfs_msg {
3737#define MSG_SIZE 4
3838
3939sys_slist_t file_list = SYS_SLIST_STATIC_INIT (& file_list );
40-
41- struct file_list_item {
42- sys_snode_t node ;
43- uint32_t bid ;
44- uint64_t ts ;
45- };
40+ struct k_mutex file_list_lock ;
4641
4742K_MSGQ_DEFINE (log_msgq , sizeof (struct logfs_msg ), MSG_SIZE , 1 );
4843K_THREAD_STACK_DEFINE (logfs_queue_stack_area , CONFIG_LOG_BACKEND_FS_STACK_SIZE );
@@ -156,8 +151,12 @@ static int file_list_add_item(uint32_t boot_id, uint64_t timestamp)
156151 item -> bid = boot_id ;
157152 item -> ts = timestamp ;
158153
154+ k_mutex_lock (& file_list_lock , K_FOREVER );
155+
159156 sys_slist_append (& file_list , & item -> node );
160157
158+ k_mutex_unlock (& file_list_lock );
159+
161160 return 0 ;
162161}
163162
@@ -197,6 +196,34 @@ static int file_list_update(void)
197196 return cnt ;
198197}
199198
199+ int log_backend_fs_flist_get_max_ts (struct sys_hashmap * map )
200+ {
201+ struct file_list_item * pn ;
202+ struct file_list_item * cur = NULL ;
203+ uint64_t ts ;
204+
205+ k_mutex_lock (& file_list_lock , K_FOREVER );
206+
207+ cur = SYS_SLIST_PEEK_HEAD_CONTAINER (& file_list , cur , node );
208+ if (cur == NULL ) {
209+ k_mutex_unlock (& file_list_lock );
210+ return - ENODATA ;
211+ }
212+
213+ sys_hashmap_clear (map , NULL , NULL );
214+ sys_hashmap_insert (map , cur -> bid , cur -> ts , NULL );
215+
216+ SYS_SLIST_FOR_EACH_CONTAINER (& file_list , pn , node ) {
217+ if (!sys_hashmap_get (map , pn -> bid , & ts ) || pn -> ts > ts ) {
218+ sys_hashmap_insert (map , pn -> bid , pn -> ts , NULL );
219+ }
220+ }
221+
222+ k_mutex_unlock (& file_list_lock );
223+
224+ return 0 ;
225+ }
226+
200227static struct file_list_item * file_list_get_oldest_file (void )
201228{
202229 struct file_list_item * pn ;
@@ -216,6 +243,34 @@ static struct file_list_item *file_list_get_oldest_file(void)
216243 return cur ;
217244}
218245
246+ struct file_list_item * log_backend_fs_flist_get_next (struct file_list_item * item )
247+ {
248+ struct file_list_item * pn , * next = item ;
249+
250+ k_mutex_lock (& file_list_lock , K_FOREVER );
251+
252+ SYS_SLIST_FOR_EACH_CONTAINER (& file_list , pn , node ) {
253+ if (pn -> bid >= item -> bid ) {
254+ if ((next == item && (pn -> bid > item -> bid || pn -> ts > item -> ts )) ||
255+ (pn -> bid < next -> bid && pn -> bid > item -> bid ) ||
256+ (pn -> bid == next -> bid && pn -> bid > item -> bid && pn -> ts < next -> ts ) ||
257+ (pn -> bid == item -> bid && pn -> bid < next -> bid && pn -> ts > item -> ts ) ||
258+ (pn -> bid == item -> bid && pn -> bid == next -> bid && pn -> ts < next -> ts &&
259+ pn -> ts > item -> ts )) {
260+ next = pn ;
261+ }
262+ }
263+ }
264+
265+ k_mutex_unlock (& file_list_lock );
266+
267+ if (next == item ) {
268+ return NULL ;
269+ }
270+
271+ return next ;
272+ }
273+
219274#if !defined(CONFIG_LOG_BACKEND_FS_TIME_BASED_ROTATION )
220275static int check_log_file_exist (int num )
221276{
@@ -792,6 +847,12 @@ static void log_backend_fs_init(const struct log_backend *const backend)
792847 K_THREAD_STACK_SIZEOF (logfs_queue_stack_area ), THREAD_PRIORITY , & cfg );
793848 k_work_init (& logfs_msg_work , logfs_consumer );
794849
850+ rc = k_mutex_init (& file_list_lock );
851+ if (rc != 0 ) {
852+ printf ("%s: mutex init failed, rc = %d\n" , __func__ , rc );
853+ return ;
854+ }
855+
795856 if (backend_state == BACKEND_FS_NOT_INITIALIZED ) {
796857 if (check_log_volume_available ()) {
797858 /* will try to re-init later */
0 commit comments