Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8553
Modified Files: Tag: devel_0_38 d_soundfile.c Log Message: fixed thread synchronisation problem
Index: d_soundfile.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/d_soundfile.c,v retrieving revision 1.4.4.4 retrieving revision 1.4.4.5 diff -C2 -d -r1.4.4.4 -r1.4.4.5 *** d_soundfile.c 24 Nov 2004 14:31:21 -0000 1.4.4.4 --- d_soundfile.c 26 Nov 2004 10:09:46 -0000 1.4.4.5 *************** *** 1007,1010 **** --- 1007,1014 ---- int i; t_sfprocess * next; + + #ifdef DEBUG + post("soundfiler_thread ID: %d", pthread_self()); + #endif while (1) { *************** *** 1137,1140 **** --- 1141,1145 ---- TB: adapted for threaded use */ + static t_int soundfiler_t_read_callback(t_int * w);
static void soundfiler_t_read(t_soundfiler *x, t_symbol *s, *************** *** 1143,1152 **** int headersize = -1, channels = 0, bytespersamp = 0, bigendian = 0, resize = 0, i, j; ! long skipframes = 0, ! nframes = 0, finalsize = 0, /* new size */ itemsleft, ! maxsize = DEFMAXSIZE, ! itemsread = 0, bytelimit = 0x7fffffff; int fd = -1; --- 1148,1157 ---- int headersize = -1, channels = 0, bytespersamp = 0, bigendian = 0, resize = 0, i, j; ! long skipframes = 0, ! nframes = 0, finalsize = 0, /* new size */ itemsleft, ! maxsize = DEFMAXSIZE, ! itemsread = 0, bytelimit = 0x7fffffff; int fd = -1; *************** *** 1159,1163 **** int bufframes, nitems; FILE *fp; ! while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_w.w_symbol->s_name == '-') --- 1164,1169 ---- int bufframes, nitems; FILE *fp; ! pthread_cond_t resume_after_callback = PTHREAD_COND_INITIALIZER; ! pthread_mutex_t resume_after_callback_mutex = PTHREAD_MUTEX_INITIALIZER; /* dummy */ while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_w.w_symbol->s_name == '-') *************** *** 1185,1191 **** argv[2].a_type != A_FLOAT || ((channels = argv[2].a_w.w_float) < 1) || ! (channels > MAXSFCHANS) || argv[3].a_type != A_FLOAT || ! ((bytespersamp = argv[3].a_w.w_float) < 2) || (bytespersamp > 4) || argv[4].a_type != A_SYMBOL || --- 1191,1197 ---- argv[2].a_type != A_FLOAT || ((channels = argv[2].a_w.w_float) < 1) || ! (channels > MAXSFCHANS) || argv[3].a_type != A_FLOAT || ! ((bytespersamp = argv[3].a_w.w_float) < 2) || (bytespersamp > 4) || argv[4].a_type != A_SYMBOL || *************** *** 1305,1309 **** for (j=0; j!=i;++j) /* if the resizing fails, we'll have to free all arrays again */ ! freealignedbytes (nvecs[i],finalsize * sizeof(t_float)); goto done; } --- 1311,1315 ---- for (j=0; j!=i;++j) /* if the resizing fails, we'll have to free all arrays again */ ! freealignedbytes (nvecs[i],finalsize * sizeof(t_float)); goto done; } *************** *** 1324,1328 **** for (j=0; j!=i;++j) /* if the resizing fails, we'll have to free all arrays again */ ! freealignedbytes (nvecs[i],vecsize[i] * sizeof(t_float)); goto done; } --- 1330,1334 ---- for (j=0; j!=i;++j) /* if the resizing fails, we'll have to free all arrays again */ ! freealignedbytes (nvecs[i],vecsize[i] * sizeof(t_float)); goto done; } *************** *** 1332,1335 **** --- 1338,1345 ---- }
+ #ifdef SFDEBUG + post("transfer soundfile"); + #endif + for (itemsread = 0; itemsread < finalsize; ) { *************** *** 1343,1346 **** --- 1353,1359 ---- }
+ #ifdef SFDEBUG + post("zeroing remaining elements"); + #endif /* zero out remaining elements of vectors */ for (i = 0; i < argc; i++) *************** *** 1350,1389 **** }
! /* lock the system and reset the garrays */ ! sys_lock(); for (i = 0; i < argc; i++) { ! #ifdef GARRAY_THREAD_LOCK ! garray_lock(garrays[i]); ! #endif ! garrays[i]->x_array.a_vec = (char *) nvecs[i]; ! garrays[i]->x_array.a_n = finalsize; ! #ifdef GARRAY_THREAD_LOCK ! garray_unlock(garrays[i]); ! #endif ! if (garrays[i]->x_usedindsp) canvas_update_dsp(); } - sys_unlock();
! /* do all graphics updates */ ! for (i = 0; i < argc; i++) ! { ! t_glist *gl; ! int n = finalsize; ! /* if this is the only array in the graph, ! reset the graph's coordinates */ ! gl = garrays[i]->x_glist; ! if (gl->gl_list == &garrays[i]->x_gobj && !garrays[i]->x_gobj.g_next) ! { ! vmess(&gl->gl_pd, gensym("bounds"), "ffff", ! 0., gl->gl_y1, (double)(n > 1 ? n-1 : 1), gl->gl_y2); ! /* close any dialogs that might have the wrong info now... */ ! gfxstub_deleteforkey(gl); ! } ! else garray_redraw(garrays[i]); ! }
end: /* free the old arrays */ for (i = 0; i < argc; i++) freealignedbytes(vecs[i], vecsize[i] * sizeof(t_float)); --- 1363,1415 ---- }
! /* set idle callback to switch pointers */ ! #ifdef SFDEBUG ! post("locked"); ! #endif for (i = 0; i < argc; i++) { ! t_int w[4]; ! ! post("nvec %p",(char*)nvecs[i]); ! post("%d",finalsize); ! ! w[0] = (t_int)(garrays[i]); ! w[1] = (t_int)nvecs[i]; ! w[2] = (t_int)finalsize; ! w[3] = (t_int)(&resume_after_callback); ! ! set_callback(&soundfiler_t_read_callback, w, 4); ! pthread_cond_wait(&resume_after_callback, &resume_after_callback_mutex); ! }
! #ifdef SFDEBUG ! post("unlocked, doing graphics updates"); ! #endif ! ! /* todo: do all graphics updates */ ! ! /* run this in the main thread via callback */ ! /* for (i = 0; i < argc; i++) */ ! /* { */ ! /* t_glist *gl; */ ! /* int n = finalsize; */ ! /* /* if this is the only array in the graph, */ ! /* reset the graph's coordinates */ */ ! /* gl = garrays[i]->x_glist; */ ! /* if (gl->gl_list == &garrays[i]->x_gobj && !garrays[i]->x_gobj.g_next) */ ! /* { */ ! /* vmess(&gl->gl_pd, gensym("bounds"), "ffff", */ ! /* 0., gl->gl_y1, (double)(n > 1 ? n-1 : 1), gl->gl_y2); */ ! /* /* close any dialogs that might have the wrong info now... */ */ ! /* gfxstub_deleteforkey(gl); */ ! /* } */ ! /* else garray_redraw(garrays[i]); */ ! /* } */
end: /* free the old arrays */ + + post("freeing arrays"); for (i = 0; i < argc; i++) freealignedbytes(vecs[i], vecsize[i] * sizeof(t_float)); *************** *** 1402,1408 **** mlockall(MCL_FUTURE); #endif ! sys_lock(); ! outlet_float(x->x_obj.ob_outlet, (float)itemsread); ! sys_unlock(); }
--- 1428,1475 ---- mlockall(MCL_FUTURE); #endif ! post("bang"); ! ! /* todo: do this in the idle callback */ ! /* sys_lock(); */ ! /* outlet_float(x->x_obj.ob_outlet, (float)itemsread); */ ! /* sys_unlock(); */ ! } ! ! /* idle callback for threadsafe synchronisation */ ! static t_int soundfiler_t_read_callback(t_int * w) ! { ! t_garray* garray = (t_garray*)w[0]; ! t_int nvec = w[1]; ! t_int finalsize = w[2]; ! pthread_cond_t * conditional = (pthread_cond_t*) w[3]; ! ! post("w: %p",w); ! post("%p",garray); ! post("nvec %p",(char*)nvec); ! post("%d",finalsize); ! ! #ifdef GARRAY_THREAD_LOCK ! ! #ifdef SFDEBUG ! post("lock array %p", garray); ! #endif ! ! garray_lock(garray); ! #endif ! garray->x_array.a_vec = (char *) nvec; ! garray->x_array.a_n = finalsize; ! if (garray->x_usedindsp) canvas_update_dsp(); ! ! #ifdef GARRAY_THREAD_LOCK ! ! #ifdef SFDEBUG ! post("unlock array %p", garray); ! #endif ! ! garray_unlock(garray); ! #endif ! pthread_cond_broadcast(conditional); ! ! return 0; }