rust/src/rt/rust_kernel.h
Brian Anderson 0cd607bcbd rt: Shutdown gracefully on failure
When the kernel fails, kill all tasks and wait for the schedulers to stop
instead of just exiting. I'm sure there are tons of lurking issues here but
this is enough to fail without leaking (at least in the absence of cleanups).
2011-08-10 13:02:31 -07:00

68 lines
1.5 KiB
C++

// -*- c++ -*-
#ifndef RUST_KERNEL_H
#define RUST_KERNEL_H
/**
* A global object shared by all thread domains. Most of the data structures
* in this class are synchronized since they are accessed from multiple
* threads.
*/
class rust_kernel {
memory_region _region;
rust_log _log;
public:
rust_srv *srv;
private:
lock_and_signal _kernel_lock;
array_list<rust_scheduler *> threads;
randctx rctx;
rust_scheduler *create_scheduler(int id);
void destroy_scheduler(rust_scheduler *sched);
void create_schedulers();
void destroy_schedulers();
rust_task_id max_id;
hash_map<rust_task_id, rust_task *> task_table;
public:
const size_t num_threads;
int rval;
volatile int live_tasks;
struct rust_env *env;
rust_kernel(rust_srv *srv, size_t num_threads);
bool is_deadlocked();
void signal_kernel_lock();
void wakeup_schedulers();
void log_all_scheduler_state();
void log(uint32_t level, char const *fmt, ...);
void fatal(char const *fmt, ...);
virtual ~rust_kernel();
void *malloc(size_t size, const char *tag);
void *realloc(void *mem, size_t size);
void free(void *mem);
void fail();
int start_task_threads();
#ifdef __WIN32__
void win32_require(LPCTSTR fn, BOOL ok);
#endif
rust_task_id create_task(rust_task *spawner, const char *name);
rust_task *get_task_by_id(rust_task_id id);
void release_task_id(rust_task_id tid);
};
#endif /* RUST_KERNEL_H */