TestSynchronizableObject.cxx
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:3k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. #include "TestAssert.h"
  19. #include "TestSynchronizableObject.h"
  20. #include "userlogc.h"
  21. #include "ace/OS_NS_unistd.h"
  22. Waiter::Waiter() {
  23. object = new SynchronizableObject();
  24. object2 = new SynchronizableObject();
  25. notified = false;
  26. }
  27. Waiter::~Waiter() {
  28. delete object;
  29. delete object2;
  30. }
  31. SynchronizableObject* Waiter::getLock() {
  32. return object;
  33. }
  34. SynchronizableObject* Waiter::getLock2() {
  35. return object2;
  36. }
  37. bool Waiter::getNotified() {
  38. return notified;
  39. }
  40. int Waiter::svc(void){
  41. object2->lock();
  42. object->lock();
  43. userlogc("waiting");
  44. object->wait(10);
  45. userlogc("waited");
  46. notified = true;
  47. object->unlock();
  48. userlogc("svc done");
  49. object2->unlock();
  50. return 0;
  51. }
  52. void TestSynchronizableObject::setUp() {
  53. int argc = 0;
  54. init_ace();
  55. orbRef = CORBA::ORB_init(argc, NULL, "null");
  56. waiter = new Waiter();
  57. if (waiter->activate(THR_NEW_LWP| THR_JOINABLE, 1, 0, ACE_DEFAULT_THREAD_PRIORITY, -1, 0, 0, 0, 0, 0, 0) != 0) {
  58. delete (waiter);
  59. waiter = NULL;
  60. BT_FAIL("COULD NOT CREATE WAITER");
  61. }
  62. }
  63. void TestSynchronizableObject::tearDown() {
  64. if (waiter) {
  65. waiter->wait();
  66. delete waiter;
  67. waiter = NULL;
  68. }
  69. if (!CORBA::is_nil(orbRef))
  70. orbRef->shutdown(1);
  71. if (!CORBA::is_nil(orbRef))
  72. orbRef->destroy();
  73. orbRef = NULL;
  74. }
  75. void TestSynchronizableObject::testWaitNotify() {
  76. ACE_OS::sleep(1);
  77. SynchronizableObject* lock = waiter->getLock();
  78. SynchronizableObject* lock2 = waiter->getLock2();
  79. lock->lock();
  80. lock->notify();
  81. lock->unlock();
  82. userlogc("done");
  83. lock2->lock();
  84. bool notified = waiter->getNotified();
  85. userlogc("got notified");
  86. lock2->unlock();
  87. userlogc("main done");
  88. BT_ASSERT_MESSAGE("Was not notified", notified == true);
  89. }
  90. void TestSynchronizableObject::testNotifyWaitWithTimeout() {
  91. ACE_OS::sleep(1);
  92. SynchronizableObject* lock = waiter->getLock();
  93. lock->lock();
  94. lock->notify();
  95. lock->unlock();
  96. lock->lock();
  97. userlogc("waiting for 3 seconds");
  98. lock->wait(3);
  99. userlogc("waited");
  100. lock->unlock();
  101. userlogc("main done");
  102. }