[SCM] gsequencer/upstream: fixed dead-lock

jkraehemann-guest at users.alioth.debian.org jkraehemann-guest at users.alioth.debian.org
Sun Jun 14 16:07:00 UTC 2015


The following commit has been merged in the upstream branch:
commit 3deac8cf02230b8ae4faf2c7cb853033ff197164
Author: Joël Krähemann <weedlight at gmail.com>
Date:   Fri Apr 10 13:10:37 2015 +0000

    fixed dead-lock

diff --git a/src/ags/X/machine/ags_drum_callbacks.c b/src/ags/X/machine/ags_drum_callbacks.c
index 79d5889..07d19e2 100644
--- a/src/ags/X/machine/ags_drum_callbacks.c
+++ b/src/ags/X/machine/ags_drum_callbacks.c
@@ -175,7 +175,9 @@ ags_drum_index0_callback(GtkWidget *widget, AgsDrum *drum)
     if(GTK_TOGGLE_BUTTON(widget) != drum->selected0){
       AgsCopyPatternAudio *copy_pattern_audio;
       GList *list;
-
+      guint64 index0;
+      guint i;
+      
       toggle_button = drum->selected0;
       drum->selected0 = NULL;
       gtk_toggle_button_set_active(toggle_button, FALSE);
@@ -184,11 +186,16 @@ ags_drum_index0_callback(GtkWidget *widget, AgsDrum *drum)
       list = ags_recall_find_type(AGS_MACHINE(drum)->audio->play,
 				  AGS_TYPE_COPY_PATTERN_AUDIO);
 
+      /* calculate index 0 */
+      for(i = 0; i < 4 && drum->selected0 != drum->index0[i]; i++);
+
+      index0 = i;
+
       if(list != NULL){
 	GValue value = {0,};
 
-	g_value_init(&value, G_TYPE_UINT);
-	g_value_set_uint(&value, GPOINTER_TO_UINT(g_object_get_data((GObject *) widget, AGS_DRUM_INDEX)));
+	g_value_init(&value, G_TYPE_UINT64);
+	g_value_set_uint64(&value, index0);
 
 	copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data);
 	ags_port_safe_write(copy_pattern_audio->bank_index_0, &value);
@@ -202,8 +209,8 @@ ags_drum_index0_callback(GtkWidget *widget, AgsDrum *drum)
       if(list != NULL){
 	GValue value = {0,};
 
-	g_value_init(&value, G_TYPE_UINT);
-	g_value_set_uint(&value, GPOINTER_TO_UINT(g_object_get_data((GObject *) widget, AGS_DRUM_INDEX)));
+	g_value_init(&value, G_TYPE_UINT64);
+	g_value_set_uint64(&value, index0);
 
 	copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data);
 	ags_port_safe_write(copy_pattern_audio->bank_index_0, &value);
@@ -230,7 +237,9 @@ ags_drum_index1_callback(GtkWidget *widget, AgsDrum *drum)
     if(GTK_TOGGLE_BUTTON(widget) != drum->selected1){
       AgsCopyPatternAudio *copy_pattern_audio;
       GList *list;
-
+      guint64 index1;
+      guint i;
+      
       toggle_button = drum->selected1;
       drum->selected1 = NULL;
       gtk_toggle_button_set_active(toggle_button, FALSE);
@@ -239,11 +248,16 @@ ags_drum_index1_callback(GtkWidget *widget, AgsDrum *drum)
       list = ags_recall_find_type(AGS_MACHINE(drum)->audio->play,
 				  AGS_TYPE_COPY_PATTERN_AUDIO);
 
+      /* calculate index 1 */
+      for(i = 0; i < 12 && drum->selected1 != drum->index1[i]; i++);
+  
+      index1 = i;
+
       if(list != NULL){
 	GValue value = {0,};
 
-	g_value_init(&value, G_TYPE_UINT);
-	g_value_set_uint(&value, GPOINTER_TO_UINT(g_object_get_data((GObject *) widget, AGS_DRUM_INDEX)));
+	g_value_init(&value, G_TYPE_UINT64);
+	g_value_set_uint64(&value, index1);
 
 	copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data);
 	ags_port_safe_write(copy_pattern_audio->bank_index_1, &value);
@@ -257,8 +271,8 @@ ags_drum_index1_callback(GtkWidget *widget, AgsDrum *drum)
       if(list != NULL){
 	GValue value = {0,};
 
-	g_value_init(&value, G_TYPE_UINT);
-	g_value_set_uint(&value, GPOINTER_TO_UINT(g_object_get_data((GObject *) widget, AGS_DRUM_INDEX)));
+	g_value_init(&value, G_TYPE_UINT64);
+	g_value_set_uint64(&value, index1);
 
 	copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data);
 	ags_port_safe_write(copy_pattern_audio->bank_index_1, &value);
diff --git a/src/ags/X/machine/ags_matrix.c b/src/ags/X/machine/ags_matrix.c
index ec2f479..dc18783 100644
--- a/src/ags/X/machine/ags_matrix.c
+++ b/src/ags/X/machine/ags_matrix.c
@@ -939,6 +939,8 @@ ags_matrix_draw_matrix(AgsMatrix *matrix)
   channel = ags_channel_nth(AGS_MACHINE(matrix)->audio->input, (guint) matrix->adjustment->value);
 
   if(channel == NULL){
+    pthread_mutex_unlock(audio_mutex);
+    
     return;
   }
 
diff --git a/src/ags/X/machine/ags_matrix_callbacks.c b/src/ags/X/machine/ags_matrix_callbacks.c
index 5cc222a..f742bfb 100644
--- a/src/ags/X/machine/ags_matrix_callbacks.c
+++ b/src/ags/X/machine/ags_matrix_callbacks.c
@@ -104,8 +104,8 @@ ags_matrix_index_callback(GtkWidget *widget, AgsMatrix *matrix)
 	recall_copy_pattern_audio = AGS_COPY_PATTERN_AUDIO(list->data);
       }
 
-      g_value_init(&recall_value, G_TYPE_UINT);
-      g_value_set_uint(&recall_value, GPOINTER_TO_UINT(g_object_get_data((GObject *) widget, AGS_MATRIX_INDEX)));
+      g_value_init(&recall_value, G_TYPE_UINT64);
+      g_value_set_uint64(&recall_value, strtol(matrix->selected->button.label_text, NULL, 10) - 1);
 
       ags_port_safe_write(recall_copy_pattern_audio->bank_index_1, &recall_value);
 
diff --git a/src/ags/audio/ags_audio.c b/src/ags/audio/ags_audio.c
index 613e8ad..88bafd7 100644
--- a/src/ags/audio/ags_audio.c
+++ b/src/ags/audio/ags_audio.c
@@ -2857,7 +2857,7 @@ void ags_audio_resolve_recall(AgsAudio *audio,
     pthread_mutex_unlock(mutex);
     return;
   }
-    
+  
   /* get the appropriate lists */
   if(recall_id->recycling_container->parent == NULL){
     list_recall = audio->play;
@@ -3056,16 +3056,19 @@ ags_audio_play(AgsAudio *audio,
   switch(stage){
   case 0:
     if((AGS_RECALL_ID_PRE & (recall_id->flags)) != 0){
+      pthread_mutex_unlock(mutex);
       return;
     }
     break;
   case 1:
     if((AGS_RECALL_ID_INTER & (recall_id->flags)) != 0){
+      pthread_mutex_unlock(mutex);
       return;
     }
     break;
   case 2:
     if((AGS_RECALL_ID_POST & (recall_id->flags)) != 0){
+      pthread_mutex_unlock(mutex);
       return;
     }
     break;
@@ -3641,7 +3644,7 @@ ags_audio_find_port(AgsAudio *audio)
    
   /*  */
   list = g_list_reverse(list);
-  
+    
   pthread_mutex_unlock(mutex);
   
   return(list);
diff --git a/src/ags/audio/ags_devout.c b/src/ags/audio/ags_devout.c
index d1e9953..cfff3ee 100644
--- a/src/ags/audio/ags_devout.c
+++ b/src/ags/audio/ags_devout.c
@@ -1048,6 +1048,7 @@ ags_devout_add_audio(AgsDevout *devout, GObject *audio)
   
   if(g_list_find(devout->audio,
 		 audio) != NULL){
+    pthread_mutex_unlock(mutex);
     return;
   }
 
@@ -1120,10 +1121,14 @@ ags_devout_tic(AgsDevout *devout)
 
   if(!AGS_IS_DEVOUT(devout)){
     pthread_mutex_unlock(mutex);
+    
+    return;
   }
 
   if((AGS_DEVOUT_PLAY & devout->flags) == 0){
     g_message("ags_devout_tic: not playing\0");
+    pthread_mutex_unlock(mutex);
+    
     return;
   }
 
@@ -1557,13 +1562,13 @@ ags_devout_alsa_free(AgsDevout *devout)
   
   pthread_mutex_unlock(&(ags_application_mutex));
 
-  pthread_mutex_lock(mutex);
+  //  pthread_mutex_lock(mutex);
 
   snd_pcm_drain(devout->out.alsa.handle);
   snd_pcm_close(devout->out.alsa.handle);
   devout->out.alsa.handle = NULL;
 
-  pthread_mutex_unlock(mutex);
+  //  pthread_mutex_unlock(mutex);
 } 
 
 /**
diff --git a/src/ags/audio/recall/ags_copy_pattern_channel_run.c b/src/ags/audio/recall/ags_copy_pattern_channel_run.c
index 1002821..9c89352 100644
--- a/src/ags/audio/recall/ags_copy_pattern_channel_run.c
+++ b/src/ags/audio/recall/ags_copy_pattern_channel_run.c
@@ -371,6 +371,8 @@ ags_copy_pattern_channel_run_sequencer_alloc_callback(AgsDelayAudioRun *delay_au
   AgsCopyPatternChannel *copy_pattern_channel;
   gboolean current_bit;
   GValue offset_value = { 0, };
+  GValue i_value = { 0, };
+  GValue j_value = { 0, };
   GValue current_bit_value = { 0, };  
 
   if(AGS_RECALL_CHANNEL_RUN(copy_pattern_channel_run)->run_order != run_order){
@@ -387,6 +389,12 @@ ags_copy_pattern_channel_run_sequencer_alloc_callback(AgsDelayAudioRun *delay_au
   /* get AgsCopyPatternChannel */
   copy_pattern_channel = AGS_COPY_PATTERN_CHANNEL(copy_pattern_channel_run->recall_channel_run.recall_channel);
 
+  g_value_init(&i_value, G_TYPE_UINT64);
+  ags_port_safe_read(copy_pattern_audio->bank_index_0, &i_value);
+
+  g_value_init(&j_value, G_TYPE_UINT64);
+  ags_port_safe_read(copy_pattern_audio->bank_index_1, &j_value);
+  
   /* write pattern port - current offset */
   g_value_init(&offset_value, G_TYPE_UINT);
   g_value_set_uint(&offset_value,
@@ -395,6 +403,12 @@ ags_copy_pattern_channel_run_sequencer_alloc_callback(AgsDelayAudioRun *delay_au
   ags_port_safe_set_property(copy_pattern_channel->pattern,
 			     "offset\0", &offset_value);
 
+  ags_port_safe_set_property(copy_pattern_channel->pattern,
+			     "first-index\0", &i_value);
+  
+  ags_port_safe_set_property(copy_pattern_channel->pattern,
+			     "second-index\0", &j_value);
+
   /* read pattern port - current bit */
   g_value_init(&current_bit_value, G_TYPE_BOOLEAN);
   ags_port_safe_get_property(copy_pattern_channel->pattern,
diff --git a/src/ags/audio/task/ags_start_devout.c b/src/ags/audio/task/ags_start_devout.c
index 2c8bc6a..9decdbc 100644
--- a/src/ags/audio/task/ags_start_devout.c
+++ b/src/ags/audio/task/ags_start_devout.c
@@ -173,6 +173,8 @@ ags_start_devout_launch(AgsTask *task)
   error = devout_thread->error;
   devout_thread->error = NULL;
 
+  g_message("start devout\0");
+  
   ags_thread_start(AGS_THREAD(devout_thread));
   
   if((AGS_THREAD_SINGLE_LOOP & (AGS_THREAD(devout_thread)->flags)) == 0){
@@ -197,6 +199,9 @@ ags_start_devout_launch(AgsTask *task)
       pthread_mutex_unlock(&(AGS_THREAD(devout_thread)->start_mutex));
     }
   }
+
+  g_message("started devout\0");
+
 }
 
 /**
diff --git a/src/ags/thread/ags_audio_loop.c b/src/ags/thread/ags_audio_loop.c
index 41ddc6a..01905ec 100644
--- a/src/ags/thread/ags_audio_loop.c
+++ b/src/ags/thread/ags_audio_loop.c
@@ -630,6 +630,8 @@ ags_audio_loop_run(AgsThread *thread)
 
   audio_loop = AGS_AUDIO_LOOP(thread);
 
+  pthread_mutex_lock(&(audio_loop->recall_mutex));
+
   /* play recall */
   if((AGS_AUDIO_LOOP_PLAY_RECALL & (audio_loop->flags)) != 0){
     ags_audio_loop_play_recall(audio_loop);
@@ -820,10 +822,10 @@ ags_audio_loop_play_recall(AgsAudioLoop *audio_loop)
     }
     
     if(audio != NULL){
-      pthread_mutex_lock(audio_mutex);
+      pthread_mutex_unlock(audio_mutex);
     }
     
-    pthread_mutex_lock(devout_mutex);
+    pthread_mutex_unlock(devout_mutex);
 
     list = list_next;
   }
@@ -956,8 +958,8 @@ ags_audio_loop_play_channel(AgsAudioLoop *audio_loop)
 	//TODO:JK: verify g_object_unref() missing
       }
 
-      pthread_mutex_lock(audio_mutex);
-      pthread_mutex_lock(devout_mutex);
+      pthread_mutex_unlock(audio_mutex);
+      pthread_mutex_unlock(devout_mutex);
 
       list_play = list_next_play;
     }
@@ -1111,8 +1113,8 @@ ags_audio_loop_play_audio(AgsAudioLoop *audio_loop)
       }
 
       /*  */
