diff --git a/apps/buffering.c b/apps/buffering.c index cbc47c63e7..54c6c05baa 100644 --- a/apps/buffering.c +++ b/apps/buffering.c @@ -176,8 +176,8 @@ static void buffering_thread(void); static long buffering_stack[(DEFAULT_STACK_SIZE + 0x2000)/sizeof(long)]; static const char buffering_thread_name[] = "buffering"; static unsigned int buffering_thread_id = 0; -static struct event_queue buffering_queue; -static struct queue_sender_list buffering_queue_sender_list; +static struct event_queue buffering_queue SHAREDBSS_ATTR; +static struct queue_sender_list buffering_queue_sender_list SHAREDBSS_ATTR; diff --git a/apps/codec_thread.c b/apps/codec_thread.c index ef02f70811..03ab5622e2 100644 --- a/apps/codec_thread.c +++ b/apps/codec_thread.c @@ -81,15 +81,15 @@ extern bool automatic_skip; /* Who initiated in-progress skip? (C/A-) */ */ static bool codec_requested_stop = false; -extern struct event_queue audio_queue; -extern struct event_queue codec_queue; +extern struct event_queue audio_queue SHAREDBSS_ATTR; +extern struct event_queue codec_queue SHAREDBSS_ATTR; extern struct codec_api ci; /* from codecs.c */ /* Codec thread */ unsigned int codec_thread_id; /* For modifying thread priority later. Used by playback.c and pcmbuf.c */ -static struct queue_sender_list codec_queue_sender_list; +static struct queue_sender_list codec_queue_sender_list SHAREDBSS_ATTR; static long codec_stack[(DEFAULT_STACK_SIZE + 0x2000)/sizeof(long)] IBSS_ATTR; static const char codec_thread_name[] = "codec"; diff --git a/apps/mpeg.c b/apps/mpeg.c index bdca92048f..690e530d9b 100644 --- a/apps/mpeg.c +++ b/apps/mpeg.c @@ -150,7 +150,7 @@ static char mpeg_stack[DEFAULT_STACK_SIZE]; static struct mp3entry taginfo; #else /* !SIMULATOR */ -static struct event_queue mpeg_queue; +static struct event_queue mpeg_queue SHAREDBSS_ATTR; static long mpeg_stack[(DEFAULT_STACK_SIZE + 0x1000)/sizeof(long)]; static int audiobuflen; diff --git a/apps/playlist.c b/apps/playlist.c index 41d6ae5ed7..6f6db27b2a 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -192,11 +192,14 @@ static int rotate_index(const struct playlist_info* playlist, int index); #ifdef HAVE_DIRCACHE #define PLAYLIST_LOAD_POINTERS 1 -static struct event_queue playlist_queue; +static struct event_queue playlist_queue SHAREDBSS_ATTR; static long playlist_stack[(DEFAULT_STACK_SIZE + 0x800)/sizeof(long)]; static const char playlist_thread_name[] = "playlist cachectrl"; #endif +static struct mutex current_playlist_mutex SHAREDBSS_ATTR; +static struct mutex created_playlist_mutex SHAREDBSS_ATTR; + /* Check if the filename suggests M3U or M3U8 format. */ static bool is_m3u8(const char* filename) { @@ -1232,9 +1235,9 @@ static void playlist_flush_callback(void *param) { if (playlist->num_cached > 0) { - mutex_lock(&playlist->control_mutex); + mutex_lock(playlist->control_mutex); flush_cached_control(playlist); - mutex_unlock(&playlist->control_mutex); + mutex_unlock(playlist->control_mutex); } sync_control(playlist, true); } @@ -1362,7 +1365,7 @@ static int get_filename(struct playlist_info* playlist, int index, int seek, } else if (max < 0) { - mutex_lock(&playlist->control_mutex); + mutex_lock(playlist->control_mutex); if (control_file) { @@ -1396,7 +1399,7 @@ static int get_filename(struct playlist_info* playlist, int index, int seek, } } - mutex_unlock(&playlist->control_mutex); + mutex_unlock(playlist->control_mutex); if (max < 0) { @@ -1829,7 +1832,7 @@ static int update_control(struct playlist_info* playlist, struct playlist_control_cache* cache; bool flush = false; - mutex_lock(&playlist->control_mutex); + mutex_lock(playlist->control_mutex); cache = &(playlist->control_cache[playlist->num_cached++]); @@ -1861,7 +1864,7 @@ static int update_control(struct playlist_info* playlist, if (flush || playlist->num_cached == PLAYLIST_MAX_CACHE) result = flush_cached_control(playlist); - mutex_unlock(&playlist->control_mutex); + mutex_unlock(playlist->control_mutex); return result; } @@ -1881,10 +1884,10 @@ static void sync_control(struct playlist_info* playlist, bool force) { if (playlist->pending_control_sync) { - mutex_lock(&playlist->control_mutex); + mutex_lock(playlist->control_mutex); fsync(playlist->control_fd); playlist->pending_control_sync = false; - mutex_unlock(&playlist->control_mutex); + mutex_unlock(playlist->control_mutex); } } } @@ -1908,6 +1911,9 @@ void playlist_init(void) { struct playlist_info* playlist = ¤t_playlist; + mutex_init(¤t_playlist_mutex); + mutex_init(&created_playlist_mutex); + playlist->current = true; strlcpy(playlist->control_filename, PLAYLIST_CONTROL_FILE, sizeof(playlist->control_filename)); @@ -1919,7 +1925,8 @@ void playlist_init(void) playlist->buffer_size = AVERAGE_FILENAME_LENGTH * global_settings.max_files_in_dir; playlist->buffer = buffer_alloc(playlist->buffer_size); - mutex_init(&playlist->control_mutex); + playlist->control_mutex = ¤t_playlist_mutex; + empty_playlist(playlist, true); #ifdef HAVE_DIRCACHE @@ -1943,14 +1950,14 @@ void playlist_shutdown(void) if (playlist->control_fd >= 0) { - mutex_lock(&playlist->control_mutex); + mutex_lock(playlist->control_mutex); if (playlist->num_cached > 0) flush_cached_control(playlist); close(playlist->control_fd); - mutex_unlock(&playlist->control_mutex); + mutex_unlock(playlist->control_mutex); } } @@ -2705,7 +2712,7 @@ int playlist_create_ex(struct playlist_info* playlist, playlist->buffer_size = 0; playlist->buffer = NULL; - mutex_init(&playlist->control_mutex); + playlist->control_mutex = &created_playlist_mutex; } new_playlist(playlist, dir, file); @@ -3441,7 +3448,7 @@ int playlist_save(struct playlist_info* playlist, char *filename) { result = -1; - mutex_lock(&playlist->control_mutex); + mutex_lock(playlist->control_mutex); /* Replace the current playlist with the new one and update indices */ close(playlist->fd); @@ -3471,7 +3478,7 @@ int playlist_save(struct playlist_info* playlist, char *filename) } } - mutex_unlock(&playlist->control_mutex); + mutex_unlock(playlist->control_mutex); } diff --git a/apps/playlist.h b/apps/playlist.h index fb30b7ac8c..9c45769981 100644 --- a/apps/playlist.h +++ b/apps/playlist.h @@ -105,7 +105,7 @@ struct playlist_info int num_cached; /* number of cached entries */ bool pending_control_sync; /* control file needs to be synced */ - struct mutex control_mutex; /* mutex for control file access */ + struct mutex *control_mutex; /* mutex for control file access */ int last_shuffled_start; /* number of tracks when insert last shuffled command start */ }; diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index 044db9ff1f..6a0493ceaa 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -266,7 +266,7 @@ static struct batt_info #define BUF_ELEMENTS (sizeof(bat)/sizeof(struct batt_info)) static unsigned int thread_id; -static struct event_queue thread_q; +static struct event_queue thread_q SHAREDBSS_ATTR; static bool in_usb_mode; static unsigned int buf_idx; diff --git a/apps/plugins/mikmod/mikmod.c b/apps/plugins/mikmod/mikmod.c index fe1768376e..c99d11d636 100644 --- a/apps/plugins/mikmod/mikmod.c +++ b/apps/plugins/mikmod/mikmod.c @@ -31,7 +31,7 @@ #define EV_EXIT 9999 #define THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200 static unsigned int thread_id; -static struct event_queue thread_q; +static struct event_queue thread_q SHAREDBSS_ATTR; /* use long for aligning */ unsigned long thread_stack[THREAD_STACK_SIZE/sizeof(long)]; #endif diff --git a/apps/tagcache.c b/apps/tagcache.c index ae7199ffd6..ea7768139b 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -96,7 +96,7 @@ #ifndef __PCTOOL__ /* Tag Cache thread. */ -static struct event_queue tagcache_queue; +static struct event_queue tagcache_queue SHAREDBSS_ATTR; static long tagcache_stack[(DEFAULT_STACK_SIZE + 0x4000)/sizeof(long)]; static const char tagcache_thread_name[] = "tagcache"; #endif @@ -159,7 +159,7 @@ struct tagcache_command_entry { static struct tagcache_command_entry command_queue[TAGCACHE_COMMAND_QUEUE_LENGTH]; static volatile int command_queue_widx = 0; static volatile int command_queue_ridx = 0; -static struct mutex command_queue_mutex; +static struct mutex command_queue_mutex SHAREDBSS_ATTR; #endif /* Tag database structures. */ diff --git a/firmware/backlight.c b/firmware/backlight.c index 65d535b072..d24fc1342f 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -95,7 +95,7 @@ enum { static void backlight_thread(void); static long backlight_stack[DEFAULT_STACK_SIZE/sizeof(long)]; static const char backlight_thread_name[] = "backlight"; -static struct event_queue backlight_queue; +static struct event_queue backlight_queue SHAREDBSS_ATTR; #ifdef BACKLIGHT_DRIVER_CLOSE static unsigned int backlight_thread_id = 0; #endif diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index 1e0e0223af..45726a3237 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c @@ -74,7 +74,7 @@ static unsigned long reserve_used = 0; static unsigned int cache_build_ticks = 0; static unsigned long appflags = 0; -static struct event_queue dircache_queue; +static struct event_queue dircache_queue SHAREDBSS_ATTR; static long dircache_stack[(DEFAULT_STACK_SIZE + 0x400)/sizeof(long)]; static const char dircache_thread_name[] = "dircache"; diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c index dfc63021c9..fc2efcd3e4 100644 --- a/firmware/drivers/ata_mmc.c +++ b/firmware/drivers/ata_mmc.c @@ -90,7 +90,7 @@ static long last_disk_activity = -1; /* private variables */ -static struct mutex mmc_mutex; +static struct mutex mmc_mutex SHAREDBSS_ATTR; #ifdef HAVE_HOTSWAP static long mmc_stack[((DEFAULT_STACK_SIZE*2) + 0x800)/sizeof(long)]; @@ -98,7 +98,7 @@ static long mmc_stack[((DEFAULT_STACK_SIZE*2) + 0x800)/sizeof(long)]; static long mmc_stack[(DEFAULT_STACK_SIZE*2)/sizeof(long)]; #endif static const char mmc_thread_name[] = "mmc"; -static struct event_queue mmc_queue; +static struct event_queue mmc_queue SHAREDBSS_ATTR; static bool initialized = false; static bool new_mmc_circuit; diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index 403b521db0..c2df00691b 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -42,7 +42,7 @@ #include "lcd-remote.h" #endif -struct event_queue button_queue; +struct event_queue button_queue SHAREDBSS_ATTR; static long lastbtn; /* Last valid button status */ static long last_read; /* Last button status, for debouncing/filtering */ diff --git a/firmware/drivers/i2c.c b/firmware/drivers/i2c.c index 8cc7c78a2d..b3a53240b4 100644 --- a/firmware/drivers/i2c.c +++ b/firmware/drivers/i2c.c @@ -54,7 +54,7 @@ /* arbitrary delay loop */ #define DELAY do { int _x; for(_x=0;_x<20;_x++);} while (0) -static struct mutex i2c_mtx; +static struct mutex i2c_mtx SHAREDBSS_ATTR; void i2c_begin(void) { diff --git a/firmware/scroll_engine.c b/firmware/scroll_engine.c index 70bbcbeae1..5dd80f1a07 100644 --- a/firmware/scroll_engine.c +++ b/firmware/scroll_engine.c @@ -49,7 +49,7 @@ static struct scrollinfo lcd_scroll[LCD_SCROLLABLE_LINES]; #ifdef HAVE_REMOTE_LCD static struct scrollinfo lcd_remote_scroll[LCD_REMOTE_SCROLLABLE_LINES]; -static struct event_queue scroll_queue; +static struct event_queue scroll_queue SHAREDBSS_ATTR; #endif struct scroll_screen_info lcd_scroll_info = diff --git a/firmware/target/arm/ata-sd-pp.c b/firmware/target/arm/ata-sd-pp.c index b200dc4c22..f83bb60566 100644 --- a/firmware/target/arm/ata-sd-pp.c +++ b/firmware/target/arm/ata-sd-pp.c @@ -182,7 +182,7 @@ static struct sd_card_status sd_status[NUM_DRIVES] = static long sd_stack [(DEFAULT_STACK_SIZE*2 + 0x1c0)/sizeof(long)]; static const char sd_thread_name[] = "ata/sd"; static struct mutex sd_mtx SHAREDBSS_ATTR; -static struct event_queue sd_queue; +static struct event_queue sd_queue SHAREDBSS_ATTR; #ifdef HAVE_HOTSWAP static int sd_first_drive = 0; diff --git a/firmware/test/i2c/main.c b/firmware/test/i2c/main.c index 7a2ff49fcb..ad684829fb 100644 --- a/firmware/test/i2c/main.c +++ b/firmware/test/i2c/main.c @@ -288,7 +288,7 @@ bool filling; /* We are filling the buffer with data from disk */ -struct event_queue mpeg_queue; +struct event_queue mpeg_queue SHAREDBSS_ATTR; diff --git a/firmware/test/kernel/main.c b/firmware/test/kernel/main.c index 6a20551bb1..df0e72156a 100644 --- a/firmware/test/kernel/main.c +++ b/firmware/test/kernel/main.c @@ -31,7 +31,7 @@ unsigned int s2[256]; void t1(void); void t2(void); -struct event_queue main_q; +struct event_queue main_q SHAREDBSS_ATTR; int tick_add_task(void (*f)(void)); diff --git a/firmware/usb.c b/firmware/usb.c index 13f66159ac..ebbf0807eb 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -82,7 +82,7 @@ static const char usb_thread_name[] = "usb"; static unsigned int usb_thread_entry = 0; static bool usb_monitor_enabled = false; #endif /* USB_FULL_INIT */ -static struct event_queue usb_queue; +static struct event_queue usb_queue SHAREDBSS_ATTR; static bool exclusive_storage_access = false; #ifdef USB_ENABLE_HID static bool usb_hid = true;