commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7085 - gnuradio/branches/developers/eb/gcell/src/lib


From: eb
Subject: [Commit-gnuradio] r7085 - gnuradio/branches/developers/eb/gcell/src/lib
Date: Thu, 6 Dec 2007 22:17:49 -0700 (MST)

Author: eb
Date: 2007-12-06 22:17:48 -0700 (Thu, 06 Dec 2007)
New Revision: 7085

Modified:
   gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc
   gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h
   gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.cc
   gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.h
Log:
investigated memory leaks, fixed one

Modified: gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc        
2007-12-07 04:23:45 UTC (rev 7084)
+++ gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.cc        
2007-12-07 05:17:48 UTC (rev 7085)
@@ -33,7 +33,6 @@
 static const size_t CACHE_LINE_SIZE = 128;
 
 static const bool VERBOSE = true;
-
 static const unsigned int DEFAULT_MAX_JOBS = 128;
 static const unsigned int DEFAULT_MAX_CLIENT_THREADS = 64;
 
@@ -58,6 +57,19 @@
   }
 };
 
+// custom deleter
+class spe_program_handle_deleter {
+public:
+  void operator()(spe_program_handle_t *program) {
+    if (program){
+      int r = spe_image_close(program);
+      if (r != 0){
+       perror("spe_image_close");
+      }
+    }
+  }
+};
+
 // custom deleter of anything that can be freed with "free"
 class free_deleter {
 public:
@@ -193,7 +205,6 @@
   // FIXME pass this in (or something)
   const char *spu_progname = "../lib/spu/test_spu";
 
-  // FIXME we're leaking the handle..
   spe_program_handle_t *spe_image = spe_image_open(spu_progname);
   if (spe_image == 0){
     char buf[128];
@@ -201,6 +212,7 @@
     perror(buf);
     throw std::runtime_error(buf);
   }
+  d_spe_image = spe_program_handle_sptr(spe_image, 
spe_program_handle_deleter());
 
   int spe_flags = (SPE_EVENTS_ENABLE
                   | SPE_CFG_SIGNOTIFY1_OR
@@ -434,7 +446,7 @@
     return false;
 
   if (jd->sys.client_id != cti->d_client_id){
-    fprintf(stderr, "gc_job_manager_impl::wait_job: can't want for job you 
didn't submit\n");
+    fprintf(stderr, "gc_job_manager_impl::wait_job: can't wait for a job you 
didn't submit\n");
     return false;
   }
 
@@ -575,7 +587,6 @@
     send_all_spes(MK_MBOX_MSG(OP_EXIT, 0));
 
     shutdown();
-    sleep(1);          // FIXME remove when shutdown waits for workers
 
     throw std::runtime_error("pthread_create");
   }
@@ -621,7 +632,7 @@
   // we assume that only a single event type can be signaled at once
   
   if (evt->events == SPE_EVENT_OUT_INTR_MBOX) { // SPE sent us 1 or more msgs
-    static const int NMSGS = 8;
+    static const int NMSGS = 32;
     unsigned int msg[NMSGS];
     int n = spe_out_mbox_read(evt->spe, msg, NMSGS);
     if (n < 0){
@@ -631,28 +642,22 @@
       for (int i = 0; i < n; i++){
        switch(MBOX_MSG_OP(msg[i])){
        case OP_JOB_DONE:
-         printf("job_done (0x%08x) from spu[%d]\n", msg[i], spe_num);
+         printf("eh: job_done (0x%08x) from spu[%d]\n", msg[i], spe_num);
          break;
 
        case OP_PING_REPLY:
-         printf("ping_reply (0x%08x) from spu[%d]\n", msg[i], spe_num);
+         printf("eh: ping_reply (0x%08x) from spu[%d]\n", msg[i], spe_num);
          break;
 
        case OP_EXIT:
        case OP_PING:
        default:
-         printf("Unexpected msg (0x%08x) from spu[%d]\n", msg[i], spe_num);
+         printf("eh: Unexpected msg (0x%08x) from spu[%d]\n", msg[i], spe_num);
          break;
        }
       }
     }
   }
-  else if (evt->events == SPE_EVENT_IN_MBOX){   // there's room to write to SPE
-    // spe_in_mbox_write (ignore)
-  }
-  else if (evt->events == SPE_EVENT_TAG_GROUP){         // our DMA completed
-    // spe_mfcio_tag_status_read
-  }
   else if (evt->events == SPE_EVENT_SPE_STOPPED){ // the SPE stopped
     spe_stop_info_t si;
     int r = spe_stop_info_read(evt->spe, &si);
@@ -696,6 +701,14 @@
       }
     }
   }
+#if 0 // not enabled
+  else if (evt->events == SPE_EVENT_IN_MBOX){   // there's room to write to SPE
+    // spe_in_mbox_write (ignore)
+  }
+  else if (evt->events == SPE_EVENT_TAG_GROUP){         // our DMA completed
+    // spe_mfcio_tag_status_read
+  }
+#endif
   else {
     fprintf(stderr, "handle_event: unexpected evt->events = 0x%x\n", 
evt->events);
     return;

Modified: gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h 
2007-12-07 04:23:45 UTC (rev 7084)
+++ gnuradio/branches/developers/eb/gcell/src/lib/gc_job_manager_impl.h 
2007-12-07 05:17:48 UTC (rev 7085)
@@ -33,6 +33,7 @@
 #include <boost/scoped_array.hpp>
 
 typedef boost::shared_ptr<spe_gang_context> spe_gang_context_sptr;
+typedef boost::shared_ptr<spe_program_handle_t> spe_program_handle_sptr;
 typedef boost::scoped_array<gc_client_thread_info> gc_client_thread_info_sa;
 
 
@@ -88,8 +89,9 @@
   enum { MAX_SPES =  16 };
 
 
-  gc_jm_options                 d_options;
-  spe_gang_context_sptr  d_gang;               // boost::shared_ptr
+  gc_jm_options                  d_options;
+  spe_program_handle_sptr d_spe_image;
+  spe_gang_context_sptr   d_gang;              // boost::shared_ptr
 
   worker_ctx            d_worker[MAX_SPES];    // SPE ctx, thread, etc
   gc_spu_args_t                *d_spu_args;            // 16-byte aligned 
structs

Modified: gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.cc
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.cc     
2007-12-07 04:23:45 UTC (rev 7084)
+++ gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.cc     
2007-12-07 05:17:48 UTC (rev 7085)
@@ -49,60 +49,157 @@
 }
 
 void
-qa_job_manager::t1()
+qa_job_manager::leak_check(test_t t, const std::string &name)
 {
   struct mallinfo before, after;
 
   before = mallinfo();
-  t1_body();
+  (this->*t)();
   after = mallinfo();
 
-  printf("before.uordblks = %6d\n", before.uordblks);
-  printf("after.uordblks  = %6d\n",  after.uordblks);
-  printf("delta = %d\n", after.uordblks - before.uordblks);
+  size_t delta = after.uordblks - before.uordblks;
+  if (delta != 0){
+    std::cout << name << " leaked memory\n";
+    printf("  before.uordblks = %6d\n", before.uordblks);
+    printf("  after.uordblks  = %6d\n",  after.uordblks);
+    printf("  delta = %d\n", after.uordblks - before.uordblks);
+  }
 }
 
 void
+qa_job_manager::t0()
+{
+  //leak_check(&qa_job_manager::t1_body, "t1-0");
+}
+
+void
+qa_job_manager::t1()
+{
+  t1_body();           // leaks 800 bytes first time, could be static inits
+  leak_check(&qa_job_manager::t1_body, "t1");
+}
+
+void
+qa_job_manager::t2()
+{
+  leak_check(&qa_job_manager::t2_body, "t2");
+}
+
+void
+qa_job_manager::t3()
+{
+  t3_body();           // leaks first time only, could be cppunit
+  leak_check(&qa_job_manager::t3_body, "t3");
+}
+
+void
+qa_job_manager::t4()
+{
+  leak_check(&qa_job_manager::t4_body, "t4");
+}
+
+void
+qa_job_manager::t5()
+{
+  leak_check(&qa_job_manager::t5_body, "t3");
+}
+
+void
+qa_job_manager::t6()
+{
+  leak_check(&qa_job_manager::t6_body, "t6");
+}
+
+void
+qa_job_manager::t7()
+{
+  leak_check(&qa_job_manager::t7_body, "t7");
+}
+
+void
+qa_job_manager::t8()
+{
+  leak_check(&qa_job_manager::t8_body, "t8");
+}
+
+void
+qa_job_manager::t9()
+{
+  leak_check(&qa_job_manager::t9_body, "t9");
+}
+
+void
+qa_job_manager::t10()
+{
+  leak_check(&qa_job_manager::t10_body, "t10");
+}
+
+// ----------------------------------------------------------------
+
+void
 qa_job_manager::t1_body()
 {
   gc_job_manager *mgr;
   mgr = gc_make_job_manager();
-  //gc_msleep(1000);
   delete mgr;
+}
 
-#if 1
-  // This seems to leak 352 bytes, but I'm not sure if it's us or the
+void
+qa_job_manager::t2_body()
+{
+  gc_job_manager *mgr;
+  gc_jm_options opts;
+  opts.nspes = 100;
+  opts.gang_schedule = false;
+  mgr = gc_make_job_manager(&opts);
+  delete mgr;
+}
+
+void
+qa_job_manager::t3_body()
+{
+  // This seems to leak memory, but I'm not sure if it's us or the
   // underlying exception handling mechanism
-  {
-    gc_jm_options opts;
-    opts.nspes = 100;
-    opts.gang_schedule = true;
-    CPPUNIT_ASSERT_THROW(mgr = gc_make_job_manager(&opts), std::out_of_range);
-  }
-#endif
 
-  {
-    gc_jm_options opts;
-    opts.nspes = 100;
-    opts.gang_schedule = false;
-    mgr = gc_make_job_manager(&opts);
-    //gc_msleep(1000);
-    delete mgr;
-  }
+  gc_job_manager *mgr;
+  gc_jm_options opts;
+  opts.nspes = 100;
+  opts.gang_schedule = true;
+  CPPUNIT_ASSERT_THROW(mgr = gc_make_job_manager(&opts), std::out_of_range);
 }
 
 void
-qa_job_manager::t2()
+qa_job_manager::t4_body()
 {
 }
 
 void
-qa_job_manager::t3()
+qa_job_manager::t5_body()
 {
 }
 
 void
-qa_job_manager::t4()
+qa_job_manager::t6_body()
 {
 }
 
+void
+qa_job_manager::t7_body()
+{
+}
+
+void
+qa_job_manager::t8_body()
+{
+}
+
+void
+qa_job_manager::t9_body()
+{
+}
+
+void
+qa_job_manager::t10_body()
+{
+}
+

Modified: gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.h
===================================================================
--- gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.h      
2007-12-07 04:23:45 UTC (rev 7084)
+++ gnuradio/branches/developers/eb/gcell/src/lib/qa_job_manager.h      
2007-12-07 05:17:48 UTC (rev 7085)
@@ -24,21 +24,50 @@
 #include <cppunit/extensions/HelperMacros.h>
 #include <cppunit/TestCase.h>
 
+class qa_job_manager;
+typedef void (qa_job_manager::*test_t)();
+
+
 class qa_job_manager : public CppUnit::TestCase {
 
   CPPUNIT_TEST_SUITE(qa_job_manager);
+  CPPUNIT_TEST(t0);
   CPPUNIT_TEST(t1);
   CPPUNIT_TEST(t2);
   CPPUNIT_TEST(t3);
   CPPUNIT_TEST(t4);
+  CPPUNIT_TEST(t5);
+  CPPUNIT_TEST(t6);
+  CPPUNIT_TEST(t7);
+  CPPUNIT_TEST(t8);
+  CPPUNIT_TEST(t9);
+  CPPUNIT_TEST(t10);
   CPPUNIT_TEST_SUITE_END();
 
  private:
+  void leak_check(test_t t, const std::string &name);
+
+  void t0();
   void t1();
   void t1_body();
   void t2();
+  void t2_body();
   void t3();
+  void t3_body();
   void t4();
+  void t4_body();
+  void t5();
+  void t5_body();
+  void t6();
+  void t6_body();
+  void t7();
+  void t7_body();
+  void t8();
+  void t8_body();
+  void t9();
+  void t9_body();
+  void t10();
+  void t10_body();
 
 };
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]