[Top][All Lists]
[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();
};
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7085 - gnuradio/branches/developers/eb/gcell/src/lib,
eb <=