1/*********************************************************** 2 * Copyright (C) 1997, Be Inc. Copyright (C) 1999, Jake Hamby. 3 * 4 * This program is freely distributable without licensing fees 5 * and is provided without guarantee or warrantee expressed or 6 * implied. This program is -not- in the public domain. 7 * 8 * FILE: glutBlocker.cpp 9 * 10 * DESCRIPTION: helper class for GLUT event loop. 11 * if a window receives an event, wake up the event loop. 12 ***********************************************************/ 13 14/*********************************************************** 15 * Headers 16 ***********************************************************/ 17#include "glutBlocker.h" 18 19/*********************************************************** 20 * Global variable 21 ***********************************************************/ 22GlutBlocker gBlock; 23 24/*********************************************************** 25 * Member functions 26 ***********************************************************/ 27GlutBlocker::GlutBlocker() { 28 gSem = create_sem(1, "gSem"); 29 eSem = create_sem(0, "eSem"); 30 events = false; 31 sleeping = false; 32} 33 34GlutBlocker::~GlutBlocker() { 35 delete_sem(eSem); 36 delete_sem(gSem); 37} 38 39void GlutBlocker::WaitEvent() { 40 acquire_sem(gSem); 41 if(!events) { // wait for new event 42 sleeping = true; 43 release_sem(gSem); 44 acquire_sem(eSem); // next event will release eSem 45 } else { 46 release_sem(gSem); 47 } 48} 49 50void GlutBlocker::WaitEvent(bigtime_t usecs) { 51 acquire_sem(gSem); 52 if(!events) { // wait for new event 53 sleeping = true; 54 release_sem(gSem); 55 acquire_sem_etc(eSem, 1, B_TIMEOUT, usecs); // wait for next event or timeout 56 } else { 57 release_sem(gSem); 58 } 59} 60 61void GlutBlocker::NewEvent() { 62 acquire_sem(gSem); 63 events = true; // next call to WaitEvent returns immediately 64 if(sleeping) { 65 sleeping = false; 66 release_sem(eSem); // if event loop is blocking, wake it up 67 } 68 release_sem(gSem); 69} 70