00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00044 #ifndef CCXX_MISC_H_
00045 #define CCXX_MISC_H_
00046
00047 #ifndef CCXX_MISSING_H_
00048 #include <cc++/missing.h>
00049 #endif
00050
00051 #ifndef CCXX_THREAD_H_
00052 #include <cc++/thread.h>
00053 #endif
00054
00055 #define KEYDATA_INDEX_SIZE 97
00056 #define KEYDATA_PAGER_SIZE 512
00057
00058 #if defined(PATH_MAX)
00059 #if PATH_MAX > 512
00060 #define KEYDATA_PATH_SIZE 512
00061 #else
00062 #define KEYDATA_PATH_SIZE PATH_MAX
00063 #endif
00064 #else
00065 #define KEYDATA_PATH_SIZE 256
00066 #endif
00067
00068 #ifdef CCXX_NAMESPACES
00069 namespace ost {
00070 #endif
00071
00072 class __EXPORT Runlist;
00073 class __EXPORT Runable;
00074
00090 class __EXPORT MemPager
00091 {
00092 private:
00093 friend class String;
00094 friend class MemPagerObject;
00095
00096 size_t pagesize;
00097 unsigned int pages;
00098
00099 struct _page
00100 {
00101 struct _page *next;
00102 size_t used;
00103 } *page;
00104
00105 protected:
00115 virtual void* first(size_t size);
00116
00124 virtual void* alloc(size_t size);
00125
00135 char* first(char *str);
00136
00146 char* alloc(const char *str);
00147
00157 MemPager(size_t pagesize = 4096);
00158
00162 void purge(void);
00163
00167 virtual ~MemPager();
00168
00169 public:
00176 inline int getPages(void)
00177 {return pages;};
00178 };
00179
00189 class __EXPORT StackPager : protected MemPager
00190 {
00191 private:
00192 typedef struct frame
00193 {
00194 struct frame *next;
00195 char data[1];
00196 } frame_t;
00197
00198 frame_t *stack;
00199
00200 public:
00206 StackPager(size_t pagesize);
00207
00215 void *push(const void *object, size_t len);
00216
00223 void *push(const char *string);
00224
00230 void *pull(void);
00231
00235 void purge(void);
00236 };
00237
00246 class __EXPORT SharedMemPager : public MemPager, public Mutex
00247 {
00248 protected:
00255 SharedMemPager(size_t pagesize = 4096, const char *name = NULL);
00256
00260 void purge(void);
00261
00268 void* first(size_t size);
00269
00276 void* alloc(size_t size);
00277 };
00278
00346 class __EXPORT Keydata : protected MemPager
00347 {
00348 public:
00349 #ifdef CCXX_PACKED
00350 #pragma pack(1)
00351 #endif
00352
00353 struct Keyval
00354 {
00355 Keyval *next;
00356 char val[1];
00357 };
00358
00359 struct Keysym
00360 {
00361 Keysym *next;
00362 Keyval *data;
00363 const char **list;
00364 short count;
00365 char sym[1];
00366 };
00367
00368 struct Define
00369 {
00370 char *keyword;
00371 char *value;
00372 };
00373
00374 #ifdef CCXX_PACKED
00375 #pragma pack()
00376 #endif
00377
00378 private:
00379 static std::ifstream *cfgFile;
00380 static char lastpath[KEYDATA_PATH_SIZE + 1];
00381 static int count;
00382 static int sequence;
00383
00384 int link;
00385
00386 Keysym *keys[KEYDATA_INDEX_SIZE];
00387
00394 unsigned getIndex(const char *sym);
00395
00396 protected:
00397 Keysym* getSymbol(const char *sym, bool create);
00398
00399 public:
00411 void load(const char *keypath);
00412
00426 void loadPrefix(const char *prefix, const char *keypath);
00427
00437 void loadFile(const char *filepath, const char *keys = NULL, const char *pre = NULL);
00438
00447 void load(Define *pairs);
00448
00452 Keydata();
00453
00461 Keydata(const char *keypath);
00462
00470 Keydata(Define *pairs, const char *keypath = NULL);
00471
00477 virtual ~Keydata();
00478
00486 void unlink(void);
00487
00496 int getCount(const char *sym);
00497
00505 const char* getFirst(const char *sym);
00506
00514 const char* getLast(const char *sym);
00515
00524 unsigned getIndex(char **data, unsigned max);
00525
00532 unsigned getCount(void);
00533
00542 void setValue(const char *sym, const char *data);
00543
00551 const char * const* getList(const char *sym);
00552
00559 void clrValue(const char *sym);
00560
00565 inline const char *operator[](const char *keyword)
00566 {return getLast(keyword);};
00567
00571 static void end(void);
00572
00577 friend inline void endKeydata(void)
00578 {Keydata::end();};
00579 };
00580
00588 class __EXPORT MemPagerObject
00589 {
00590 public:
00597 inline void *operator new(size_t size, MemPager &pager)
00598 {return pager.alloc(size);};
00599
00606 inline void *operator new[](size_t size, MemPager &pager)
00607 {return pager.alloc(size);};
00608
00612 inline void operator delete(void *) {};
00613
00617 inline void operator delete[](void *) {};
00618 };
00619
00628 class __EXPORT Assoc
00629 {
00630 private:
00631 class __EXPORT entry
00632 {
00633 public:
00634 const char *id;
00635 entry *next;
00636 void *data;
00637 };
00638
00639 entry *entries[KEYDATA_INDEX_SIZE];
00640
00641 protected:
00642 Assoc();
00643
00644 void clear(void);
00645
00646 virtual void *getMemory(size_t size) = 0;
00647
00648 public:
00649 void *getPointer(const char *id);
00650 void setPointer(const char *id, void *data);
00651 };
00652
00663 class __EXPORT Runlist : public Mutex
00664 {
00665 private:
00666 Runable *first, *last;
00667
00668 protected:
00669 unsigned limit, used;
00670 void check(void);
00671
00672 public:
00678 Runlist(unsigned count = 1);
00679
00688 bool add(Runable *run);
00689
00696 void del(Runable *run);
00697
00703 void set(unsigned limit);
00704 };
00705
00712 class __EXPORT Runable
00713 {
00714 private:
00715 friend class __EXPORT Runlist;
00716 Runlist *list;
00717 Runable *next, *prev;
00718
00719 protected:
00720 Runable();
00721 virtual ~Runable();
00722
00727 virtual void ready(void) = 0;
00728
00729 public:
00736 bool starting(Runlist *list);
00737
00743 void stoping(void);
00744 };
00745
00746 #ifdef CCXX_NAMESPACES
00747 }
00748 #endif
00749
00750 #endif
00751