Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21646
Modified Files:
Tag: devel_0_37
g_array.c
Log Message:
t_garray thread locks
Index: g_array.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/g_array.c,v
retrieving revision 1.1.1.3.2.3
retrieving revision 1.1.1.3.2.4
diff -C2 -d -r1.1.1.3.2.3 -r1.1.1.3.2.4
*** g_array.c 6 May 2004 08:28:12 -0000 1.1.1.3.2.3
--- g_array.c 23 May 2004 18:53:32 -0000 1.1.1.3.2.4
***************
*** 10,13 ****
--- 10,24 ----
#include <math.h>
+ /* Tim Blechmann: garray thread locks: */
+ //#define GARRAY_THREAD_LOCK
+ #ifdef GARRAY_THREAD_LOCK
+
+ #ifdef __linux__
+ #define __USE_GNU /* we need that for linux threads */
+ #endif
+
+ #include <pthread.h>
+ #endif /* GARRAY_THREAD_LOCK */
+
/* see also the "plot" object in g_scalar.c which deals with graphing
arrays which are fields in scalars. Someday we should unify the
***************
*** 116,120 ****
char x_usedindsp; /* true if some DSP routine is using this */
char x_saveit; /* true if we should save this with parent */
! double x_lastupdate; /* T.Grill - clock_getlogicaltime() of last array update */
};
--- 127,134 ----
char x_usedindsp; /* true if some DSP routine is using this */
char x_saveit; /* true if we should save this with parent */
! double x_lastupdate; /* T.Grill - clock_getlogicaltime() of last array update */
! #ifdef GARRAY_THREAD_LOCK
! pthread_mutex_t * x_mutex; /* TB: mutex */
! #endif
};
***************
*** 125,133 ****
#define x_templatesym x_array.a_templatesym
/* T.Grill - set update time */
static void garray_update(t_garray *x)
{
! x->x_lastupdate = clock_getlogicaltime();
}
--- 139,180 ----
#define x_templatesym x_array.a_templatesym
+ /* TB: array thread locks */
+ #ifdef GARRAY_THREAD_LOCK
+ void garray_lock(t_garray *x)
+ {
+ // post("locking array");
+ pthread_mutex_lock(x->x_mutex);
+ }
+
+ void garray_unlock(t_garray *x)
+ {
+ // post("unlocking array");
+ pthread_mutex_unlock(x->x_mutex);
+ }
+
+ int garray_trylock(t_garray *x)
+ {
+ // post("trying to lock array");
+ return pthread_mutex_trylock(x->x_mutex);
+ }
+ #else
+ void garray_lock(t_garray *x)
+ {
+ }
+
+ void garray_unlock(t_garray *x)
+ {
+ }
+
+ int garray_trylock(t_garray *x)
+ {
+ return 0;
+ }
+ #endif /* GARRAY_THREAD_LOCK */
/* T.Grill - set update time */
static void garray_update(t_garray *x)
{
! x->x_lastupdate = clock_getlogicaltime();
}
***************
*** 189,195 ****
x->x_usedindsp = 0;
x->x_saveit = (saveit != 0);
if (x2 = pd_findbyclass(gensym("#A"), garray_class))
pd_unbind(x2, gensym("#A"));
-
pd_bind(&x->x_gobj.g_pd, gensym("#A"));
--- 236,254 ----
x->x_usedindsp = 0;
x->x_saveit = (saveit != 0);
+
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ x->x_mutex=getbytes(sizeof(pthread_mutex_t));
+ #ifdef __linux__
+ *(x->x_mutex)=(pthread_mutex_t) PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
+ #else
+ pthread_mutexattr_t mutex_attr;
+ pthread_mutexattr_init (&mutex_attr);
+ pthread_mutexattr_settype(&mutex_attr,PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(x->x_mutex, &mutex_attr);
+ #endif
+ #endif /* GARRAY_THREAD_LOCK */
+
if (x2 = pd_findbyclass(gensym("#A"), garray_class))
pd_unbind(x2, gensym("#A"));
pd_bind(&x->x_gobj.g_pd, gensym("#A"));
***************
*** 242,245 ****
--- 301,307 ----
t_floatarg saveit, t_floatarg deleteit)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
if (deleteit != 0)
{
***************
*** 265,272 ****
--- 327,342 ----
garray_redraw(x);
}
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
static void garray_free(t_garray *x)
{
+ #ifdef GARRAY_THREAD_LOCK
+ garray_lock(x);/* TB: thread lock */
+ pthread_mutex_destroy(x->x_mutex);
+ freebytes(x->x_mutex,sizeof(pthread_mutex_t));
+ #endif
t_pd *x2;
gfxstub_deleteforkey(x);
***************
*** 402,407 ****
glist_redrawitem(array_motion_glist, array_motion_gobj);
! /* T.Grill - don't know if the array has really changed.... should be enhanced */
! garray_update((t_garray *)array_motion_gobj);
}
--- 472,477 ----
glist_redrawitem(array_motion_glist, array_motion_gobj);
! /* T.Grill - don't know if the array has really changed.... should be enhanced */
! garray_update((t_garray *)array_motion_gobj);
}
***************
*** 754,762 ****
--- 824,842 ----
void garray_usedindsp(t_garray *x)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
x->x_usedindsp = 1;
+ #ifdef GARRAY_THREAD_LOCK
+ garray_unlock(x); /* TB: array lock */
+ #endif
}
void garray_redraw(t_garray *x)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
+
if (glist_isvisible(x->x_glist))
{
***************
*** 765,770 ****
}
! /* T.Grill - last update time */
! garray_update(x);
}
--- 845,854 ----
}
! /* T.Grill - last update time */
! garray_update(x);
!
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_unlock(x);
! #endif
}
***************
*** 772,776 ****
double garray_updatetime(t_garray *x)
{
! return x->x_lastupdate;
}
--- 856,866 ----
double garray_updatetime(t_garray *x)
{
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_lock(x);
! #endif
! return x->x_lastupdate;
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_unlock(x);
! #endif
}
***************
*** 781,785 ****
--- 871,881 ----
t_template *garray_template(t_garray *x)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = template_findbyname(x->x_templatesym);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
if (!template)
bug("garray_template");
***************
*** 789,798 ****
int garray_npoints(t_garray *x) /* get the length */
{
! return (x->x_n);
}
char *garray_vec(t_garray *x) /* get the contents */
{
! return ((char *)(x->x_vec));
}
--- 885,908 ----
int garray_npoints(t_garray *x) /* get the length */
{
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_lock(x);
! #endif
! int ret = (x->x_n);
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_unlock(x);
! #endif
! return ret;
}
char *garray_vec(t_garray *x) /* get the contents */
{
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_lock(x);
! #endif
! char * ret =((char *)(x->x_vec));
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_unlock(x);
! #endif
! return ret;
}
***************
*** 802,805 ****
--- 912,918 ----
int garray_getfloatarray(t_garray *x, int *size, t_float **vec)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
int yonset, type;
***************
*** 815,820 ****
--- 928,939 ----
*size = garray_npoints(x);
*vec = (float *)garray_vec(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return (1);
}
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return (0);
}
***************
*** 823,826 ****
--- 942,948 ----
float garray_get(t_garray *x, t_symbol *s, t_int indx)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
int yonset, type;
***************
*** 835,839 ****
if (indx < 0) indx = 0;
else if (indx >= x->x_n) indx = x->x_n - 1;
! return (*(float *)((x->x_vec + sizeof(t_word) * indx) + yonset));
}
--- 957,966 ----
if (indx < 0) indx = 0;
else if (indx >= x->x_n) indx = x->x_n - 1;
! float ret = (*(float *)((x->x_vec + sizeof(t_word) * indx) + yonset));
!
! #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
! garray_unlock(x);
! #endif
! return ret;
}
***************
*** 841,853 ****
--- 968,990 ----
void garray_setsaveit(t_garray *x, int saveit)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
if (x->x_saveit && !saveit)
post("warning: array %s: clearing save-in-patch flag",
x->x_name->s_name);
x->x_saveit = saveit;
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
+
/*------------------- Pd messages ------------------------ */
static void garray_const(t_garray *x, t_floatarg g)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
int yonset, type, i;
***************
*** 860,863 ****
--- 997,1003 ----
*(float *)(((char *)x->x_vec + sizeof(t_word) * i) + yonset) = g;
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
***************
*** 866,869 ****
--- 1006,1012 ----
int nsin, t_float *vsin, int sineflag)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
int yonset, type, i, j;
***************
*** 895,902 ****
--- 1038,1052 ----
}
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
+
}
static void garray_sinesum(t_garray *x, t_symbol *s, int argc, t_atom *argv)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
***************
*** 920,927 ****
--- 1070,1083 ----
garray_dofo(x, npoints, 0, argc, svec, 1);
t_freebytes(svec, sizeof(t_float) * argc);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
static void garray_cosinesum(t_garray *x, t_symbol *s, int argc, t_atom *argv)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
***************
*** 945,952 ****
--- 1101,1115 ----
garray_dofo(x, npoints, 0, argc, svec, 0);
t_freebytes(svec, sizeof(t_float) * argc);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
+
}
static void garray_normalize(t_garray *x, t_float f)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
t_template *template = garray_template(x);
int yonset, type, npoints, i;
***************
*** 981,984 ****
--- 1144,1151 ----
}
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
+
}
***************
*** 987,990 ****
--- 1154,1161 ----
static void garray_list(t_garray *x, t_symbol *s, int argc, t_atom *argv)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
+
t_template *template = garray_template(x);
int yonset, type, i;
***************
*** 1018,1021 ****
--- 1189,1195 ----
}
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
***************
*** 1024,1028 ****
--- 1198,1208 ----
t_floatarg x2, t_floatarg y2)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
vmess(&x->x_glist->gl_pd, gensym("bounds"), "ffff", x1, y1, x2, y2);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
***************
*** 1031,1035 ****
--- 1211,1221 ----
t_floatarg point, t_floatarg inc, t_floatarg f)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
vmess(&x->x_glist->gl_pd, gensym("xticks"), "fff", point, inc, f);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
***************
*** 1037,1062 ****
--- 1223,1277 ----
t_floatarg point, t_floatarg inc, t_floatarg f)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
vmess(&x->x_glist->gl_pd, gensym("yticks"), "fff", point, inc, f);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
+
static void garray_xlabel(t_garray *x, t_symbol *s, int argc, t_atom *argv)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
typedmess(&x->x_glist->gl_pd, s, argc, argv);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
static void garray_ylabel(t_garray *x, t_symbol *s, int argc, t_atom *argv)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
typedmess(&x->x_glist->gl_pd, s, argc, argv);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
+
/* change the name of a garray. */
static void garray_rename(t_garray *x, t_symbol *s)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
pd_unbind(&x->x_gobj.g_pd, x->x_realname);
pd_bind(&x->x_gobj.g_pd, x->x_realname = x->x_name = s);
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
static void garray_read(t_garray *x, t_symbol *filename)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
int nelem = x->x_n, filedesc;
FILE *fd;
***************
*** 1069,1072 ****
--- 1284,1290 ----
{
error("%s: needs floating-point 'y' field", x->x_templatesym->s_name);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1077,1080 ****
--- 1295,1301 ----
{
error("%s: can't open", filename->s_name);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1093,1096 ****
--- 1314,1320 ----
fclose(fd);
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
***************
*** 1109,1112 ****
--- 1333,1340 ----
t_symbol *endian, t_floatarg fskip)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
+
int skip = fskip, filedesc;
int i, nelem;
***************
*** 1133,1136 ****
--- 1361,1367 ----
{
error("%s: not a float array", x->x_templatesym->s_name);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1141,1144 ****
--- 1372,1378 ----
{
error("%s: can't open", filename->s_name);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1150,1153 ****
--- 1384,1390 ----
error("%s: can't seek to byte %d", buf, skip);
fclose(fd);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1168,1175 ****
--- 1405,1419 ----
fclose(fd);
garray_redraw(x);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
static void garray_write(t_garray *x, t_symbol *filename)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
+
FILE *fd;
char buf[MAXPDSTRING];
***************
*** 1181,1184 ****
--- 1425,1431 ----
{
error("%s: needs floating-point 'y' field", x->x_templatesym->s_name);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1189,1192 ****
--- 1436,1442 ----
{
error("%s: can't create", buf);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1200,1203 ****
--- 1450,1456 ----
}
}
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
fclose(fd);
}
***************
*** 1222,1225 ****
--- 1475,1482 ----
static void garray_write16(t_garray *x, t_symbol *filename, t_symbol *format)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
+
t_template *template = garray_template(x);
int yonset, type, i;
***************
*** 1247,1250 ****
--- 1504,1510 ----
{
error("%s: needs floating-point 'y' field", x->x_templatesym->s_name);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1255,1258 ****
--- 1515,1521 ----
{
error("%s: can't create", buf2);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1297,1300 ****
--- 1560,1566 ----
}
closeit:
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
fclose(fd);
}
***************
*** 1302,1305 ****
--- 1568,1574 ----
void garray_resize(t_garray *x, t_floatarg f)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
int was = x->x_n, elemsize;
t_glist *gl;
***************
*** 1314,1317 ****
--- 1583,1589 ----
{
pd_error(x, "array resize failed: out of memory");
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
return;
}
***************
*** 1335,1344 ****
--- 1607,1625 ----
else garray_redraw(x);
if (x->x_usedindsp) canvas_update_dsp();
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}
static void garray_print(t_garray *x)
{
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_lock(x);
+ #endif
post("garray %s: template %s, length %d",
x->x_name->s_name, x->x_templatesym->s_name, x->x_n);
+ #ifdef GARRAY_THREAD_LOCK /* TB: array lock */
+ garray_unlock(x);
+ #endif
}