//===-- 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;
}
