/*
* The PyHST program is Copyright (C) 2002-2011 of the
* European Synchrotron Radiation Facility (ESRF) and
* Karlsruhe Institute of Technology (KIT).
*
* PyHST is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* hst is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef _HW_SCHED_H
#define _HW_SCHED_H
#include
typedef struct HWSchedT *HWSched;
#ifdef HW_USE_THREADS
typedef GMutex *HWMutex;
#else /* HW_USE_THREADS */
typedef void *HWMutex;
#endif /* HW_USE_THREADS */
#include "hw_thread.h"
enum HWSchedModeT {
HW_SCHED_MODE_PREALLOCATED = 0,
HW_SCHED_MODE_SEQUENTIAL
};
typedef enum HWSchedModeT HWSchedMode;
enum HWSchedChunkT {
HW_SCHED_CHUNK_INVALID = -1,
HW_SCHED_CHUNK_INIT = -2,
HW_SCHED_CHUNK_FREE = -3,
HW_SCHED_CHUNK_TERMINATOR = -4
};
typedef enum HWSchedChunkT HWSchedChunk;
enum HWSchedFlagsT {
HW_SCHED_FLAG_INIT_CALL = 1, //! Executed in each thread before real chunks
HW_SCHED_FLAG_FREE_CALL = 2, //! Executed in each thread after real chunks
HW_SCHED_FLAG_TERMINATOR_CALL = 4 //! Executed in one of the threads after all threads are done
};
typedef enum HWSchedFlagsT HWSchedFlags;
#define HW_SINGLE_MODE
//#define HW_DETECT_CPU_CORES
#define HW_MAX_THREADS 128
#ifdef HW_SINGLE_MODE
typedef HWRunFunction HWEntry;
# define hw_run_entry(runs, entry) entry
#else /* HW_SINGLE_MODE */
typedef int HWEntry;
# define hw_run_entry(runs, entry) runs[entry]
#endif /* HW_SINGLE_MODE */
#ifndef HW_HIDE_DETAILS
struct HWSchedT {
int status;
int started;
int n_threads;
HWThread thread[HW_MAX_THREADS];
#ifdef HW_USE_THREADS
GCond *job_cond, *compl_cond;
GMutex *job_cond_mutex, *compl_cond_mutex, *data_mutex;
GMutex *sync_mutex;
#endif /* HW_USE_THREADS */
HWSchedMode mode;
HWSchedMode saved_mode;
HWSchedFlags flags;
int *n_blocks;
int *cur_block;
HWEntry entry;
void *ctx;
};
typedef struct HWSchedT HWSchedS;
#endif /* HW_HIDE_DETAILS */
# ifdef __cplusplus
extern "C" {
# endif
HWSched hw_sched_create(int ppu_count);
int hw_sched_init(void);
void hw_sched_destroy(HWSched ctx);
int hw_sched_get_cpu_count(void);
int hw_sched_set_sequential_mode(HWSched ctx, int *n_blocks, int *cur_block, HWSchedFlags flags);
int hw_sched_get_chunk(HWSched ctx, int thread_id);
int hw_sched_schedule_task(HWSched ctx, void *appctx, HWEntry entry);
int hw_sched_wait_task(HWSched ctx);
int hw_sched_execute_task(HWSched ctx, void *appctx, HWEntry entry);
int hw_sched_schedule_thread_task(HWSched ctx, void *appctx, HWEntry entry);
int hw_sched_wait_thread_task(HWSched ctx);
int hw_sched_execute_thread_task(HWSched ctx, void *appctx, HWEntry entry);
HWMutex hw_sched_create_mutex(void);
void hw_sched_destroy_mutex(HWMutex ctx);
#ifdef HW_USE_THREADS
# define hw_sched_lock(ctx, type) g_mutex_lock(ctx->type##_mutex)
# define hw_sched_unlock(ctx, type) g_mutex_unlock(ctx->type##_mutex)
# define hw_sched_broadcast(ctx, type) g_cond_broadcast(ctx->type##_cond)
# define hw_sched_signal(ctx, type) g_cond_signal(ctx->type##_cond)
# define hw_sched_wait(ctx, type) g_cond_wait(ctx->type##_cond, ctx->type##_cond_mutex)
#define hw_sched_create_mutex(void) g_mutex_new()
#define hw_sched_destroy_mutex(ctx) g_mutex_free(ctx)
#define hw_sched_lock_mutex(ctx) g_mutex_lock(ctx)
#define hw_sched_unlock_mutex(ctx) g_mutex_unlock(ctx)
#else /* HW_USE_THREADS */
# define hw_sched_lock(ctx, type)
# define hw_sched_unlock(ctx, type)
# define hw_sched_broadcast(ctx, type)
# define hw_sched_signal(ctx, type)
# define hw_sched_wait(ctx, type)
#define hw_sched_create_mutex(void) NULL
#define hw_sched_destroy_mutex(ctx)
#define hw_sched_lock_mutex(ctx)
#define hw_sched_unlock_mutex(ctx)
#endif /* HW_USE_THREADS */
# ifdef __cplusplus
}
# endif
#endif /* _HW_SCHED_H */