| 
							- /*
 - 	Copyright (C) 2004-2008 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>
 - #include <string.h>
 - #include <unistd.h>
 - 
 - #ifdef __APPLE__
 - #include "JackMachThread.h"
 - #endif
 - 
 - #include "JackPosixThread.h"
 - #include "JackMutex.h"
 - #include "thread.h"
 - 
 - using namespace Jack;
 - 
 - static void CleanupHandler(void * arg)
 - {
 -     JackLockAble* locked = (JackLockAble*)arg;
 -     printf("CleanupHandler locked %px \n", locked);
 -     locked->Unlock();
 - }
 - 
 - struct LockedObject : public JackLockAble {
 - 
 -     int fCount;
 -  	
 - 	LockedObject():fCount(0)
 - 	{}
 -     
 -     virtual ~LockedObject()
 - 	{}
 -     
 -     /*
 -     void LockedMethod1()
 -     {   
 -         JackLock lock(this);
 -         fCount++;
 -         printf("LockedMethod1 self %x fCount %d\n", pthread_self(), fCount);
 -         if (fCount >= 1000) {
 -             printf("Terminate self %x\n", pthread_self());
 -             pthread_exit(NULL);
 -         }
 -    }
 -     
 -     void LockedMethod2()
 -     {   
 -         JackLock lock(this);
 -         fCount++;
 -         printf("LockedMethod2 self %x fCount %d\n", pthread_self(), fCount);
 -         if (fCount >= 1500) {
 -             printf("Terminate self %x\n", pthread_self());
 -             pthread_exit(NULL);
 -         }
 -     }
 -     
 -     void LockedMethod3()
 -     {   
 -         JackLock lock(this);
 -         fCount++;
 -         printf("LockedMethod3 self %x fCount %d\n", pthread_self(), fCount);
 -         if (fCount >= 3000) {
 -             printf("Terminate self %x\n", pthread_self());
 -             pthread_exit(NULL);
 -         }
 -     }
 -     */
 -     
 -     void LockedMethod1()
 -     {   
 -         pthread_cleanup_push(CleanupHandler, this);
 -         Lock();
 -         fCount++;
 -         //printf("LockedMethod1 self %x fCount %d\n", pthread_self(), fCount);
 -         if (fCount >= 1000) {
 -             printf("Terminate self = %px  count = %d\n", pthread_self(), fCount);
 -             pthread_exit(NULL);
 -         }
 -         Unlock();
 -         pthread_cleanup_pop(0);
 -     }
 -     
 -     void LockedMethod2()
 -     {   
 -         pthread_cleanup_push(CleanupHandler, this);
 -         Lock();
 - 
 -         fCount++;
 -         //printf("LockedMethod2 self %x fCount %d\n", pthread_self(), fCount);
 -         if (fCount >= 1500) {
 -             printf("Terminate self = %px  count = %d\n", pthread_self(), fCount);
 -             pthread_exit(NULL);
 -         }
 -         Unlock();
 -         pthread_cleanup_pop(0);
 -     }
 -     
 -     void LockedMethod3()
 -     {   
 -         pthread_cleanup_push(CleanupHandler, this);
 -         Lock();
 - 
 -         fCount++;
 -         //printf("LockedMethod3 self %x fCount %d\n", pthread_self(), fCount);
 -         if (fCount >= 3000) {
 -             printf("Terminate self = %px  count = %d\n", pthread_self(), fCount);
 -             pthread_exit(NULL);
 -         }
 -         Unlock();
 -         pthread_cleanup_pop(0);
 -     }
 - 
 - 
 - };
 - 
 - struct TestThread : public JackRunnableInterface {
 - 
 - 	JackMachThread* fThread;
 -     LockedObject* fObject;
 -     int fNum;
 -  	
 - 	TestThread(LockedObject* obj, int num)
 - 	{
 -         printf("TestThread\n");
 -         fThread = new JackMachThread(this);
 -         fObject = obj;
 -         fNum = num;
 - 	    fThread->StartSync();
 -    }
 - 
 - 	virtual ~TestThread()
 - 	{
 -         printf("DELETE %px\n", fThread);
 -         fThread->Kill();
 - 		delete fThread;
 - 	}
 -      
 -     bool Execute()
 -     {
 - 		//printf("TestThread Execute\n");
 -         switch (fNum) {
 -         
 -             case 1:
 -                 fObject->LockedMethod1();
 -                 /*
 -                 if (fObject->fCount >= 500) {
 -                     printf("Terminate self %x\n", pthread_self());
 -                     fThread->Terminate();
 -                 }
 -                 */
 -                 break;
 -                 
 -             case 2:
 -                 fObject->LockedMethod2();
 -                 /*
 -                 if (fObject->fCount >= 1500) {
 -                     printf("Terminate self %x\n", pthread_self());
 -                     fThread->Terminate();
 -                 }
 -                 */
 -                 break;
 -         
 -             case 3:
 -                 fObject->LockedMethod3();
 -                 /*
 -                 if (fObject->fCount >= 2000) {
 -                     printf("Terminate self %x\n", pthread_self());
 -                     fThread->Terminate();
 -                 }
 -                 */
 -                 break;
 -         };
 -    		
 -         //usleep(fNum * 1000);
 - 		return true;
 -     }
 - 	
 - };
 - 
 - static void* TestThread1_Execute(void* arg);
 - 
 - struct TestThread1 : public JackRunnableInterface {
 - 
 - 	pthread_t fThread;
 -     LockedObject* fObject;
 -     int fNum;
 -  	
 - 	TestThread1(LockedObject* obj, int num)
 - 	{
 -         if (jack_client_create_thread(NULL, &fThread, 0, 0, TestThread1_Execute, this))
 - 			jack_error( "Can't create the network manager control thread." );
 -         fObject = obj;
 -         fNum = num;
 -  	}
 - 
 - 	virtual ~TestThread1()
 - 	{}
 -      
 -     bool Execute()
 -     {
 - 		printf("TestThread Execute\n");
 -         switch (fNum) {
 -         
 -             case 1:
 -                 fObject->LockedMethod1();
 -                 break;
 -                 
 -             case 2:
 -                 fObject->LockedMethod2();
 -                 break;
 -         
 -             case 3:
 -                 fObject->LockedMethod3();
 -                 break;
 -         };
 -    		
 -         //usleep(fNum * 1000);
 - 		return true;
 -     }
 - 	
 - };
 - 
 - static void* TestThread1_Execute(void* arg)
 - {
 -     TestThread1* obj = (TestThread1*)arg;
 -     
 -     while (true) {
 -         //printf("TestThread Execute\n");
 -         switch (obj->fNum) {
 -             
 -                 case 1:
 -                     obj->fObject->LockedMethod1();
 -                     break;
 -                     
 -                 case 2:
 -                     obj->fObject->LockedMethod2();
 -                     break;
 -             
 -                 case 3:
 -                     obj->fObject->LockedMethod3();
 -                     break;
 -         };
 -             
 -         //usleep(obj->fNum * 1000);
 -     }
 -     
 -     return 0;
 - }
 - 
 - int main (int argc, char * const argv[])
 - {
 -     char c;
 -       
 -     LockedObject obj;
 -    
 -     TestThread th1(&obj, 1);
 -     TestThread th2(&obj, 2);
 -     TestThread th3(&obj, 3);
 -      
 -     /*
 -     LockedObject obj;
 -     TestThread1 th1(&obj, 1);
 -     TestThread th2(&obj, 2);
 -     TestThread th3(&obj, 3);
 -     */
 -       
 -     /*  
 -     while ((c = getchar()) != 'q') {
 -     
 -     }
 -     */
 -     
 -     while (true) {
 -         usleep(1000);
 -         th1.fThread->Kill();
 -     }
 -    
 -     /*
 -     th1.fThread->Kill();
 -     th2.fThread->Kill();
 -     th3.fThread->Kill();
 -     
 -      while (true) {
 -         //usleep(100000);
 -         th1.fThread->Kill();
 -     }
 -     */
 -     
 - }
 
 
  |