David Rose 19 years ago
parent
commit
e963611ba7
1 changed files with 97 additions and 0 deletions
  1. 97 0
      panda/src/pipeline/test_atomic.cxx

+ 97 - 0
panda/src/pipeline/test_atomic.cxx

@@ -0,0 +1,97 @@
+// Filename: test_atomic.cxx
+// Created by:  drose (19Apr06)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://etc.cmu.edu/panda3d/docs/license/ .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#include "pandabase.h"
+#include "thread.h"
+#include "pmutex.h"
+#include "mutexHolder.h"
+
+// The number of threads to spawn.
+static const int number_of_threads = 4;
+
+// The number of iterations within each thread.
+static const int number_of_iterations = 50000000;
+
+#define OUTPUT(stuff) { \
+  MutexHolder holder(Mutex::_notify_mutex); \
+  stuff; \
+}
+
+PN_int32 _inc_count = 0;
+PN_int32 _dec_count = 0;
+PN_int32 _net_count = 0;
+PN_int32 _num_net_count_incremented = 0;
+
+class MyThread : public Thread {
+public:
+  MyThread(const string &name) : Thread(name, name)
+  {
+  }
+    
+  virtual void
+  thread_main() {
+    OUTPUT(nout << *this << " beginning.\n");
+
+    int local_count = 0;
+
+    for (int i = 0; i < number_of_iterations; ++i) {
+      AtomicAdjust::inc(_inc_count);
+      AtomicAdjust::dec(_dec_count);
+      if (AtomicAdjust::compare_and_exchange(_net_count, i, i + 1) == i) {
+        AtomicAdjust::inc(_num_net_count_incremented);
+        ++local_count;
+      }
+    }
+
+    OUTPUT(nout << *this << " contributed " << local_count << " times.\n");
+    OUTPUT(nout << *this << " ending.\n");
+  }
+
+};
+
+int
+main(int argc, char *argv[]) {
+  nout << "Making " << number_of_threads << " threads.\n";
+
+  typedef pvector< PT(MyThread) > Threads;
+  Threads threads;
+
+  PT(MyThread) thread = new MyThread("a");
+  threads.push_back(thread);
+  thread->start(TP_normal, true, true);
+
+  for (int i = 1; i < number_of_threads; ++i) {
+    char name = 'a' + i;
+    PT(MyThread) thread = new MyThread(string(1, name));
+    threads.push_back(thread);
+    thread->start(TP_normal, true, true);
+  }
+
+  // Now join all the threads.
+  Threads::iterator ti;
+  for (ti = threads.begin(); ti != threads.end(); ++ti) {
+    (*ti)->join();
+  }
+
+  nout << "inc_count = " << _inc_count << "\n"
+       << "dec_count = " << _dec_count << "\n"
+       << "net_count = " << _net_count << "\n"
+       << "num_net_count_incremented = " << _num_net_count_incremented << "\n";
+
+  exit(0);
+}