-/*
-This file is part of libmspframework
+/* $Id$
+
+This file is part of libmspcore
Copyright © 2006 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
-#ifndef MSP_FRAMEWORK_APPLICATION_H_
-#define MSP_FRAMEWORK_APPLICATION_H_
+#ifndef MSP_CORE_APPLICATION_H_
+#define MSP_CORE_APPLICATION_H_
-#include "event.h"
-#include "poller.h"
-#include "types.h"
+#include "semaphore.h"
namespace Msp {
class Application
{
public:
- Poller::Slot &add_pollable(Pollable *, short);
- EventManager::Event &create_event();
- virtual ~Application();
+ virtual ~Application() { }
- static int run(int, char **);
- static void usage(const char *, bool);
+ static int run(int, char **, void * =0);
+ static void usage(const char *, const char *, bool);
+ static void *get_data() { return data_; }
protected:
- enum TickMode
+ enum LoopMode
{
- NONE, /// No ticks
- AFTER_POLL, /// One tick after each poll
- IDLE /// Constant torrent of ticks
+ NONE, /// No main loop - main() will just return
+ SLEEP, /// Only sleep in the main loop - useful for servers
+ TICK_SLEEP, /// Call tick every iteration, with a short sleep in between
+ TICK_YIELD, /// Call tick every iteration, with sched_yield in between
+ TICK_BUSY /// Call tick every iteration
};
-
+
class RegBase
{
public:
virtual Application *create_app(int, char **)=0;
- virtual void usage(const char *, bool)=0;
+ virtual void usage(const char *, const char *, bool)=0;
virtual ~RegBase() { }
protected:
RegBase();
{
public:
Application *create_app(int argc, char **argv) { return new T(argc, argv); }
- void usage(const char *a, bool b) { T::usage(a,b); }
+ void usage(const char *r, const char *a, bool b) { T::usage(r, a, b); }
};
bool done;
Application();
virtual int main();
void catch_signal(int);
- void set_tick_mode(TickMode);
+ void set_loop_mode(LoopMode);
+ void induce_tick();
void exit(int);
virtual void tick() { }
virtual void sighandler(int) { }
private:
- TickMode tick_mode_;
- Poller *poller_;
- EventManager *ev_mgr_;
- ThreadHandle main_tid;
+ LoopMode loop_mode_;
+ Semaphore sleep_sem_;
Application(const Application &);
Application &operator=(const Application &);
- static RegBase *reg_app_;
+ static RegBase *reg_app_;
static Application *app_;
+ static void *data_;
static void sighandler_(int);
static void sigalrm_(int) { }