00001 #ifndef bbsimpl_h 00002 #define bbsimpl_h 00003 00004 class BBSImpl { 00005 public: 00006 BBSImpl(); 00007 virtual ~BBSImpl(); 00008 00009 virtual boolean look(const char*) = 0; 00010 00011 virtual void take(const char*) = 0; /* blocks til something to take */ 00012 virtual boolean look_take(const char*) = 0; /* returns false if nothing to take */ 00013 // after taking use these 00014 virtual int upkint() = 0; 00015 virtual double upkdouble() = 0; 00016 virtual void upkvec(int, double*) = 0; 00017 virtual char* upkstr() = 0; // delete [] char* when finished 00018 virtual char* upkpickle(size_t*) = 0; // delete [] char* when finished 00019 00020 // before posting use these 00021 virtual void pkbegin() = 0; 00022 virtual void pkint(int) = 0; 00023 virtual void pkdouble(double) = 0; 00024 virtual void pkvec(int, double*) = 0; 00025 virtual void pkstr(const char*) = 0; 00026 virtual void pkpickle(const char*, size_t) = 0; 00027 virtual void post(const char*) = 0; 00028 00029 virtual void post_todo(int parentid) = 0; 00030 virtual void post_result(int id) = 0; 00031 virtual int look_take_result(int pid) = 0; // returns id, or 0 if nothing 00032 virtual int look_take_todo() = 0; // returns id, or 0 if nothing 00033 virtual int take_todo() = 0; // returns id 00034 virtual void save_args(int userid) = 0; 00035 virtual void return_args(int userid); 00036 00037 virtual void execute(int id); // assumes a "todo" message in receive buffer 00038 virtual int submit(int userid); 00039 virtual boolean working(int &id, double& x, int& userid); 00040 virtual void context(); 00041 00042 virtual void start(); 00043 virtual void done(); 00044 00045 virtual void worker(); // forever execute 00046 virtual boolean is_master(); 00047 virtual double time(); 00048 00049 virtual void perror(const char*); 00050 public: 00051 int working_id_, n_; 00052 double wait_time_; 00053 double integ_time_; 00054 double send_time_; 00055 char* pickle_ret_; 00056 size_t pickle_ret_size_; 00057 static boolean is_master_; 00058 static boolean started_, done_; 00059 static boolean use_pvm_; 00060 static int mytid_; 00061 static int debug_; 00062 protected: 00063 char* execute_helper(size_t*, int id); // involves hoc specific details in ocbbs.c 00064 void subworld_worker_execute(); //shadows execute_helper. ie. each of 00065 // the nrnmpi_myid_bbs workers (and master) need to execute 00066 // the same thing on each of the subworld processes 00067 // associated with nrnmpi_myid==0. A subworld does not 00068 // intracommunicate via the bulletin board but only via 00069 // mpi on the subworld communicator. 00070 }; 00071 00072 #endif