1 /******************************************************************************
2 *
3 * Copyright (C) 1999-2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18 #include "OverrideLog.h"
19 #include "NfcAdaptation.h"
20 extern "C"
21 {
22 #include "gki.h"
23 #include "nfa_api.h"
24 #include "nfc_int.h"
25 #include "vendor_cfg.h"
26 }
27 #include "config.h"
28 #include "android_logmsg.h"
29
30 #define LOG_TAG "NfcAdaptation"
31
32 extern "C" void GKI_shutdown();
33 extern void resetConfig();
34 extern "C" void verify_stack_non_volatile_store ();
35 extern "C" void delete_stack_non_volatile_store (BOOLEAN forceDelete);
36
37 NfcAdaptation* NfcAdaptation::mpInstance = NULL;
38 ThreadMutex NfcAdaptation::sLock;
39 nfc_nci_device_t* NfcAdaptation::mHalDeviceContext = NULL;
40 tHAL_NFC_CBACK* NfcAdaptation::mHalCallback = NULL;
41 tHAL_NFC_DATA_CBACK* NfcAdaptation::mHalDataCallback = NULL;
42 ThreadCondVar NfcAdaptation::mHalOpenCompletedEvent;
43 ThreadCondVar NfcAdaptation::mHalCloseCompletedEvent;
44
45 UINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
46 UINT8 appl_trace_level = 0xff;
47 char bcm_nfc_location[120];
48 char nci_hal_module[64];
49
50 static UINT8 nfa_dm_cfg[sizeof ( tNFA_DM_CFG ) ];
51 static UINT8 nfa_proprietary_cfg[sizeof ( tNFA_PROPRIETARY_CFG )];
52 extern tNFA_DM_CFG *p_nfa_dm_cfg;
53 extern tNFA_PROPRIETARY_CFG *p_nfa_proprietary_cfg;
54 extern UINT8 nfa_ee_max_ee_cfg;
55 extern const UINT8 nfca_version_string [];
56 extern const UINT8 nfa_version_string [];
57 static UINT8 deviceHostWhiteList [NFA_HCI_MAX_HOST_IN_NETWORK];
58 static tNFA_HCI_CFG jni_nfa_hci_cfg;
59 extern tNFA_HCI_CFG *p_nfa_hci_cfg;
60 extern BOOLEAN nfa_poll_bail_out_mode;
61
62 /*******************************************************************************
63 **
64 ** Function: NfcAdaptation::NfcAdaptation()
65 **
66 ** Description: class constructor
67 **
68 ** Returns: none
69 **
70 *******************************************************************************/
NfcAdaptation()71 NfcAdaptation::NfcAdaptation()
72 {
73 memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
74 }
75
76 /*******************************************************************************
77 **
78 ** Function: NfcAdaptation::~NfcAdaptation()
79 **
80 ** Description: class destructor
81 **
82 ** Returns: none
83 **
84 *******************************************************************************/
~NfcAdaptation()85 NfcAdaptation::~NfcAdaptation()
86 {
87 mpInstance = NULL;
88 }
89
90 /*******************************************************************************
91 **
92 ** Function: NfcAdaptation::GetInstance()
93 **
94 ** Description: access class singleton
95 **
96 ** Returns: pointer to the singleton object
97 **
98 *******************************************************************************/
GetInstance()99 NfcAdaptation& NfcAdaptation::GetInstance()
100 {
101 AutoThreadMutex a(sLock);
102
103 if (!mpInstance)
104 mpInstance = new NfcAdaptation;
105 return *mpInstance;
106 }
107
108 /*******************************************************************************
109 **
110 ** Function: NfcAdaptation::Initialize()
111 **
112 ** Description: class initializer
113 **
114 ** Returns: none
115 **
116 *******************************************************************************/
Initialize()117 void NfcAdaptation::Initialize ()
118 {
119 const char* func = "NfcAdaptation::Initialize";
120 ALOGD("%s: enter", func);
121 ALOGE("%s: ver=%s nfa=%s", func, nfca_version_string, nfa_version_string);
122 unsigned long num;
123
124 if ( GetNumValue ( NAME_USE_RAW_NCI_TRACE, &num, sizeof ( num ) ) )
125 {
126 if (num == 1)
127 {
128 // display protocol traces in raw format
129 ProtoDispAdapterUseRawOutput (TRUE);
130 ALOGD("%s: logging protocol in raw format", func);
131 }
132 }
133 if ( !GetStrValue ( NAME_NFA_STORAGE, bcm_nfc_location, sizeof ( bcm_nfc_location ) ) )
134 {
135 strlcpy (bcm_nfc_location, "/data/nfc", sizeof(bcm_nfc_location));
136 }
137
138 initializeProtocolLogLevel ();
139
140 if ( GetStrValue ( NAME_NFA_DM_CFG, (char*)nfa_dm_cfg, sizeof ( nfa_dm_cfg ) ) )
141 p_nfa_dm_cfg = ( tNFA_DM_CFG * ) &nfa_dm_cfg[0];
142
143 if ( GetNumValue ( NAME_NFA_MAX_EE_SUPPORTED, &num, sizeof ( num ) ) )
144 {
145 nfa_ee_max_ee_cfg = num;
146 ALOGD("%s: Overriding NFA_EE_MAX_EE_SUPPORTED to use %d", func, nfa_ee_max_ee_cfg);
147 }
148 if ( GetNumValue ( NAME_NFA_POLL_BAIL_OUT_MODE, &num, sizeof ( num ) ) )
149 {
150 nfa_poll_bail_out_mode = num;
151 ALOGD("%s: Overriding NFA_POLL_BAIL_OUT_MODE to use %d", func, nfa_poll_bail_out_mode);
152 }
153
154 if ( GetStrValue ( NAME_NFA_PROPRIETARY_CFG, (char*)nfa_proprietary_cfg, sizeof ( tNFA_PROPRIETARY_CFG ) ) )
155 {
156 p_nfa_proprietary_cfg = (tNFA_PROPRIETARY_CFG*) &nfa_proprietary_cfg[0];
157 }
158
159 //configure device host whitelist of HCI host ID's; see specification ETSI TS 102 622 V11.1.10
160 //(2012-10), section 6.1.3.1
161 num = GetStrValue ( NAME_DEVICE_HOST_WHITE_LIST, (char*) deviceHostWhiteList, sizeof ( deviceHostWhiteList ) );
162 if (num)
163 {
164 memmove (&jni_nfa_hci_cfg, p_nfa_hci_cfg, sizeof(jni_nfa_hci_cfg));
165 jni_nfa_hci_cfg.num_whitelist_host = (UINT8) num; //number of HCI host ID's in the whitelist
166 jni_nfa_hci_cfg.p_whitelist = deviceHostWhiteList; //array of HCI host ID's
167 p_nfa_hci_cfg = &jni_nfa_hci_cfg;
168 }
169
170 initializeGlobalAppLogLevel ();
171
172 verify_stack_non_volatile_store ();
173 if ( GetNumValue ( NAME_PRESERVE_STORAGE, (char*)&num, sizeof ( num ) ) &&
174 (num == 1) )
175 ALOGD ("%s: preserve stack NV store", __FUNCTION__);
176 else
177 {
178 delete_stack_non_volatile_store (FALSE);
179 }
180
181 GKI_init ();
182 GKI_enable ();
183 GKI_create_task ((TASKPTR)NFCA_TASK, BTU_TASK, (INT8*)"NFCA_TASK", 0, 0, (pthread_cond_t*)NULL, NULL);
184 {
185 AutoThreadMutex guard(mCondVar);
186 GKI_create_task ((TASKPTR)Thread, MMI_TASK, (INT8*)"NFCA_THREAD", 0, 0, (pthread_cond_t*)NULL, NULL);
187 mCondVar.wait();
188 }
189
190 mHalDeviceContext = NULL;
191 mHalCallback = NULL;
192 memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
193 InitializeHalDeviceContext ();
194 ALOGD ("%s: exit", func);
195 }
196
197 /*******************************************************************************
198 **
199 ** Function: NfcAdaptation::Finalize()
200 **
201 ** Description: class finalizer
202 **
203 ** Returns: none
204 **
205 *******************************************************************************/
Finalize()206 void NfcAdaptation::Finalize()
207 {
208 const char* func = "NfcAdaptation::Finalize";
209 AutoThreadMutex a(sLock);
210
211 ALOGD ("%s: enter", func);
212 GKI_shutdown ();
213
214 resetConfig();
215
216 nfc_nci_close(mHalDeviceContext); //close the HAL's device context
217 mHalDeviceContext = NULL;
218 mHalCallback = NULL;
219 memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
220
221 ALOGD ("%s: exit", func);
222 delete this;
223 }
224
225 /*******************************************************************************
226 **
227 ** Function: NfcAdaptation::signal()
228 **
229 ** Description: signal the CondVar to release the thread that is waiting
230 **
231 ** Returns: none
232 **
233 *******************************************************************************/
signal()234 void NfcAdaptation::signal ()
235 {
236 mCondVar.signal();
237 }
238
239 /*******************************************************************************
240 **
241 ** Function: NfcAdaptation::NFCA_TASK()
242 **
243 ** Description: NFCA_TASK runs the GKI main task
244 **
245 ** Returns: none
246 **
247 *******************************************************************************/
NFCA_TASK(UINT32 arg)248 UINT32 NfcAdaptation::NFCA_TASK (UINT32 arg)
249 {
250 const char* func = "NfcAdaptation::NFCA_TASK";
251 ALOGD ("%s: enter", func);
252 GKI_run (0);
253 ALOGD ("%s: exit", func);
254 return 0;
255 }
256
257 /*******************************************************************************
258 **
259 ** Function: NfcAdaptation::Thread()
260 **
261 ** Description: Creates work threads
262 **
263 ** Returns: none
264 **
265 *******************************************************************************/
Thread(UINT32 arg)266 UINT32 NfcAdaptation::Thread (UINT32 arg)
267 {
268 const char* func = "NfcAdaptation::Thread";
269 ALOGD ("%s: enter", func);
270
271 {
272 ThreadCondVar CondVar;
273 AutoThreadMutex guard(CondVar);
274 GKI_create_task ((TASKPTR)nfc_task, NFC_TASK, (INT8*)"NFC_TASK", 0, 0, (pthread_cond_t*)CondVar, (pthread_mutex_t*)CondVar);
275 CondVar.wait();
276 }
277
278 NfcAdaptation::GetInstance().signal();
279
280 GKI_exit_task (GKI_get_taskid ());
281 ALOGD ("%s: exit", func);
282 return 0;
283 }
284
285 /*******************************************************************************
286 **
287 ** Function: NfcAdaptation::GetHalEntryFuncs()
288 **
289 ** Description: Get the set of HAL entry points.
290 **
291 ** Returns: Functions pointers for HAL entry points.
292 **
293 *******************************************************************************/
GetHalEntryFuncs()294 tHAL_NFC_ENTRY* NfcAdaptation::GetHalEntryFuncs ()
295 {
296 return &mHalEntryFuncs;
297 }
298
299 /*******************************************************************************
300 **
301 ** Function: NfcAdaptation::InitializeHalDeviceContext
302 **
303 ** Description: Ask the generic Android HAL to find the Broadcom-specific HAL.
304 **
305 ** Returns: None.
306 **
307 *******************************************************************************/
InitializeHalDeviceContext()308 void NfcAdaptation::InitializeHalDeviceContext ()
309 {
310 const char* func = "NfcAdaptation::InitializeHalDeviceContext";
311 ALOGD ("%s: enter", func);
312 int ret = 0; //0 means success
313 if ( !GetStrValue ( NAME_NCI_HAL_MODULE, nci_hal_module, sizeof ( nci_hal_module) ) )
314 {
315 ALOGE("No HAL module specified in config, falling back to BCM2079x");
316 strlcpy (nci_hal_module, "nfc_nci.bcm2079x", sizeof(nci_hal_module));
317 }
318 const hw_module_t* hw_module = NULL;
319
320 mHalEntryFuncs.initialize = HalInitialize;
321 mHalEntryFuncs.terminate = HalTerminate;
322 mHalEntryFuncs.open = HalOpen;
323 mHalEntryFuncs.close = HalClose;
324 mHalEntryFuncs.core_initialized = HalCoreInitialized;
325 mHalEntryFuncs.write = HalWrite;
326 mHalEntryFuncs.prediscover = HalPrediscover;
327 mHalEntryFuncs.control_granted = HalControlGranted;
328 mHalEntryFuncs.power_cycle = HalPowerCycle;
329 mHalEntryFuncs.get_max_ee = HalGetMaxNfcee;
330
331 ret = hw_get_module (nci_hal_module, &hw_module);
332 if (ret == 0)
333 {
334 ret = nfc_nci_open (hw_module, &mHalDeviceContext);
335 if (ret != 0)
336 ALOGE ("%s: nfc_nci_open fail", func);
337 }
338 else
339 ALOGE ("%s: fail hw_get_module %s", func, nci_hal_module);
340 ALOGD ("%s: exit", func);
341 }
342
343 /*******************************************************************************
344 **
345 ** Function: NfcAdaptation::HalInitialize
346 **
347 ** Description: Not implemented because this function is only needed
348 ** within the HAL.
349 **
350 ** Returns: None.
351 **
352 *******************************************************************************/
HalInitialize()353 void NfcAdaptation::HalInitialize ()
354 {
355 const char* func = "NfcAdaptation::HalInitialize";
356 ALOGD ("%s", func);
357 }
358
359 /*******************************************************************************
360 **
361 ** Function: NfcAdaptation::HalTerminate
362 **
363 ** Description: Not implemented because this function is only needed
364 ** within the HAL.
365 **
366 ** Returns: None.
367 **
368 *******************************************************************************/
HalTerminate()369 void NfcAdaptation::HalTerminate ()
370 {
371 const char* func = "NfcAdaptation::HalTerminate";
372 ALOGD ("%s", func);
373 }
374
375 /*******************************************************************************
376 **
377 ** Function: NfcAdaptation::HalOpen
378 **
379 ** Description: Turn on controller, download firmware.
380 **
381 ** Returns: None.
382 **
383 *******************************************************************************/
HalOpen(tHAL_NFC_CBACK * p_hal_cback,tHAL_NFC_DATA_CBACK * p_data_cback)384 void NfcAdaptation::HalOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback)
385 {
386 const char* func = "NfcAdaptation::HalOpen";
387 ALOGD ("%s", func);
388 if (mHalDeviceContext)
389 {
390 mHalCallback = p_hal_cback;
391 mHalDataCallback = p_data_cback;
392 mHalDeviceContext->open (mHalDeviceContext, HalDeviceContextCallback, HalDeviceContextDataCallback);
393 }
394 }
395
396 /*******************************************************************************
397 **
398 ** Function: NfcAdaptation::HalClose
399 **
400 ** Description: Turn off controller.
401 **
402 ** Returns: None.
403 **
404 *******************************************************************************/
HalClose()405 void NfcAdaptation::HalClose ()
406 {
407 const char* func = "NfcAdaptation::HalClose";
408 ALOGD ("%s", func);
409 if (mHalDeviceContext)
410 {
411 mHalDeviceContext->close (mHalDeviceContext);
412 }
413 }
414
415 /*******************************************************************************
416 **
417 ** Function: NfcAdaptation::HalDeviceContextCallback
418 **
419 ** Description: Translate generic Android HAL's callback into Broadcom-specific
420 ** callback function.
421 **
422 ** Returns: None.
423 **
424 *******************************************************************************/
HalDeviceContextCallback(nfc_event_t event,nfc_status_t event_status)425 void NfcAdaptation::HalDeviceContextCallback (nfc_event_t event, nfc_status_t event_status)
426 {
427 const char* func = "NfcAdaptation::HalDeviceContextCallback";
428 ALOGD ("%s: event=%u", func, event);
429 if (mHalCallback)
430 mHalCallback (event, (tHAL_NFC_STATUS) event_status);
431 }
432
433 /*******************************************************************************
434 **
435 ** Function: NfcAdaptation::HalDeviceContextDataCallback
436 **
437 ** Description: Translate generic Android HAL's callback into Broadcom-specific
438 ** callback function.
439 **
440 ** Returns: None.
441 **
442 *******************************************************************************/
HalDeviceContextDataCallback(uint16_t data_len,uint8_t * p_data)443 void NfcAdaptation::HalDeviceContextDataCallback (uint16_t data_len, uint8_t* p_data)
444 {
445 const char* func = "NfcAdaptation::HalDeviceContextDataCallback";
446 ALOGD ("%s: len=%u", func, data_len);
447 if (mHalDataCallback)
448 mHalDataCallback (data_len, p_data);
449 }
450
451 /*******************************************************************************
452 **
453 ** Function: NfcAdaptation::HalWrite
454 **
455 ** Description: Write NCI message to the controller.
456 **
457 ** Returns: None.
458 **
459 *******************************************************************************/
HalWrite(UINT16 data_len,UINT8 * p_data)460 void NfcAdaptation::HalWrite (UINT16 data_len, UINT8* p_data)
461 {
462 const char* func = "NfcAdaptation::HalWrite";
463 ALOGD ("%s", func);
464 if (mHalDeviceContext)
465 {
466 mHalDeviceContext->write (mHalDeviceContext, data_len, p_data);
467 }
468 }
469
470 /*******************************************************************************
471 **
472 ** Function: NfcAdaptation::HalCoreInitialized
473 **
474 ** Description: Adjust the configurable parameters in the controller.
475 **
476 ** Returns: None.
477 **
478 *******************************************************************************/
HalCoreInitialized(UINT8 * p_core_init_rsp_params)479 void NfcAdaptation::HalCoreInitialized (UINT8* p_core_init_rsp_params)
480 {
481 const char* func = "NfcAdaptation::HalCoreInitialized";
482 ALOGD ("%s", func);
483 if (mHalDeviceContext)
484 {
485 mHalDeviceContext->core_initialized (mHalDeviceContext, p_core_init_rsp_params);
486 }
487 }
488
489 /*******************************************************************************
490 **
491 ** Function: NfcAdaptation::HalPrediscover
492 **
493 ** Description: Perform any vendor-specific pre-discovery actions (if needed)
494 ** If any actions were performed TRUE will be returned, and
495 ** HAL_PRE_DISCOVER_CPLT_EVT will notify when actions are
496 ** completed.
497 **
498 ** Returns: TRUE if vendor-specific pre-discovery actions initialized
499 ** FALSE if no vendor-specific pre-discovery actions are needed.
500 **
501 *******************************************************************************/
HalPrediscover()502 BOOLEAN NfcAdaptation::HalPrediscover ()
503 {
504 const char* func = "NfcAdaptation::HalPrediscover";
505 ALOGD ("%s", func);
506 BOOLEAN retval = FALSE;
507
508 if (mHalDeviceContext)
509 {
510 retval = mHalDeviceContext->pre_discover (mHalDeviceContext);
511 }
512 return retval;
513 }
514
515 /*******************************************************************************
516 **
517 ** Function: HAL_NfcControlGranted
518 **
519 ** Description: Grant control to HAL control for sending NCI commands.
520 ** Call in response to HAL_REQUEST_CONTROL_EVT.
521 ** Must only be called when there are no NCI commands pending.
522 ** HAL_RELEASE_CONTROL_EVT will notify when HAL no longer
523 ** needs control of NCI.
524 **
525 ** Returns: void
526 **
527 *******************************************************************************/
HalControlGranted()528 void NfcAdaptation::HalControlGranted ()
529 {
530 const char* func = "NfcAdaptation::HalControlGranted";
531 ALOGD ("%s", func);
532 if (mHalDeviceContext)
533 {
534 mHalDeviceContext->control_granted (mHalDeviceContext);
535 }
536 }
537
538 /*******************************************************************************
539 **
540 ** Function: NfcAdaptation::HalPowerCycle
541 **
542 ** Description: Turn off and turn on the controller.
543 **
544 ** Returns: None.
545 **
546 *******************************************************************************/
HalPowerCycle()547 void NfcAdaptation::HalPowerCycle ()
548 {
549 const char* func = "NfcAdaptation::HalPowerCycle";
550 ALOGD ("%s", func);
551 if (mHalDeviceContext)
552 {
553 mHalDeviceContext->power_cycle (mHalDeviceContext);
554 }
555 }
556
557 /*******************************************************************************
558 **
559 ** Function: NfcAdaptation::HalGetMaxNfcee
560 **
561 ** Description: Turn off and turn on the controller.
562 **
563 ** Returns: None.
564 **
565 *******************************************************************************/
HalGetMaxNfcee()566 UINT8 NfcAdaptation::HalGetMaxNfcee()
567 {
568 const char* func = "NfcAdaptation::HalPowerCycle";
569 UINT8 maxNfcee = 0;
570 ALOGD ("%s", func);
571 if (mHalDeviceContext)
572 {
573 // TODO maco call into HAL when we figure out binary compatibility.
574 return nfa_ee_max_ee_cfg;
575
576 //mHalDeviceContext->get_max_ee (mHalDeviceContext, &maxNfcee);
577 }
578
579 return maxNfcee;
580 }
581
582
583 /*******************************************************************************
584 **
585 ** Function: NfcAdaptation::DownloadFirmware
586 **
587 ** Description: Download firmware patch files.
588 **
589 ** Returns: None.
590 **
591 *******************************************************************************/
DownloadFirmware()592 void NfcAdaptation::DownloadFirmware ()
593 {
594 const char* func = "NfcAdaptation::DownloadFirmware";
595 ALOGD ("%s: enter", func);
596 HalInitialize ();
597
598 mHalOpenCompletedEvent.lock ();
599 ALOGD ("%s: try open HAL", func);
600 HalOpen (HalDownloadFirmwareCallback, HalDownloadFirmwareDataCallback);
601 mHalOpenCompletedEvent.wait ();
602
603 mHalCloseCompletedEvent.lock ();
604 ALOGD ("%s: try close HAL", func);
605 HalClose ();
606 mHalCloseCompletedEvent.wait ();
607
608 HalTerminate ();
609 ALOGD ("%s: exit", func);
610 }
611
612 /*******************************************************************************
613 **
614 ** Function: NfcAdaptation::HalDownloadFirmwareCallback
615 **
616 ** Description: Receive events from the HAL.
617 **
618 ** Returns: None.
619 **
620 *******************************************************************************/
HalDownloadFirmwareCallback(nfc_event_t event,nfc_status_t event_status)621 void NfcAdaptation::HalDownloadFirmwareCallback (nfc_event_t event, nfc_status_t event_status)
622 {
623 const char* func = "NfcAdaptation::HalDownloadFirmwareCallback";
624 ALOGD ("%s: event=0x%X", func, event);
625 switch (event)
626 {
627 case HAL_NFC_OPEN_CPLT_EVT:
628 {
629 ALOGD ("%s: HAL_NFC_OPEN_CPLT_EVT", func);
630 mHalOpenCompletedEvent.signal ();
631 break;
632 }
633 case HAL_NFC_CLOSE_CPLT_EVT:
634 {
635 ALOGD ("%s: HAL_NFC_CLOSE_CPLT_EVT", func);
636 mHalCloseCompletedEvent.signal ();
637 break;
638 }
639 }
640 }
641
642 /*******************************************************************************
643 **
644 ** Function: NfcAdaptation::HalDownloadFirmwareDataCallback
645 **
646 ** Description: Receive data events from the HAL.
647 **
648 ** Returns: None.
649 **
650 *******************************************************************************/
HalDownloadFirmwareDataCallback(uint16_t data_len,uint8_t * p_data)651 void NfcAdaptation::HalDownloadFirmwareDataCallback (uint16_t data_len, uint8_t* p_data)
652 {
653 }
654
655
656 /*******************************************************************************
657 **
658 ** Function: ThreadMutex::ThreadMutex()
659 **
660 ** Description: class constructor
661 **
662 ** Returns: none
663 **
664 *******************************************************************************/
ThreadMutex()665 ThreadMutex::ThreadMutex()
666 {
667 pthread_mutexattr_t mutexAttr;
668
669 pthread_mutexattr_init(&mutexAttr);
670 pthread_mutex_init(&mMutex, &mutexAttr);
671 pthread_mutexattr_destroy(&mutexAttr);
672 }
673
674 /*******************************************************************************
675 **
676 ** Function: ThreadMutex::~ThreadMutex()
677 **
678 ** Description: class destructor
679 **
680 ** Returns: none
681 **
682 *******************************************************************************/
~ThreadMutex()683 ThreadMutex::~ThreadMutex()
684 {
685 pthread_mutex_destroy(&mMutex);
686 }
687
688 /*******************************************************************************
689 **
690 ** Function: ThreadMutex::lock()
691 **
692 ** Description: lock kthe mutex
693 **
694 ** Returns: none
695 **
696 *******************************************************************************/
lock()697 void ThreadMutex::lock()
698 {
699 pthread_mutex_lock(&mMutex);
700 }
701
702 /*******************************************************************************
703 **
704 ** Function: ThreadMutex::unblock()
705 **
706 ** Description: unlock the mutex
707 **
708 ** Returns: none
709 **
710 *******************************************************************************/
unlock()711 void ThreadMutex::unlock()
712 {
713 pthread_mutex_unlock(&mMutex);
714 }
715
716 /*******************************************************************************
717 **
718 ** Function: ThreadCondVar::ThreadCondVar()
719 **
720 ** Description: class constructor
721 **
722 ** Returns: none
723 **
724 *******************************************************************************/
ThreadCondVar()725 ThreadCondVar::ThreadCondVar()
726 {
727 pthread_condattr_t CondAttr;
728
729 pthread_condattr_init(&CondAttr);
730 pthread_cond_init(&mCondVar, &CondAttr);
731
732 pthread_condattr_destroy(&CondAttr);
733 }
734
735 /*******************************************************************************
736 **
737 ** Function: ThreadCondVar::~ThreadCondVar()
738 **
739 ** Description: class destructor
740 **
741 ** Returns: none
742 **
743 *******************************************************************************/
~ThreadCondVar()744 ThreadCondVar::~ThreadCondVar()
745 {
746 pthread_cond_destroy(&mCondVar);
747 }
748
749 /*******************************************************************************
750 **
751 ** Function: ThreadCondVar::wait()
752 **
753 ** Description: wait on the mCondVar
754 **
755 ** Returns: none
756 **
757 *******************************************************************************/
wait()758 void ThreadCondVar::wait()
759 {
760 pthread_cond_wait(&mCondVar, *this);
761 pthread_mutex_unlock(*this);
762 }
763
764 /*******************************************************************************
765 **
766 ** Function: ThreadCondVar::signal()
767 **
768 ** Description: signal the mCondVar
769 **
770 ** Returns: none
771 **
772 *******************************************************************************/
signal()773 void ThreadCondVar::signal()
774 {
775 AutoThreadMutex a(*this);
776 pthread_cond_signal(&mCondVar);
777 }
778
779 /*******************************************************************************
780 **
781 ** Function: AutoThreadMutex::AutoThreadMutex()
782 **
783 ** Description: class constructor, automatically lock the mutex
784 **
785 ** Returns: none
786 **
787 *******************************************************************************/
AutoThreadMutex(ThreadMutex & m)788 AutoThreadMutex::AutoThreadMutex(ThreadMutex &m)
789 : mm(m)
790 {
791 mm.lock();
792 }
793
794 /*******************************************************************************
795 **
796 ** Function: AutoThreadMutex::~AutoThreadMutex()
797 **
798 ** Description: class destructor, automatically unlock the mutex
799 **
800 ** Returns: none
801 **
802 *******************************************************************************/
~AutoThreadMutex()803 AutoThreadMutex::~AutoThreadMutex()
804 {
805 mm.unlock();
806 }
807