Lines 48-88
Link Here
|
48 |
|
48 |
|
49 |
// ======================================================================= |
49 |
// ======================================================================= |
50 |
|
50 |
|
51 |
|
|
|
52 |
#define USEMAINTHREAD 1 |
51 |
#define USEMAINTHREAD 1 |
53 |
|
52 |
|
54 |
void AquaSalTimerProc ( TMTaskPtr tmTaskPtr ) |
53 |
void ImplSalStartTimer ( ULONG nMS, BOOL bMutex) |
55 |
{ |
54 |
{ |
|
|
55 |
fprintf(stderr, "ImplSalStartTimer\n"); |
56 |
|
57 |
SalData* pSalData = GetSalData(); |
58 |
|
59 |
// Store the new timeout |
60 |
pSalData->mnTimerMS = nMS; |
61 |
|
62 |
if ( !bMutex ) |
63 |
pSalData->mnTimerOrgMS = nMS; |
64 |
|
65 |
// Cancel current timer |
66 |
if( pSalData->mbTimerInstalled ) |
67 |
RemoveEventLoopTimer( pSalData->mrTimerRef ); |
68 |
|
69 |
// Install the timer task |
70 |
if( InstallEventLoopTimer( GetMainEventLoop(), |
71 |
kEventDurationMillisecond * nMS, |
72 |
kEventDurationForever, |
73 |
pSalData->mrTimerUPP, |
74 |
NULL, |
75 |
&pSalData->mrTimerRef) == noErr ) |
76 |
pSalData->mbTimerInstalled = TRUE; |
77 |
else |
78 |
{ |
79 |
fprintf(stderr, "Could not install timer task!\n"); |
80 |
pSalData->mbTimerInstalled = FALSE; |
81 |
} |
82 |
} |
83 |
|
84 |
void AquaSalTimerProc ( EventLoopTimerRef theTimer, void * /* userData */) |
85 |
{ |
86 |
fprintf(stderr, "...AquaSalTimerProc...\n"); |
87 |
|
88 |
SalData* pSalData = GetSalData(); |
56 |
ImplSVData* pSVData = ImplGetSVData(); |
89 |
ImplSVData* pSVData = ImplGetSVData(); |
57 |
|
90 |
|
58 |
AquaSalTimer *pSalTimer = (AquaSalTimer*) pSVData->mpSalTimer; |
91 |
AquaSalTimer *pSalTimer = (AquaSalTimer*) pSVData->mpSalTimer; |
59 |
if( pSalTimer ) |
92 |
|
|
|
93 |
if( pSalTimer && !pSalData->mbInTimerProc ) |
60 |
{ |
94 |
{ |
61 |
#ifdef USEMAINTHREAD |
95 |
#ifdef USEMAINTHREAD |
62 |
// send event to main thread |
96 |
// Send event to the main thread |
63 |
SalData* pSalData = GetSalData(); |
|
|
64 |
AquaSalFrame *pFrame = dynamic_cast<AquaSalFrame*>(pSalData->mpFirstFrame); |
97 |
AquaSalFrame *pFrame = dynamic_cast<AquaSalFrame*>(pSalData->mpFirstFrame); |
65 |
|
98 |
|
66 |
if( pFrame ) |
99 |
if( pFrame ) |
67 |
pFrame->PostTimerEvent( pSalTimer ); |
100 |
pFrame->PostTimerEvent( pSalTimer ); |
|
|
101 |
|
102 |
// FIXME? |
68 |
// fire again using current timeout as this is a single shot timer |
103 |
// fire again using current timeout as this is a single shot timer |
69 |
pSalTimer->ReStart(); |
104 |
ImplSalStartTimer( pSalData->mnTimerOrgMS, FALSE ); |
70 |
#else |
105 |
#else |
71 |
// call back directly from timer thread |
106 |
// call back directly from timer thread |
72 |
if( ImplSalYieldMutexTryToAcquire() ) |
107 |
if( ImplSalYieldMutexTryToAcquire() ) |
73 |
{ |
108 |
{ |
|
|
109 |
pSalData->mbInTimerProc = TRUE; |
74 |
pSalTimer->CallCallback(); |
110 |
pSalTimer->CallCallback(); |
|
|
111 |
pSalData->mbInTimerProc = FALSE; |
75 |
ImplSalYieldMutexRelease(); |
112 |
ImplSalYieldMutexRelease(); |
76 |
|
113 |
|
|
|
114 |
// FIXME? |
77 |
// fire again using current timeout as this is a single shot timer |
115 |
// fire again using current timeout as this is a single shot timer |
78 |
pSalTimer->ReStart(); |
116 |
ImplSalStartTimer( pSalData->mnTimerOrgMS, FALSE ); |
79 |
} |
117 |
} |
80 |
else |
118 |
else |
81 |
{ |
119 |
{ |
82 |
// could not acquire solar mutex, so |
120 |
// could not acquire solar mutex, so |
83 |
// fire again with a short delay (10ms) |
121 |
// fire again with a short delay (10ms) |
84 |
//fprintf(stderr, "TIMER: solar mutex not free\n"); |
122 |
fprintf(stderr, "SHOULD NOT HAPPEN! TIMER: solar mutex not free\n"); |
85 |
pSalTimer->ReStart( 10 ); |
123 |
ImplSalStartTimer( 10, TRUE ); |
86 |
} |
124 |
} |
87 |
|
125 |
|
88 |
#endif |
126 |
#endif |
Lines 93-157
Link Here
|
93 |
|
131 |
|
94 |
AquaSalTimer::AquaSalTimer( ) |
132 |
AquaSalTimer::AquaSalTimer( ) |
95 |
{ |
133 |
{ |
96 |
mbInstalled = FALSE; |
134 |
fprintf(stderr, "AquaSalTimer::AquaSalTimer\n"); |
97 |
mMS = 0; |
135 |
SalData* pSalData = GetSalData(); |
98 |
mTask.tmAddr = NewTimerUPP( AquaSalTimerProc ); |
136 |
|
|
|
137 |
pSalData->mbTimerInstalled = FALSE; |
138 |
pSalData->mnTimerMS = 0; |
139 |
pSalData->mnTimerOrgMS = 0; |
140 |
pSalData->mrTimerUPP = NewEventLoopTimerUPP( AquaSalTimerProc ); |
99 |
} |
141 |
} |
100 |
|
142 |
|
101 |
AquaSalTimer::~AquaSalTimer() |
143 |
AquaSalTimer::~AquaSalTimer() |
102 |
{ |
144 |
{ |
103 |
if( mbInstalled ) |
145 |
fprintf(stderr, "AquaSalTimer::~AquaSalTimer\n"); |
104 |
RemoveTimeTask( (QElemPtr) &mTask ); |
|
|
105 |
DisposeTimerUPP( mTask.tmAddr ); |
106 |
} |
107 |
|
146 |
|
108 |
// ----------------------------------------------------------------------- |
147 |
SalData* pSalData = GetSalData(); |
|
|
148 |
if( pSalData->mbTimerInstalled ) |
149 |
RemoveEventLoopTimer( pSalData->mrTimerRef ); |
150 |
|
151 |
DisposeEventLoopTimerUPP( pSalData->mrTimerUPP ); |
152 |
} |
109 |
|
153 |
|
110 |
void AquaSalTimer::Start( ULONG nMS ) |
154 |
void AquaSalTimer::Start( ULONG nMS ) |
111 |
{ |
155 |
{ |
112 |
// cancel current timer |
156 |
fprintf(stderr, "AquaSalTimer::Start(%lu ms)\n", nMS); |
113 |
if( mbInstalled ) |
157 |
|
114 |
RemoveTimeTask( (QElemPtr) &mTask ); |
158 |
ImplSalStartTimer(nMS, FALSE); |
115 |
|
|
|
116 |
// store new timeout |
117 |
mMS = nMS; |
118 |
|
119 |
// install the timer task |
120 |
mbInstalled = InstallTask(); |
121 |
|
122 |
// fire |
123 |
if( mbInstalled ) |
124 |
PrimeTimeTask( (QElemPtr) &mTask, mMS ); |
125 |
} |
126 |
|
127 |
void AquaSalTimer::ReStart( ULONG nMS ) |
128 |
{ |
129 |
if( mbInstalled ) |
130 |
// use current timeout if nMS == 0 |
131 |
PrimeTimeTask( (QElemPtr) &mTask, nMS ? nMS : mMS ); |
132 |
} |
159 |
} |
133 |
|
160 |
|
134 |
void AquaSalTimer::Stop() |
161 |
void AquaSalTimer::Stop() |
135 |
{ |
162 |
{ |
136 |
if( mbInstalled ) |
163 |
fprintf(stderr, "AquaSalTimer::Stop\n"); |
137 |
{ |
|
|
138 |
RemoveTimeTask( (QElemPtr) &mTask ); |
139 |
mbInstalled = FALSE; |
140 |
} |
141 |
} |
142 |
|
164 |
|
143 |
BOOL AquaSalTimer::InstallTask() |
165 |
SalData* pSalData = GetSalData(); |
144 |
{ |
166 |
if( pSalData->mbTimerInstalled ) |
145 |
// install the timer task |
|
|
146 |
mTask.tmWakeUp = 0; |
147 |
mTask.tmCount = 0; |
148 |
if( InstallTimeTask( (QElemPtr) &mTask ) == noErr ) |
149 |
return TRUE; |
150 |
else |
151 |
{ |
167 |
{ |
152 |
fprintf(stderr, "Could not install timer task!\n"); |
168 |
// FIXME |
153 |
return FALSE; |
169 |
RemoveEventLoopTimer( pSalData->mrTimerRef ); |
|
|
170 |
pSalData->mbTimerInstalled = FALSE; |
154 |
} |
171 |
} |
155 |
} |
172 |
} |
156 |
|
173 |
|
157 |
// ----------------------------------------------------------------------- |
|
|