songvec: migrate from pthread to glib threads
This commit is contained in:
		| @@ -51,6 +51,7 @@ | |||||||
| #include "main_notify.h" | #include "main_notify.h" | ||||||
| #include "os_compat.h" | #include "os_compat.h" | ||||||
| #include "dirvec.h" | #include "dirvec.h" | ||||||
|  | #include "songvec.h" | ||||||
|  |  | ||||||
| #ifdef ENABLE_ARCHIVE | #ifdef ENABLE_ARCHIVE | ||||||
| #include "archive_list.h" | #include "archive_list.h" | ||||||
| @@ -271,6 +272,7 @@ int main(int argc, char *argv[]) | |||||||
|  |  | ||||||
| 	idle_init(); | 	idle_init(); | ||||||
| 	dirvec_init(); | 	dirvec_init(); | ||||||
|  | 	songvec_init(); | ||||||
| 	initConf(); | 	initConf(); | ||||||
|  |  | ||||||
| 	parseOptions(argc, argv, &options); | 	parseOptions(argc, argv, &options); | ||||||
| @@ -385,6 +387,7 @@ int main(int argc, char *argv[]) | |||||||
| 	music_pipe_free(); | 	music_pipe_free(); | ||||||
| 	cleanUpPidFile(); | 	cleanUpPidFile(); | ||||||
| 	finishConf(); | 	finishConf(); | ||||||
|  | 	songvec_deinit(); | ||||||
| 	dirvec_deinit(); | 	dirvec_deinit(); | ||||||
| 	idle_deinit(); | 	idle_deinit(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,10 +3,9 @@ | |||||||
| #include "utils.h" | #include "utils.h" | ||||||
|  |  | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <pthread.h> |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
| static pthread_mutex_t nr_lock = PTHREAD_MUTEX_INITIALIZER; | static GMutex *nr_lock = NULL; | ||||||
|  |  | ||||||
| /* Only used for sorting/searchin a songvec, not general purpose compares */ | /* Only used for sorting/searchin a songvec, not general purpose compares */ | ||||||
| static int songvec_cmp(const void *s1, const void *s2) | static int songvec_cmp(const void *s1, const void *s2) | ||||||
| @@ -21,11 +20,24 @@ static size_t sv_size(const struct songvec *sv) | |||||||
| 	return sv->nr * sizeof(struct song *); | 	return sv->nr * sizeof(struct song *); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void songvec_init(void) | ||||||
|  | { | ||||||
|  | 	g_assert(nr_lock == NULL); | ||||||
|  | 	nr_lock = g_mutex_new(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void songvec_deinit(void) | ||||||
|  | { | ||||||
|  | 	g_assert(nr_lock != NULL); | ||||||
|  | 	g_mutex_free(nr_lock); | ||||||
|  | 	nr_lock = NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
| void songvec_sort(struct songvec *sv) | void songvec_sort(struct songvec *sv) | ||||||
| { | { | ||||||
| 	pthread_mutex_lock(&nr_lock); | 	g_mutex_lock(nr_lock); | ||||||
| 	qsort(sv->base, sv->nr, sizeof(struct song *), songvec_cmp); | 	qsort(sv->base, sv->nr, sizeof(struct song *), songvec_cmp); | ||||||
| 	pthread_mutex_unlock(&nr_lock); | 	g_mutex_unlock(nr_lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| struct song * | struct song * | ||||||
| @@ -34,14 +46,14 @@ songvec_find(const struct songvec *sv, const char *url) | |||||||
| 	int i; | 	int i; | ||||||
| 	struct song *ret = NULL; | 	struct song *ret = NULL; | ||||||
|  |  | ||||||
| 	pthread_mutex_lock(&nr_lock); | 	g_mutex_lock(nr_lock); | ||||||
| 	for (i = sv->nr; --i >= 0; ) { | 	for (i = sv->nr; --i >= 0; ) { | ||||||
| 		if (strcmp(sv->base[i]->url, url)) | 		if (strcmp(sv->base[i]->url, url)) | ||||||
| 			continue; | 			continue; | ||||||
| 		ret = sv->base[i]; | 		ret = sv->base[i]; | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	pthread_mutex_unlock(&nr_lock); | 	g_mutex_unlock(nr_lock); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -50,7 +62,7 @@ songvec_delete(struct songvec *sv, const struct song *del) | |||||||
| { | { | ||||||
| 	size_t i; | 	size_t i; | ||||||
|  |  | ||||||
| 	pthread_mutex_lock(&nr_lock); | 	g_mutex_lock(nr_lock); | ||||||
| 	for (i = 0; i < sv->nr; ++i) { | 	for (i = 0; i < sv->nr; ++i) { | ||||||
| 		if (sv->base[i] != del) | 		if (sv->base[i] != del) | ||||||
| 			continue; | 			continue; | ||||||
| @@ -63,10 +75,10 @@ songvec_delete(struct songvec *sv, const struct song *del) | |||||||
| 				(sv->nr - i) * sizeof(struct song *)); | 				(sv->nr - i) * sizeof(struct song *)); | ||||||
| 			sv->base = xrealloc(sv->base, sv_size(sv)); | 			sv->base = xrealloc(sv->base, sv_size(sv)); | ||||||
| 		} | 		} | ||||||
| 		pthread_mutex_unlock(&nr_lock); | 		g_mutex_unlock(nr_lock); | ||||||
| 		return i; | 		return i; | ||||||
| 	} | 	} | ||||||
| 	pthread_mutex_unlock(&nr_lock); | 	g_mutex_unlock(nr_lock); | ||||||
|  |  | ||||||
| 	return -1; /* not found */ | 	return -1; /* not found */ | ||||||
| } | } | ||||||
| @@ -74,18 +86,18 @@ songvec_delete(struct songvec *sv, const struct song *del) | |||||||
| void | void | ||||||
| songvec_add(struct songvec *sv, struct song *add) | songvec_add(struct songvec *sv, struct song *add) | ||||||
| { | { | ||||||
| 	pthread_mutex_lock(&nr_lock); | 	g_mutex_lock(nr_lock); | ||||||
| 	++sv->nr; | 	++sv->nr; | ||||||
| 	sv->base = xrealloc(sv->base, sv_size(sv)); | 	sv->base = xrealloc(sv->base, sv_size(sv)); | ||||||
| 	sv->base[sv->nr - 1] = add; | 	sv->base[sv->nr - 1] = add; | ||||||
| 	pthread_mutex_unlock(&nr_lock); | 	g_mutex_unlock(nr_lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| void songvec_destroy(struct songvec *sv) | void songvec_destroy(struct songvec *sv) | ||||||
| { | { | ||||||
| 	pthread_mutex_lock(&nr_lock); | 	g_mutex_lock(nr_lock); | ||||||
| 	sv->nr = 0; | 	sv->nr = 0; | ||||||
| 	pthread_mutex_unlock(&nr_lock); | 	g_mutex_unlock(nr_lock); | ||||||
| 	if (sv->base) { | 	if (sv->base) { | ||||||
| 		free(sv->base); | 		free(sv->base); | ||||||
| 		sv->base = NULL; | 		sv->base = NULL; | ||||||
| @@ -99,7 +111,7 @@ songvec_for_each(const struct songvec *sv, | |||||||
| 	size_t i; | 	size_t i; | ||||||
| 	size_t prev_nr; | 	size_t prev_nr; | ||||||
|  |  | ||||||
| 	pthread_mutex_lock(&nr_lock); | 	g_mutex_lock(nr_lock); | ||||||
| 	for (i = 0; i < sv->nr; ) { | 	for (i = 0; i < sv->nr; ) { | ||||||
| 		struct song *song = sv->base[i]; | 		struct song *song = sv->base[i]; | ||||||
|  |  | ||||||
| @@ -107,14 +119,14 @@ songvec_for_each(const struct songvec *sv, | |||||||
| 		assert(*song->url); | 		assert(*song->url); | ||||||
|  |  | ||||||
| 		prev_nr = sv->nr; | 		prev_nr = sv->nr; | ||||||
| 		pthread_mutex_unlock(&nr_lock); /* fn() may block */ | 		g_mutex_unlock(nr_lock); /* fn() may block */ | ||||||
| 		if (fn(song, arg) < 0) | 		if (fn(song, arg) < 0) | ||||||
| 			return -1; | 			return -1; | ||||||
| 		pthread_mutex_lock(&nr_lock); /* sv->nr may change in fn() */ | 		g_mutex_lock(nr_lock); /* sv->nr may change in fn() */ | ||||||
| 		if (prev_nr == sv->nr) | 		if (prev_nr == sv->nr) | ||||||
| 			++i; | 			++i; | ||||||
| 	} | 	} | ||||||
| 	pthread_mutex_unlock(&nr_lock); | 	g_mutex_unlock(nr_lock); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,6 +8,10 @@ struct songvec { | |||||||
| 	size_t nr; | 	size_t nr; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | void songvec_init(void); | ||||||
|  |  | ||||||
|  | void songvec_deinit(void); | ||||||
|  |  | ||||||
| void songvec_sort(struct songvec *sv); | void songvec_sort(struct songvec *sv); | ||||||
|  |  | ||||||
| struct song * | struct song * | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Thomas Jansen
					Thomas Jansen