Thibault LeMeur ALSA driver patch.
[jack2.git] / tests / testSem.cpp
blobf7df7503ec17654275854252e4e885552fe16bf3
1 /*
2 Copyright (C) 2004-2006 Grame
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <stdio.h>
21 #include <sys/time.h>
22 #include <stdlib.h>
24 #ifdef __APPLE__
25 #include "JackMachSemaphore.h"
26 #include "JackMachThread.h"
27 #endif
29 #include "JackPosixThread.h"
30 #include "JackPosixSemaphore.h"
31 #include "JackFifo.h"
33 #define ITER 500000
35 using namespace Jack;
37 struct ServerThread : public JackRunnableInterface {
39 JackThread* fThread;
40 JackSynchro* fServerSem;
41 JackSynchro* fClientSem;
43 ServerThread()
45 fServerSem->Allocate("JackSemServer", 0);
46 fClientSem->Allocate("JackSemClient", 0);
47 //fThread = new JackMachThread(this);
48 fThread->SetParams(0, 500*1000, 500*1000);
49 fThread->Start();
50 //fThread->AcquireRealTime();
53 virtual ~ServerThread()
55 fThread->Kill();
56 delete fThread;
59 bool Execute()
61 printf("Execute Server\n");
62 for (int i = 0; i < ITER; i++) {
63 fClientSem->Signal();
64 fServerSem->Wait();
66 return true;
71 struct ClientThread : public JackRunnableInterface {
73 JackThread* fThread;
74 JackSynchro* fServerSem;
75 JackSynchro* fClientSem;
77 ClientThread()
79 fServerSem->Connect("JackSemServer");
80 fClientSem->Connect("JackSemClient");
81 //fThread = new JackMachThread(this);
82 fThread->SetParams(0, 500*1000, 500*1000);
83 fThread->Start();
84 //fThread->AcquireRealTime();
87 virtual ~ClientThread()
89 fThread->Kill();
90 delete fThread;
93 bool Execute()
95 struct timeval T0, T1;
96 printf("Execute Client\n");
97 fClientSem->Wait();
98 gettimeofday(&T0, 0);
100 for (int i = 0; i < ITER; i++) {
101 fServerSem->Signal();
102 fClientSem->Wait();
105 gettimeofday(&T1, 0);
106 printf("%5.1lf usec\n", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec) / (2.0 * ITER));
107 return true;
112 void server(JackSynchro* sem)
114 char c;
115 printf("server\n");
117 sem->Allocate("JackSem", 0);
119 while (((c = getchar()) != 'q')) {
121 switch(c) {
123 case 's':
124 printf("SynchroSignal....\n");
125 //sem->Signal();
126 sem->SignalAll();
127 printf("SynchroSignal OK\n");
128 break;
130 case 'w':
131 printf("SemaphoreWait....\n");
132 sem->Wait();
133 printf("SemaphoreWait OK\n");
134 break;
139 void client(JackSynchro* sem)
141 char c;
142 printf("client\n");
144 sem->Connect("JackSem");
146 while (((c = getchar()) != 'q')) {
148 switch(c) {
150 case 's':
151 printf("SemaphoreSignal....\n");
152 sem->Signal();
153 printf("SemaphoreSignal OK\n");
154 break;
156 case 'w':
157 printf("SemaphoreWait....\n");
158 sem->Wait();
159 printf("SemaphoreWait OK\n");
160 break;
165 int main (int argc, char * const argv[])
167 char c;
168 ServerThread* serverthread = NULL;
169 ClientThread* clientthread = NULL;
170 JackSynchro* sem1 = NULL;
172 if (strcmp(argv[1],"-s") == 0) {
173 printf("Posix semaphore\n");
174 sem1 = new JackPosixSemaphore();
177 if (strcmp(argv[1],"-f") == 0) {
178 printf("Fifo\n");
179 sem1 = new JackFifo();
182 #ifdef __APPLE__
183 if (strcmp(argv[1],"-m") == 0) {
184 printf("Mach semaphore\n");
185 sem1 = new JackMachSemaphore();
187 #endif
190 if (strcmp(argv[2], "server") == 0) {
191 serverthread = new ServerThread();
192 } else {
193 clientthread = new ClientThread();
197 if (strcmp(argv[2], "server") == 0) {
198 server(sem1);
199 } else {
200 client(sem1);
203 while (((c = getchar()) != 'q')) {}
205 delete serverthread;
206 delete clientthread;