X-Git-Url: https://git.ucc.asn.au/?p=matches%2Fhonours.git;a=blobdiff_plain;f=course%2Fsemester2%2Fpprog%2Fassignment1%2Fmthread%2Fnbody.h;h=f2de0229ee9c1fbfda57542c8af6aaf3c7d0c493;hp=7abe52504edb50343d6af1e4cc673216f4e48f2f;hb=df06a43b2727b939ee572a1ddaa39e707aff030a;hpb=6529f76db3022ec72ca7718d5e2bc3f176b474e9 diff --git a/course/semester2/pprog/assignment1/mthread/nbody.h b/course/semester2/pprog/assignment1/mthread/nbody.h index 7abe5250..f2de0229 100644 --- a/course/semester2/pprog/assignment1/mthread/nbody.h +++ b/course/semester2/pprog/assignment1/mthread/nbody.h @@ -10,7 +10,7 @@ #define DEFAULT_WORKING_THREADS 2 -//#define PERSISTENT_THREADS //If defined, threads will not be continually destroyed and then respawned +#define PERSISTENT_THREADS //If defined, threads will not be continually destroyed and then respawned @@ -28,15 +28,24 @@ void AfterDraw(); void * Compute_Thread(void * system); //Thread - Continuously perform computations for a System of bodies. May spawn additional worker threads. + +System * Split_System(System * s, unsigned n); // Splits one system into a number of other systems, returns an array of size n +pthread_t * Allocate_Threads(unsigned n); // Allocates space for threads - handles errors + #ifdef PERSISTENT_THREADS void * Worker_Thread(void * arg); -#else +#endif //PERSISTENT_THREADS void * Force_Thread(void * system); //Thread - Compute forces for all objects in a system void * Position_Thread(void * system); //Thread - Compute positions for all objects in a system -#endif //PERSISTENT_THREADS void Thread_Cleanup(void); //Called at program exit to safely join computation thread +/** + * Structure to represent a barrier for multiple threads + * @param mutex - Mutex around the counter + * @param busy - Counter of threads within the barrier + * @param threads_done_cv - Condition to wake up threads waiting on barrier once all working threads have left it + */ typedef struct { pthread_mutex_t mutex; @@ -44,6 +53,17 @@ typedef struct pthread_cond_t threads_done_cv; } Barrier; +/** + * Structure to represent a pair of Systems; passed to Force_Thread + * @param A - System to calculate forces for + * @param B - System causing forces on System A + */ +typedef struct +{ + System * A; + System * B; +} System_ForcePair; + void Barrier_Init(Barrier * b); void Barrier_Enter(Barrier * b); void Barrier_Leave(Barrier * b);