18bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen//===-- main.cpp ------------------------------------------------*- C++ -*-===// 28bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// 38bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// The LLVM Compiler Infrastructure 48bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// 58bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// This file is distributed under the University of Illinois Open Source 68bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// License. See LICENSE.TXT for details. 78bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// 88bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen//===----------------------------------------------------------------------===// 98bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 108bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen// C includes 118bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen#include <pthread.h> 128bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen#include <stdio.h> 138bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen#include <stdint.h> 148bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen#include <stdlib.h> 158bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen#include <unistd.h> 168bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 178bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenpthread_t g_thread_1 = NULL; 188bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenpthread_t g_thread_2 = NULL; 198bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenpthread_t g_thread_3 = NULL; 208bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 218bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenuint32_t g_val = 0; 228bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 238bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenuint32_t access_pool (uint32_t flag = 0); 248bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 258bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenuint32_t 268bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenaccess_pool (uint32_t flag) 278bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen{ 288bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen static pthread_mutex_t g_access_mutex = PTHREAD_MUTEX_INITIALIZER; 298bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen if (flag == 0) 308bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen ::pthread_mutex_lock (&g_access_mutex); 318bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 328bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t old_val = g_val; 338bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen if (flag != 0) 348bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen g_val = old_val + 1; 358bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 368bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen if (flag == 0) 378bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen ::pthread_mutex_unlock (&g_access_mutex); 388bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen return g_val; 398bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen} 408bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 418bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenvoid * 428bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenthread_func (void *arg) 438bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen{ 448bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t thread_index = *((uint32_t *)arg); // Break here to test that the stop-hook mechanism works for multiple threads. 458bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen printf ("%s (thread index = %u) startng...\n", __FUNCTION__, thread_index); 468bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 478bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t count = 0; 488bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t val; 498bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen while (count++ < 15) 508bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen { 518bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen // random micro second sleep from zero to 3 seconds 528bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen int usec = ::rand() % 3000000; 538bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen printf ("%s (thread = %u) doing a usleep (%d)...\n", __FUNCTION__, thread_index, usec); 548bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen ::usleep (usec); 558bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 568bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen if (count < 7) 578bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen val = access_pool (); 588bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen else 598bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen val = access_pool (1); 608bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 618bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen printf ("%s (thread = %u) after usleep access_pool returns %d (count=%d)...\n", __FUNCTION__, thread_index, val, count); 628bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen } 638bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen printf ("%s (thread index = %u) exiting...\n", __FUNCTION__, thread_index); 648bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen return NULL; 658bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen} 668bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 678bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 688bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chenint main (int argc, char const *argv[]) 698bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen{ 708bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen int err; 718bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen void *thread_result = NULL; 728bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t thread_index_1 = 1; 738bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t thread_index_2 = 2; 748bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen uint32_t thread_index_3 = 3; 758bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 768bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen printf ("Before turning all three threads loose...\n"); // Set break point at this line, and add a stop-hook. 778bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen // Create 3 threads 788bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen err = ::pthread_create (&g_thread_1, NULL, thread_func, &thread_index_1); 798bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen err = ::pthread_create (&g_thread_2, NULL, thread_func, &thread_index_2); 808bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen err = ::pthread_create (&g_thread_3, NULL, thread_func, &thread_index_3); 818bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 828bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen // Join all of our threads 838bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen err = ::pthread_join (g_thread_1, &thread_result); 848bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen err = ::pthread_join (g_thread_2, &thread_result); 858bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen err = ::pthread_join (g_thread_3, &thread_result); 868bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen 878bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen return 0; 888bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen} 89