-      pthread_mutex_lock(audio_mutex);
-      pthread_mutex_lock(devout_mutex);
+      pthread_mutex_unlock(audio_mutex);
+      pthread_mutex_unlock(devout_mutex);
 
       /* iterate */
       list_play_domain = list_next_play_domain;
diff --git a/src/ags/thread/ags_devout_thread.c b/src/ags/thread/ags_devout_thread.c
index ef7f2d5..8a8561c 100644
--- a/src/ags/thread/ags_devout_thread.c
+++ b/src/ags/thread/ags_devout_thread.c
@@ -51,7 +51,6 @@ extern AgsConfig *config;
  * The #AgsDevoutThread acts as audio output thread to soundcard.
  */
 
-extern pthread_mutex_t ags_application_mutex;
 static gpointer ags_devout_thread_parent_class = NULL;
 static AgsConnectableInterface *ags_devout_thread_parent_connectable_interface;
 
@@ -232,8 +231,6 @@ ags_devout_thread_run(AgsThread *thread)
 
   devout_thread = AGS_DEVOUT_THREAD(thread);
 
-  pthread_mutex_lock(&(ags_application_mutex));
-
   devout = AGS_DEVOUT(thread->devout);
 
   //  delay = (long) floor(NSEC_PER_SEC / devout->frequency * devout->buffer_size);
@@ -252,8 +249,6 @@ ags_devout_thread_run(AgsThread *thread)
   if(error != NULL){
     //TODO:JK: implement me
   }
-
-  pthread_mutex_unlock(&(ags_application_mutex));
 }
 
 void

-- 
gsequencer packaging



More information about the pkg-multimedia-commits mailing list