74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| //===-- blocked.m --------------------------------------------------*- ObjC -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| // This file is for testing running "print object" in a case where another thread
 | |
| // blocks the print object from making progress.  Set a breakpoint on the line in 
 | |
| // my_pthread_routine as indicated.  Then switch threads to the main thread, and
 | |
| // do print the lock_me object.  Since that will try to get the lock already gotten
 | |
| // by my_pthread_routime thread, it will have to switch to running all threads, and
 | |
| // that should then succeed.
 | |
| //
 | |
| 
 | |
| #include <Foundation/Foundation.h>
 | |
| #include <pthread.h>
 | |
| 
 | |
| static pthread_mutex_t test_mutex;
 | |
| 
 | |
| static void Mutex_Init (void)
 | |
| {
 | |
|     pthread_mutexattr_t tmp_mutex_attr;
 | |
|     pthread_mutexattr_init(&tmp_mutex_attr);
 | |
|     pthread_mutex_init(&test_mutex, &tmp_mutex_attr);
 | |
| }
 | |
| 
 | |
| @interface LockMe :NSObject
 | |
| {
 | |
|   
 | |
| }
 | |
| - (NSString *) description;
 | |
| @end
 | |
| 
 | |
| @implementation LockMe 
 | |
| - (NSString *) description
 | |
| {
 | |
|     printf ("LockMe trying to get the lock.\n");
 | |
|     pthread_mutex_lock(&test_mutex);
 | |
|     printf ("LockMe got the lock.\n");
 | |
|     pthread_mutex_unlock(&test_mutex);
 | |
|     return @"I am pretty special.\n";
 | |
| }
 | |
| @end
 | |
| 
 | |
| void *
 | |
| my_pthread_routine (void *data)
 | |
| {
 | |
|     printf ("my_pthread_routine about to enter.\n");  
 | |
|     pthread_mutex_lock(&test_mutex);
 | |
|     printf ("Releasing Lock.\n"); // Set a breakpoint here.
 | |
|     pthread_mutex_unlock(&test_mutex);
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   pthread_attr_t tmp_attr;
 | |
|   pthread_attr_init (&tmp_attr);
 | |
|   pthread_t my_pthread;
 | |
| 
 | |
|   Mutex_Init ();
 | |
| 
 | |
|   LockMe *lock_me = [[LockMe alloc] init];
 | |
|   pthread_create (&my_pthread, &tmp_attr, my_pthread_routine, NULL);
 | |
| 
 | |
|   pthread_join (my_pthread, NULL);
 | |
| 
 | |
|   return 0;
 | |
| }
 |