00001
00032 #ifndef LL_LLAPP_H
00033 #define LL_LLAPP_H
00034
00035 #include <map>
00036 #include "llapr.h"
00037 #include "llrun.h"
00038 #include "llsd.h"
00039
00040
00041 class LLErrorThread;
00042 class LLApp;
00043
00044
00045 typedef void (*LLAppErrorHandler)();
00046 typedef void (*LLAppChildCallback)(int pid, bool exited, int status);
00047
00048 #if !LL_WINDOWS
00049 extern const S32 LL_SMACKDOWN_SIGNAL;
00050
00051
00052 void clear_signals();
00053
00054 class LLChildInfo
00055 {
00056 public:
00057 LLChildInfo() : mGotSigChild(FALSE), mCallback(NULL) {}
00058 BOOL mGotSigChild;
00059 LLAppChildCallback mCallback;
00060 };
00061 #endif
00062
00063 class LLApp
00064 {
00065 friend class LLErrorThread;
00066 public:
00067 typedef enum e_app_status
00068 {
00069 APP_STATUS_RUNNING,
00070 APP_STATUS_QUITTING,
00071 APP_STATUS_STOPPED,
00072 APP_STATUS_ERROR
00073 } EAppStatus;
00074
00075
00076 LLApp();
00077 virtual ~LLApp();
00078
00082 static LLApp* instance();
00083
00090 enum OptionPriority
00091 {
00092 PRIORITY_RUNTIME_OVERRIDE,
00093 PRIORITY_COMMAND_LINE,
00094 PRIORITY_SPECIFIC_CONFIGURATION,
00095 PRIORITY_GENERAL_CONFIGURATION,
00096 PRIORITY_DEFAULT,
00097 PRIORITY_COUNT
00098 };
00099
00107 LLSD getOption(const std::string& name) const;
00108
00121 bool parseCommandOptions(int argc, char** argv);
00122
00133 bool setOptionData(OptionPriority level, LLSD data);
00134
00143 LLSD getOptionData(OptionPriority level);
00145
00146
00147
00148
00149
00150
00151 virtual bool init() = 0;
00152
00153
00154
00155
00156
00157
00158
00159
00160 virtual bool cleanup() = 0;
00161
00162
00163
00164
00165
00166
00167
00168 virtual bool mainLoop() = 0;
00169
00170
00171
00172
00173
00174 static void setQuitting();
00175 static void setStopped();
00176 static void setError();
00177 static bool isStopped();
00178 static bool isRunning();
00179 static bool isQuitting();
00180 static bool isError();
00181 static bool isExiting();
00182 #if !LL_WINDOWS
00183 static U32 getSigChildCount();
00184 static void incSigChildCount();
00185 #endif
00186 static int getPid();
00187
00188
00189
00190
00191 void setErrorHandler(LLAppErrorHandler handler);
00192
00193 #if !LL_WINDOWS
00194
00195
00196
00197
00198
00199
00200
00201 void setChildCallback(pid_t pid, LLAppChildCallback callback);
00202
00203
00204 void setDefaultChildCallback(LLAppChildCallback callback);
00205
00206
00207
00208
00209 pid_t fork();
00210 #endif
00211
00221 LLRunner& getRunner() { return mRunner; }
00222
00223 public:
00224 typedef std::map<std::string, std::string> string_map;
00225 string_map mOptionMap;
00226
00227 protected:
00228
00229 static void setStatus(EAppStatus status);
00230 static EAppStatus sStatus;
00231 static BOOL sErrorThreadRunning;
00232
00233 #if !LL_WINDOWS
00234 static LLAtomicU32* sSigChildCount;
00235 typedef std::map<pid_t, LLChildInfo> child_map;
00236 static child_map sChildMap;
00237 static LLAppChildCallback sDefaultChildCallback;
00238 #endif
00239
00243 void stepFrame();
00244
00245 private:
00246 void setupErrorHandling();
00247
00248 static void runErrorHandler();
00249
00250
00251
00252
00253 typedef int(*signal_handler_func)(int signum);
00254 static LLAppErrorHandler sErrorHandler;
00255
00256
00257 LLErrorThread* mThreadErrorp;
00258
00259
00260 LLRunner mRunner;
00261
00264
00265
00266 LLSD mOptions;
00267
00269
00270 private:
00271
00272 static LLApp* sApplication;
00273
00274
00275 #if !LL_WINDOWS
00276 friend void default_unix_signal_handler(int signum, siginfo_t *info, void *);
00277 #endif
00278
00279 public:
00280 static BOOL sLogInSignal;
00281 };
00282
00283 #endif // LL_LLAPP_H