SynchronizableObject.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 "SynchronizableObject.h"
  19. #ifdef WIN32
  20. #include "ace/OS_NS_sys_time.h"
  21. #endif
  22. log4cxx::LoggerPtr SynchronizableObject::logger(log4cxx::Logger::getLogger(
  23. "SynchronizableObject"));
  24. SynchronizableObject::SynchronizableObject() :
  25. mutex(), cond(mutex) {
  26. waitingCount = 0;
  27. notifiedCount = 0;
  28. }
  29. SynchronizableObject::~SynchronizableObject() {
  30. LOG4CXX_DEBUG(logger, (char*) "SynchronizableObject destroyed: " << this);
  31. }
  32. bool SynchronizableObject::lock() {
  33. LOG4CXX_TRACE(logger, (char*) "Acquiring mutex: " << this);
  34. bool toReturn = mutex.acquire();
  35. LOG4CXX_TRACE(logger, (char*) "acquired: " << this);
  36. return toReturn;
  37. }
  38. bool SynchronizableObject::wait(long timeout) {
  39. LOG4CXX_TRACE(logger, (char*) "Waiting for cond: " << this);
  40. waitingCount++;
  41. bool toReturn = false;
  42. if (timeout > 0) {
  43. ACE_Time_Value timeoutval = ACE_OS::gettimeofday();
  44. timeoutval += timeout;
  45. LOG4CXX_TRACE(logger, (char*) "Timed wait: " << timeoutval.msec());
  46. toReturn = cond.wait(&timeoutval);
  47. } else {
  48. LOG4CXX_TRACE(logger, (char*) "Blocking wait: " << this);
  49. toReturn = cond.wait();
  50. }
  51. waitingCount--;
  52. if (notifiedCount > 0) {
  53. notifiedCount--;
  54. }
  55. LOG4CXX_TRACE(logger, (char*) "waited: " << this);
  56. return toReturn;
  57. }
  58. bool SynchronizableObject::notify() {
  59. LOG4CXX_TRACE(logger, (char*) "Notifying cond: " << this);
  60. bool toReturn = false;
  61. if (notifiedCount < waitingCount) {
  62. toReturn = cond.signal();
  63. notifiedCount++;
  64. LOG4CXX_TRACE(logger, (char*) "notified: " << this);
  65. } else {
  66. LOG4CXX_TRACE(logger, (char*) "no waiters: " << this);
  67. }
  68. return toReturn;
  69. }
  70. bool SynchronizableObject::notifyAll() {
  71. LOG4CXX_TRACE(logger, (char*) "Notifying All cond: " << this);
  72. bool toReturn = cond.broadcast();
  73. LOG4CXX_TRACE(logger, (char*) "All notified: " << this);
  74. return toReturn;
  75. }
  76. bool SynchronizableObject::unlock() {
  77. LOG4CXX_TRACE(logger, (char*) "Releasing mutex: " << this);
  78. bool toReturn = mutex.release();
  79. LOG4CXX_TRACE(logger, (char*) "released mutex: " << this);
  80. return toReturn;
  81. }