summaryrefslogtreecommitdiff
path: root/gcell/lib/runtime/gc_job_manager_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcell/lib/runtime/gc_job_manager_impl.h')
-rw-r--r--gcell/lib/runtime/gc_job_manager_impl.h36
1 files changed, 29 insertions, 7 deletions
diff --git a/gcell/lib/runtime/gc_job_manager_impl.h b/gcell/lib/runtime/gc_job_manager_impl.h
index dad7873ab8..07dcabaf22 100644
--- a/gcell/lib/runtime/gc_job_manager_impl.h
+++ b/gcell/lib/runtime/gc_job_manager_impl.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2007,2008 Free Software Foundation, Inc.
+ * Copyright 2007,2008,2009 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -44,14 +44,15 @@ enum worker_state {
};
struct worker_ctx {
- volatile worker_state state;
- unsigned int spe_idx; // [0, nspes-1]
- spe_context_ptr_t spe_ctx;
- pthread_t thread;
- gc_spu_args_t *spu_args; // pointer to 16-byte aligned struct
+ volatile worker_state state;
+ unsigned int spe_idx; // [0, nspes-1]
+ spe_context_ptr_t spe_ctx;
+ spe_spu_control_area_t *spe_ctrl;
+ pthread_t thread;
+ gc_spu_args_t *spu_args; // pointer to 16-byte aligned struct
worker_ctx()
- : state(WS_FREE), spe_idx(0), spe_ctx(0),
+ : state(WS_FREE), spe_idx(0), spe_ctx(0), spe_ctrl(0),
thread(0), spu_args(0) {}
~worker_ctx();
};
@@ -64,6 +65,12 @@ enum evt_handler_state {
EHS_DEAD, // thread is dead
};
+enum job_completer_state {
+ JCS_INIT, // being initialized
+ JCS_RUNNING, // thread is running
+ JCS_DEAD, // thread is dead
+};
+
struct spe_event_handler {
spe_event_handler_ptr_t ptr;
@@ -107,6 +114,16 @@ class gc_job_manager_impl : public gc_job_manager
volatile bool d_shutdown_requested;
spe_event_handler d_spe_event_handler;
+ // used to coordinate communication w/ the job completer thread
+ omni_mutex d_jc_mutex;
+ omni_condition d_jc_cond;
+ pthread_t d_jc_thread; // the job completion thread
+ volatile job_completer_state d_jc_state;
+ int d_jc_njobs_active; // # of jobs submitted but not yet reaped
+
+ // round robin notification of spes
+ int d_ntell; // # of spes to tell
+ unsigned int d_tell_start; // which one to start with
// All of the job descriptors are hung off of here.
// We allocate them all in a single cache aligned chunk.
@@ -150,12 +167,17 @@ class gc_job_manager_impl : public gc_job_manager
public:
void event_handler_loop(); // really private
+ void job_completer_loop(); // really private
private:
bool send_all_spes(uint32_t msg);
bool send_spe(unsigned int spe, uint32_t msg);
void print_event(spe_event_unit_t *evt);
void handle_event(spe_event_unit_t *evt);
+ bool incr_njobs_active();
+ void decr_njobs_active(int n);
+ void tell_spes_to_check_queue();
+ void poll_for_job_completion();
// bitvector ops
void bv_zero(unsigned long *bv);