ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

78 lines
2.5 KiB

  1. #ifndef CPPCMS_PROC_CHACHE_H
  2. #define CPPCMS_PROC_CHACHE_H
  3. #include "base_cache.h"
  4. #include "cache_interface.h"
  5. #include "pthread.h"
  6. #include <map>
  7. #include <list>
  8. #include <sys/types.h>
  9. #include "shmem_allocator.h"
  10. namespace cppcms {
  11. class process_cache;
  12. class process_cache_factory : public cache_factory{
  13. process_cache *cache;
  14. static ::pid_t owner_pid;
  15. public:
  16. static shmem_control *mem;
  17. process_cache_factory(size_t memsize,char const *file);
  18. virtual ~process_cache_factory();
  19. virtual base_cache *get() const;
  20. virtual void del(base_cache *p) const;
  21. };
  22. using namespace std;
  23. class process_cache : public base_cache {
  24. pthread_mutex_t lru_mutex;
  25. pthread_rwlock_t access_lock;
  26. typedef std::basic_string<char,std::char_traits<char>,shmem_allocator<char,process_cache_factory::mem> > shr_string;
  27. struct container {
  28. shr_string data;
  29. typedef map<shr_string,container,std::less<shr_string>,
  30. shmem_allocator<std::pair<shr_string,container>,process_cache_factory::mem > > primary_map;
  31. typedef primary_map::iterator pointer;
  32. typedef list<pointer,shmem_allocator<pointer,process_cache_factory::mem> > pointer_list;
  33. pointer_list::iterator lru;
  34. typedef multimap<shr_string,pointer,std::less<shr_string>,
  35. shmem_allocator<std::pair<shr_string,pointer>,process_cache_factory::mem > > secondary_map;
  36. list<secondary_map::iterator,shmem_allocator<secondary_map::iterator,process_cache_factory::mem> > triggers;
  37. typedef multimap<time_t,pointer,std::less<time_t>,
  38. shmem_allocator<std::pair<time_t,pointer>,process_cache_factory::mem > > timeout_map;
  39. timeout_map::iterator timeout;
  40. };
  41. typedef container::pointer pointer;
  42. container::primary_map primary;
  43. container::secondary_map triggers;
  44. typedef container::secondary_map::iterator triggers_ptr;
  45. container::timeout_map timeout;
  46. typedef container::timeout_map::iterator timeout_ptr;
  47. container::pointer_list lru;
  48. typedef container::pointer_list::iterator lru_ptr;
  49. unsigned memsize;
  50. shr_string *get(string const &key,set<string> *triggers);
  51. void delete_node(pointer p);
  52. int fd;
  53. public:
  54. process_cache(size_t memsize);
  55. virtual bool fetch_page(string const &key,string &output,bool gzip);
  56. virtual bool fetch(string const &key,archive &a,set<string> &tags);
  57. virtual void rise(string const &trigger);
  58. virtual void clear();
  59. virtual void stats(unsigned &keys,unsigned &triggers);
  60. virtual void store(string const &key,set<string> const &triggers,time_t timeout,archive const &a);
  61. virtual ~process_cache();
  62. void *operator new(size_t n);
  63. void operator delete (void *p);
  64. };
  65. }
  66. #endif