⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagepool.h

📁 柯老师网站上找到的
💻 H
字号:
// Copyright (c) Xerox Corporation 1998. All rights reserved.//// License is granted to copy, to use, and to make and to use derivative// works for research and evaluation purposes, provided that Xerox is// acknowledged in all documentation pertaining to any such copy or// derivative work. Xerox grants no other licenses expressed or// implied. The Xerox trade name should not be used in any advertising// without its written permission. //// XEROX CORPORATION MAKES NO REPRESENTATIONS CONCERNING EITHER THE// MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS SOFTWARE// FOR ANY PARTICULAR PURPOSE.  The software is provided "as is" without// express or implied warranty of any kind.//// These notices must be retained in any copies of any part of this// software. //// Definitions for class PagePool//// $Header: /nfs/jade/vint/CVSROOT/ns-2/webcache/pagepool.h,v 1.14 1999/11/18 23:14:35 haoboy Exp $#ifndef ns_pagepool_h#define ns_pagepool_h#include <stdio.h>#include <limits.h>#include <tcl.h>#include <ranvar.h>#include <tclcl.h>#include "config.h"enum WebPageType { HTML, MEDIA };class Page {public:	Page(int size) : size_(size) {}	int size() const { return size_; }	int& id() { return id_; }	virtual WebPageType type() const = 0; 	// Page type: HTML or MEDIAprotected:	int size_;	int id_;};class ServerPage : public Page {public:	ServerPage(int size, int id) : Page(size) {		id_ = id, mtime_ = NULL, num_mtime_ = 0;	}	virtual ~ServerPage() {		if (mtime_ != NULL) 			delete []mtime_;	}	virtual WebPageType type() const { return HTML; }	int& size() { return size_; }	int& mtime(int n) { return mtime_[n]; }	int& num_mtime() { return num_mtime_; }	void set_mtime(int *mt, int n);protected:	int *mtime_;	int num_mtime_;};class HttpApp;// Page statesconst int HTTP_PAGE_STATE_MASK	= 0x00FF;const int HTTP_ALL_PAGE_STATES	= 0x00ff; // all page statesconst int HTTP_VALID_PAGE	= 0x01;	// Valid pageconst int HTTP_SERVER_DOWN	= 0x02;	// Server is down. Don't know if 					// page is validconst int HTTP_VALID_HEADER	= 0x04;	// Only meta-data is validconst int HTTP_UNREAD_PAGE	= 0x08;	// Unread valid page// Used only for server to manage its pages. A none-cacheable page won't be // stored by caches and clients.const int HTTP_UNCACHEABLE	= 0x10; // Non-cacheable page// Page actionsconst int HTTP_PAGE_ACTION_MASK = 0xFF00; // Page action bit maskconst int HTTP_MANDATORY_PUSH	= 0x1000; // If the page is mandatory pushedstruct PageID {	PageID() : s_(NULL), id_(0) {}	PageID(int* t) {		s_ = (HttpApp*)t[0];		id_ = t[1];	}	HttpApp* s_;	int id_;};class ClientPage : public Page {public:	ClientPage(const char *n, int s, double mt, double et, double a);	virtual ~ClientPage() {}	virtual WebPageType type() const { return HTML; }	virtual void print_info(char* buf);	void name(char* buf);	double& mtime() { return mtime_; }	double& etime() { return etime_; }	double& age() { return age_; }	HttpApp* server() { return server_; }	// Page becomes valid. Clear all other possible invalid bits	void validate(double mtime) { 		if (mtime_ >= mtime)			abort(); // This shouldn't happen!		// Clear server down bit		clear_page_state(HTTP_SERVER_DOWN);		set_page_state(HTTP_VALID_PAGE);		mtime_ = mtime;	}	void invalidate(double mtime) { 		if (mtime_ >= mtime)			return;		clear_page_state(HTTP_VALID_PAGE);		clear_page_state(HTTP_VALID_HEADER);		mtime_ = mtime;	}	int is_valid() const { 		return (status_ & HTTP_VALID_PAGE);	}	int is_header_valid() const {		return ((status_ & HTTP_VALID_PAGE) || 			(status_ & HTTP_VALID_HEADER));	}	inline void set_valid_hdr() { 		// XXX page invalid, but only header valid		clear_page_state(HTTP_SERVER_DOWN);		clear_page_state(HTTP_VALID_PAGE);		set_page_state(HTTP_VALID_HEADER); 	}	inline void set_uncacheable() { 		set_page_state(HTTP_UNCACHEABLE);	}	inline int is_uncacheable() {		return (status_ & HTTP_UNCACHEABLE);	}	// Has nothing to do with valid/invalid/server_down etc. It can 	// be combined with all other page status	inline void set_unread() { 		set_page_state(HTTP_UNREAD_PAGE); 	}	inline void set_read() { 		clear_page_state(HTTP_UNREAD_PAGE);	}	inline int is_unread() { return (status_ & HTTP_UNREAD_PAGE); }	inline int is_server_down() { return (status_ & HTTP_SERVER_DOWN); }	inline void server_down() {		// Set page as invalid		// Don't change mtime, only change page status		clear_page_state(HTTP_VALID_PAGE);		clear_page_state(HTTP_VALID_HEADER);		set_page_state(HTTP_SERVER_DOWN);	}	// Flags to indicate whether we want to do all push or selective push	// If 0: selective push, otherwise all push	static int PUSHALL_; 	inline int& counter() { 		if (PUSHALL_) counter_ = INT_MAX;		return counter_;	}	inline int count_inval(int a, int th) { 		if (PUSHALL_) 			return INT_MAX;		else {			counter_ -= a; 			if (counter_ < th) 				counter_ = th;			return counter_; 		}	}	inline int count_request(int b, int th) { 		if (PUSHALL_) 			return INT_MAX;		else {			counter_ += b; 			if (counter_ > th) 				counter_ = th;			return counter_; 		}	}	inline void set_mpush(double time) { 		set_page_action(HTTP_MANDATORY_PUSH), mpushTime_ = time; 	}	inline void clear_mpush() { clear_page_action(HTTP_MANDATORY_PUSH); }	inline int is_mpush() { return status_ & HTTP_MANDATORY_PUSH; }	inline double mpush_time() { return mpushTime_; }	// Used to split page names into page identifiers	static void split_name(const char* name, PageID& id);	static void print_name(char* name, PageID& id);protected:	void set_page_state(int state) {		status_ |= state;	}	void clear_page_state(int state) {		status_ = status_ & ~state;	}	void set_page_action(int action) {		status_ |= action;	}	void clear_page_action(int action) {		status_ = status_ & ~action;	}	HttpApp* server_;	double age_;	double mtime_;	// modification time	double etime_;	// entry time	int status_;	// VALID or INVALID	int counter_;	// counter for invalidation & request	double mpushTime_;};// Abstract page pool, used for interface onlyclass PagePool : public TclObject {public: 	PagePool() : num_pages_(0), start_time_(INT_MAX), end_time_(INT_MIN) {}	int num_pages() const { return num_pages_; }protected:	virtual int command(int argc, const char*const* argv);	int num_pages_;	double start_time_;	double end_time_;	int duration_;	// Helper functions	TclObject* lookup_obj(const char* name) {		TclObject* obj = Tcl::instance().lookup(name);		if (obj == NULL) 			fprintf(stderr, "Bad object name %s\n", name);		return obj;	}};// Page pool based on real server tracesconst int TRACEPAGEPOOL_MAXBUF = 4096;// This trace must contain web page names and all of its modification timesclass TracePagePool : public PagePool {public:	TracePagePool(const char *fn);	virtual ~TracePagePool();	virtual int command(int argc, const char*const* argv);protected:	Tcl_HashTable *namemap_, *idmap_;	RandomVariable *ranvar_;	ServerPage* load_page(FILE *fp);	void change_time();	int add_page(const char* pgname, ServerPage *pg);	ServerPage* get_page(int id);};// Page pool based on mathematical models of request and page // modification patternsclass MathPagePool : public PagePool {public:	// XXX TBA: what should be here???	MathPagePool() : rvSize_(0), rvAge_(0) { num_pages_ = 1; }protected:	virtual int command(int argc, const char*const* argv);	// Single page	RandomVariable *rvSize_;	RandomVariable *rvAge_;};// Assume one main page, which changes often, and multiple component pagesclass CompMathPagePool : public PagePool {public:	CompMathPagePool();protected:	virtual int command(int argc, const char*const* argv);	RandomVariable *rvMainAge_;  // modtime for main page	RandomVariable *rvCompAge_;  // modtime for component pages	int main_size_, comp_size_;};class ClientPagePool : public PagePool {public:	ClientPagePool();	virtual ~ClientPagePool();	virtual ClientPage* enter_page(int argc, const char*const* argv);	virtual ClientPage* enter_metadata(int argc, const char*const* argv);	virtual ClientPage* enter_page(const char *name, int size, double mt, 				       double et, double age);	virtual ClientPage* enter_metadata(const char *name, int size, 					   double mt, double et, double age);	virtual int remove_page(const char *name);	void invalidate_server(int server_id);	ClientPage* get_page(const char *name);	int get_mtime(const char *name, double &mt);	int set_mtime(const char *name, double mt);	int exist_page(const char *name) { return (get_page(name) != NULL); }	int get_size(const char *name, int &size);	int get_age(const char *name, double &age);	int get_etime(const char *name, double &et);	int set_etime(const char *name, double et);	int get_pageinfo(const char *name, char *buf);	virtual int command(int argc, const char*const* argv);protected:	int add_page(ClientPage *pg);	Tcl_HashTable *namemap_;};// This is *not* designed for BU trace files. We should write a script to // transform BU traces to a single trace file with the following format://// <client id> <page id> <time> <size>//// Q: How would we deal with page size changes? // What if simulated response time// is longer and a real client request for the same page happened before the // simulated request completes? class ProxyTracePagePool : public PagePool {public:	ProxyTracePagePool();// : rvDyn_(NULL), rvStatic_(NULL), br_(0), //		size_(NULL), reqfile_(NULL), req_(NULL), lastseq_(0)//		{}	virtual ~ProxyTracePagePool();	virtual int command(int argc, const char*const* argv);protected:	// How would we handle different types of page modifications? How 	// to integrate bimodal, and multi-modal distributions?	int init_req(const char *fn);	int init_page(const char *fn);	int find_info();	RandomVariable *rvDyn_, *rvStatic_;	int br_; 		// bimodal ratio	int *size_; 		// page sizes	FILE *reqfile_;		// request stream of proxy trace	struct ClientRequest {		ClientRequest() : seq_(0), nrt_(0), nurl_(0), fpos_(0)			{}		int seq_;	// client sequence number, used to match 				// client ids in the trace file		double nrt_;	// next request time		int nurl_; 	// next request url		long fpos_;	// position in file of its next request	};	Tcl_HashTable *req_;	// Requests table	int nclient_, lastseq_;	ClientRequest* load_req(int cid);};class EPATracePagePool : public ProxyTracePagePool {public:	virtual int command(int argc, const char*const* argv);};#endif //ns_pagepool_h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -