experimenting with thread safety of fifo.c
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 19 Nov 2012 02:17:31 +0000 (02:17 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 19 Nov 2012 02:17:31 +0000 (02:17 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1021 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/unittest/Makefile.am
codec2-dev/unittest/Makefile.in
codec2-dev/unittest/t48_8.c
codec2-dev/unittest/tfifo.c [new file with mode: 0644]

index 152d0462a5ed8f893fa4d68b403880e643eae0de..df6e327261b07b9c673b99ba6acf6f6325ede9c8 100644 (file)
@@ -3,7 +3,7 @@ AUTOMAKE_OPTS = gnu
 NAME = libcodec2
 AM_CPPFLAGS = $(AM_CFLAGS)
 
-noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens vqtrainph genphdata genampdata polar2rect vqtrainsp tprede pre de 
+noinst_PROGRAMS = genres genlsp extract vqtrain vqtrainjnd tnlp tinterp tquant vq_train_jvm scalarlsptest tfdmdv t48_8 lspsync create_interleaver tlspsens vqtrainph genphdata genampdata polar2rect vqtrainsp tprede pre de tfifo
 
 genres_SOURCES = genres.c ../src/lpc.c
 genres_LDADD = $(lib_LTLIBRARIES) 
@@ -100,6 +100,6 @@ de_SOURCES = de.c ../src/lpc.c
 de_LDADD = $(lib_LTLIBRARIES) 
 de_LDFLAGS = $(LIBS)
 
-#tsrc_SOURCES = tsrc.c 
-#tsrc_LDADD = $(lib_LTLIBRARIES) /usr/lib/libsamplerate.so.0
-#tsrc_LDFLAGS = $(LIBS)
+tfifo_SOURCES = tfifo.c ../src/fifo.c
+tfifo_LDADD = $(lib_LTLIBRARIES) -lpthread
+tfifo_LDFLAGS = $(LIBS)
index aecd44d56df2984ea125424f5bd038f5100a2a24..7ab79dcb4d572da7499fd1ee2c29edb203d888ab 100644 (file)
@@ -43,7 +43,7 @@ noinst_PROGRAMS = genres$(EXEEXT) genlsp$(EXEEXT) extract$(EXEEXT) \
        lspsync$(EXEEXT) create_interleaver$(EXEEXT) tlspsens$(EXEEXT) \
        vqtrainph$(EXEEXT) genphdata$(EXEEXT) genampdata$(EXEEXT) \
        polar2rect$(EXEEXT) vqtrainsp$(EXEEXT) tprede$(EXEEXT) \
-       pre$(EXEEXT) de$(EXEEXT)
+       pre$(EXEEXT) de$(EXEEXT) tfifo$(EXEEXT)
 subdir = unittest
 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -103,6 +103,9 @@ am_tfdmdv_OBJECTS = tfdmdv.$(OBJEXT) fdmdv.$(OBJEXT) \
        kiss_fft.$(OBJEXT) octave.$(OBJEXT)
 tfdmdv_OBJECTS = $(am_tfdmdv_OBJECTS)
 tfdmdv_DEPENDENCIES =
+am_tfifo_OBJECTS = tfifo.$(OBJEXT) fifo.$(OBJEXT)
+tfifo_OBJECTS = $(am_tfifo_OBJECTS)
+tfifo_DEPENDENCIES =
 am_tinterp_OBJECTS = tinterp.$(OBJEXT) sine.$(OBJEXT) \
        kiss_fft.$(OBJEXT) interp.$(OBJEXT) lpc.$(OBJEXT) \
        lsp.$(OBJEXT) quantise.$(OBJEXT) $(am__objects_1) \
@@ -158,19 +161,19 @@ SOURCES = $(create_interleaver_SOURCES) $(de_SOURCES) \
        $(extract_SOURCES) $(genampdata_SOURCES) $(genlsp_SOURCES) \
        $(genphdata_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \
        $(polar2rect_SOURCES) $(pre_SOURCES) $(scalarlsptest_SOURCES) \
-       $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \
-       $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tprede_SOURCES) \
-       $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \
-       $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
+       $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tfifo_SOURCES) \
+       $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \
+       $(tprede_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \
+       $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
        $(vqtrainsp_SOURCES)
 DIST_SOURCES = $(create_interleaver_SOURCES) $(de_SOURCES) \
        $(extract_SOURCES) $(genampdata_SOURCES) $(genlsp_SOURCES) \
        $(genphdata_SOURCES) $(genres_SOURCES) $(lspsync_SOURCES) \
        $(polar2rect_SOURCES) $(pre_SOURCES) $(scalarlsptest_SOURCES) \
-       $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tinterp_SOURCES) \
-       $(tlspsens_SOURCES) $(tnlp_SOURCES) $(tprede_SOURCES) \
-       $(tquant_SOURCES) $(vq_train_jvm_SOURCES) $(vqtrain_SOURCES) \
-       $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
+       $(t48_8_SOURCES) $(tfdmdv_SOURCES) $(tfifo_SOURCES) \
+       $(tinterp_SOURCES) $(tlspsens_SOURCES) $(tnlp_SOURCES) \
+       $(tprede_SOURCES) $(tquant_SOURCES) $(vq_train_jvm_SOURCES) \
+       $(vqtrain_SOURCES) $(vqtrainjnd_SOURCES) $(vqtrainph_SOURCES) \
        $(vqtrainsp_SOURCES)
 ETAGS = etags
 CTAGS = ctags
@@ -355,6 +358,9 @@ pre_LDFLAGS = $(LIBS)
 de_SOURCES = de.c ../src/lpc.c 
 de_LDADD = $(lib_LTLIBRARIES) 
 de_LDFLAGS = $(LIBS)
+tfifo_SOURCES = tfifo.c ../src/fifo.c
+tfifo_LDADD = $(lib_LTLIBRARIES) -lpthread
+tfifo_LDFLAGS = $(LIBS)
 all: all-am
 
 .SUFFIXES:
@@ -434,6 +440,9 @@ t48_8$(EXEEXT): $(t48_8_OBJECTS) $(t48_8_DEPENDENCIES)
 tfdmdv$(EXEEXT): $(tfdmdv_OBJECTS) $(tfdmdv_DEPENDENCIES) 
        @rm -f tfdmdv$(EXEEXT)
        $(LINK) $(tfdmdv_LDFLAGS) $(tfdmdv_OBJECTS) $(tfdmdv_LDADD) $(LIBS)
+tfifo$(EXEEXT): $(tfifo_OBJECTS) $(tfifo_DEPENDENCIES) 
+       @rm -f tfifo$(EXEEXT)
+       $(LINK) $(tfifo_LDFLAGS) $(tfifo_OBJECTS) $(tfifo_LDADD) $(LIBS)
 tinterp$(EXEEXT): $(tinterp_OBJECTS) $(tinterp_DEPENDENCIES) 
        @rm -f tinterp$(EXEEXT)
        $(LINK) $(tinterp_LDFLAGS) $(tinterp_OBJECTS) $(tinterp_LDADD) $(LIBS)
@@ -485,6 +494,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdmdv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fifo.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genampdata.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genlsp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genphdata.Po@am__quote@
@@ -506,6 +516,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sine.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t48_8.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tfdmdv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tfifo.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tinterp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlspsens.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tnlp.Po@am__quote@
@@ -846,6 +857,20 @@ octave.obj: ../src/octave.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o octave.obj `if test -f '../src/octave.c'; then $(CYGPATH_W) '../src/octave.c'; else $(CYGPATH_W) '$(srcdir)/../src/octave.c'; fi`
 
+fifo.o: ../src/fifo.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fifo.o -MD -MP -MF "$(DEPDIR)/fifo.Tpo" -c -o fifo.o `test -f '../src/fifo.c' || echo '$(srcdir)/'`../src/fifo.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/fifo.Tpo" "$(DEPDIR)/fifo.Po"; else rm -f "$(DEPDIR)/fifo.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='../src/fifo.c' object='fifo.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fifo.o `test -f '../src/fifo.c' || echo '$(srcdir)/'`../src/fifo.c
+
+fifo.obj: ../src/fifo.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fifo.obj -MD -MP -MF "$(DEPDIR)/fifo.Tpo" -c -o fifo.obj `if test -f '../src/fifo.c'; then $(CYGPATH_W) '../src/fifo.c'; else $(CYGPATH_W) '$(srcdir)/../src/fifo.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/fifo.Tpo" "$(DEPDIR)/fifo.Po"; else rm -f "$(DEPDIR)/fifo.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='../src/fifo.c' object='fifo.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o fifo.obj `if test -f '../src/fifo.c'; then $(CYGPATH_W) '../src/fifo.c'; else $(CYGPATH_W) '$(srcdir)/../src/fifo.c'; fi`
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -1022,10 +1047,6 @@ uninstall-am: uninstall-info-am
        pdf pdf-am ps ps-am tags uninstall uninstall-am \
        uninstall-info-am
 
-
-#tsrc_SOURCES = tsrc.c 
-#tsrc_LDADD = $(lib_LTLIBRARIES) /usr/lib/libsamplerate.so.0
-#tsrc_LDFLAGS = $(LIBS)
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
index 04c79b564da6df6374357325ba5ada7f8a98271a..1eff979b20b478ef8ff65b60a07863f15435667a 100644 (file)
@@ -43,7 +43,7 @@ int main() {
     FILE *f8;
 
     int i,f,t,t1;
-    float freq = 505.0;
+    float freq = 800.0;
 
     f48 = fopen("out48.raw", "wb");
     assert(f48 != NULL);
diff --git a/codec2-dev/unittest/tfifo.c b/codec2-dev/unittest/tfifo.c
new file mode 100644 (file)
index 0000000..d7c64c7
--- /dev/null
@@ -0,0 +1,103 @@
+/* 
+   tfifo.c
+   David Rowe
+   Nov 19 2012
+
+   Takes FIFOs, in particular thread safety.
+*/
+
+#include <assert.h>
+#include <stdio.h>
+#include <pthread.h>
+#include "fifo.h"
+
+#define FIFO_SZ  1024
+#define WRITE_SZ 10
+#define READ_SZ  8  
+#define N_MAX    100
+#define LOOPS    10000
+
+int run_thread = 1;
+struct FIFO *f;
+
+void writer(void);
+void *writer_thread(void *data);
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#define USE_THREADS
+#define USE_MUTEX
+
+int main() {
+    pthread_t awriter_thread;
+    int    i,j;
+    short  read_buf[READ_SZ];
+    int    n_out = 0;
+    int    sucess;
+
+    f = fifo_create(FIFO_SZ);
+    #ifdef USE_THREADS
+    pthread_create(&awriter_thread, NULL, writer_thread, NULL);
+    #endif
+
+    for(i=0; i<LOOPS; ) {
+        #ifndef USE_THREADS
+        writer();
+        #endif
+
+        #ifdef USE_MUTEX
+        pthread_mutex_lock(&mutex);
+        #endif
+        sucess = (fifo_read(f, read_buf, READ_SZ) == 0);
+        #ifdef USE_MUTEX
+        pthread_mutex_unlock(&mutex);
+        #endif
+
+       if (sucess) {
+           for(j=0; j<READ_SZ; j++) {
+                if (read_buf[j] != n_out) 
+                    printf("error: %d %d\n", read_buf[j], n_out);
+                n_out++;
+                if (n_out == N_MAX)
+                    n_out = 0;
+            }
+            i++;
+        }
+    }
+
+    #ifdef USE_THREADS
+    run_thread = 0;
+    pthread_join(awriter_thread,NULL);
+    #endif
+
+    return 0;
+}
+
+int    n_in = 0;
+
+void writer(void) {
+    short  write_buf[WRITE_SZ];
+    int    i;
+
+    if ((FIFO_SZ - fifo_n(f)) > WRITE_SZ) {
+        for(i=0; i<WRITE_SZ; i++) {
+            write_buf[i] = n_in++;
+            if (n_in == N_MAX)
+                n_in = 0;
+        }
+        #ifdef USE_MUTEX
+        pthread_mutex_lock(&mutex);
+        #endif
+        fifo_write(f, write_buf, WRITE_SZ);
+        pthread_mutex_unlock(&mutex);
+    }
+}
+
+void *writer_thread(void *data) {
+
+    while(run_thread) {
+        writer();
+    }
+
+    return NULL; 
+}