| 
							- /*
 - 	Copyright (C) 2004-2006 Grame
 - 
 - 	This program is free software; you can redistribute it and/or modify
 - 	it under the terms of the GNU General Public License as published by
 - 	the Free Software Foundation; either version 2 of the License, or
 - 	(at your option) any later version.
 - 
 - 	This program is distributed in the hope that it will be useful,
 - 	but WITHOUT ANY WARRANTY; without even the implied warranty of
 - 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - 	GNU General Public License for more details.
 - 
 - 	You should have received a copy of the GNU General Public License
 - 	along with this program; if not, write to the Free Software
 - 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 - 
 - */
 - 
 - #include <stdio.h>
 - #include <sys/time.h>
 - #include <stdlib.h>
 - 
 - #ifdef __APPLE__
 - #include "JackMachSemaphore.h"
 - #include "JackMachThread.h"
 - #endif
 - 
 - #include "JackPosixThread.h"
 - #include "JackPosixSemaphore.h"
 - #include "JackFifo.h"
 - 
 - #define ITER 500000
 - 
 - using namespace Jack;
 - 
 - struct ServerThread : public JackRunnableInterface {
 - 
 - 	JackThread* fThread;
 -     JackSynchro* fServerSem;
 -     JackSynchro* fClientSem;
 - 	
 - 	ServerThread()
 - 	{
 -         fServerSem->Allocate("JackSemServer", "default", 0);
 -         fClientSem->Allocate("JackSemClient", "default", 0);
 - 		//fThread = new JackMachThread(this);
 - 		fThread->SetParams(0, 500*1000, 500*1000);
 -         fThread->Start();
 - 		//fThread->AcquireRealTime();
 - 	}
 - 
 - 	virtual ~ServerThread()
 - 	{
 -         fThread->Kill();
 - 		delete fThread;
 - 	}
 -      
 -     bool Execute()
 -     {
 - 		printf("Execute Server\n");
 -    		for (int i = 0; i < ITER; i++) {
 - 			fClientSem->Signal();
 -             fServerSem->Wait();
 - 		}
 - 		return true;
 -     }
 - 	
 - };
 - 
 - struct ClientThread : public JackRunnableInterface {
 - 
 - 	JackThread* fThread;
 -     JackSynchro* fServerSem;
 -     JackSynchro* fClientSem;
 - 	
 - 	ClientThread()
 - 	{
 -         fServerSem->Connect("JackSemServer", "default");
 -         fClientSem->Connect("JackSemClient", "default");
 - 		//fThread = new JackMachThread(this);
 - 		fThread->SetParams(0, 500*1000, 500*1000);
 - 		fThread->Start();
 - 		//fThread->AcquireRealTime();
 - 	}
 - 
 - 	virtual ~ClientThread()
 - 	{
 - 		fThread->Kill();
 - 		delete fThread;
 - 	}
 -     
 -     bool Execute()
 -     {
 - 		struct timeval T0, T1;
 -         printf("Execute Client\n");
 -         fClientSem->Wait();
 -     	gettimeofday(&T0, 0); 
 - 		 
 - 		for (int i = 0; i < ITER; i++) {
 - 			fServerSem->Signal();
 -             fClientSem->Wait();
 - 		}
 - 		
 - 		gettimeofday(&T1, 0); 
 - 		printf("%5.1lf usec\n", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec) / (2.0 * ITER));
 - 		return true;
 -     }
 - 	
 - };
 - 
 - void server(JackSynchro* sem)
 - {
 - 	char c;
 - 	printf("server\n");
 - 	
 - 	sem->Allocate("JackSem", "default", 0);
 - 	
 - 	while (((c = getchar()) != 'q')) {
 - 	
 - 		switch(c) {
 - 		
 - 			case 's':
 - 				printf("SynchroSignal....\n");
 - 				//sem->Signal();
 - 				sem->SignalAll();
 - 				printf("SynchroSignal OK\n");
 - 				break;
 - 				
 - 			case 'w':
 - 				printf("SemaphoreWait....\n");
 - 				sem->Wait();
 - 				printf("SemaphoreWait OK\n");
 - 				break;
 - 		}
 - 	}
 - }
 - 
 - void client(JackSynchro* sem)
 - {
 - 	char c;
 - 	printf("client\n");
 - 	
 - 	sem->Connect("JackSem", "default");
 - 	
 - 	while (((c = getchar()) != 'q')) {
 - 	
 - 		switch(c) {
 - 		
 - 			case 's':
 - 				printf("SemaphoreSignal....\n");
 - 				sem->Signal();
 - 				printf("SemaphoreSignal OK\n");
 - 				break;
 - 				
 - 			case 'w':
 - 				printf("SemaphoreWait....\n");
 - 				sem->Wait();
 - 				printf("SemaphoreWait OK\n");
 - 				break;
 - 		}
 - 	}
 - }
 - 
 - int main (int argc, char * const argv[])
 - {
 -     char c;
 -     ServerThread* serverthread = NULL;
 -     ClientThread* clientthread = NULL;
 - 	JackSynchro* sem1 = NULL;
 - 	
 - 	if (strcmp(argv[1],"-s") == 0) {
 - 		printf("Posix semaphore\n");
 - 		sem1 = new JackPosixSemaphore();
 - 	}
 - 			
 - 	if (strcmp(argv[1],"-f") == 0) {
 - 		printf("Fifo\n");
 - 		sem1 = new JackFifo();
 - 	}
 - 
 - #ifdef __APPLE__			
 - 	if (strcmp(argv[1],"-m") == 0) {
 - 		printf("Mach semaphore\n");
 - 		sem1 = new JackMachSemaphore();
 - 	}
 - #endif 
 - 	
 - 	/*  
 -     if (strcmp(argv[2], "server") == 0) {
 - 		serverthread = new ServerThread();
 -     } else {
 - 		clientthread = new ClientThread();
 -     }
 - 	*/
 - 	
 - 	if (strcmp(argv[2], "server") == 0) {
 - 		server(sem1);
 -     } else {
 - 		client(sem1);
 -     }
 -     
 -     while (((c = getchar()) != 'q')) {}
 -     
 -     delete serverthread;
 -     delete clientthread;
 - }
 
 
  |