squid 原始碼學習2

2021-06-21 15:32:23 字數 3033 閱讀 9089

// 下面的類共同協作,完成了乙個物件鍊錶

// 任何從asynccall繼承的物件都可以插入鍊錶 ,擁有可定義的fire函式,實現自己的功能,並在鍊錶中依次被調動

// 鍊錶中物件都可自動記錄引用計數

// 基類, 完成記錄次數的自增自減和返回

struct refcountable_

virtual ~recountable_()

// 自增

void refcountreference() const

// 自減

unsigned refcountdereference()const

// 返回

unsigned refcountcount()const

private:

mutable unsigned count_; // 在const裡可以被修改

};#define refcountable virtual refcountable_

template // c 都是從refcountable_繼承 有 次數自增和自減的函式

class refcount // 此類儲存 c類的物件指標 用來管理物件的引用計數

; // 預設建構函式

refcount(c const *p):p_(p) // 一般建構函式

~refcount()

refcount(const refcount &p):p_(p.p_)

// 賦值建構函式 原先物件多一,本

refcount &operator = (const refcount &p)

//對p_成員取反後返回

bool operator !() const

// 取指標取值

c* operator ->()const

c & operator *()const

// 獲取原始指標

c const * getraw()const

c * getraw()

//相等和不等的比較

bool operator == (const refcount &p) const

bool operator != (const refcount &p) const

private:

// 原先指標呼叫refcountdereference 然後釋放,儲存新指標

void dereference(c const *newp_ = null)

}void reference (const refcount &p) }

c const *p_; // c為模板型別

}class asynccall :public refcountable

// 不為空為true 為真取消 ==空 為假

virtual calldialar * getdialar() = 0;

void print(std::ostream &os);

void dequeue(asynccall :: pointer &head, asynccall::pointer &prev);

void setnext(asynccall::pointer anext)

asynccall::pointer &next()

public:

const char*const name;

const int debugsection;

const int debuglevel;

const instanceidid;

protected:

virtual bool canfire();

virtual void fire() = 0;

asynccall :: pointer thenext;

private:

const char *iscanceled;

asynccall();

asynccall(const asynccall &);

}asynccall::asynccall(int adebugsection, int adebuglevel, const char *aname):name(aname),debugsection(adebugsection),thenext(0),iscanceled(null){}

asynccall::~asynccall() // thenext為非空時,就是存在值時,被斷住

void asynccall::make()

if (!iscanceled)

iscanceled = "unknown reason";

}bool asynccall::cancel(const char * reason)

bool asynccall::canfire()

void asynccall::print(std::ostream &os)

class asynccallqueue // 鍊錶的單間類

;asynccallqueue* asynccallqueue::theinstance = null;

asynccallqueue::asynccallqueue():thehead(null),thtail(null){};

// 使用head 和tail 建立鍊錶, head指向煉表頭, tail指向鍊錶尾部

// 插入時在尾部插入,使用asynccall thenext指標指向,然後tail 繼續向後移動。

void asynccallqueue::schedule(asynccall::pointer &call)

else

}bool asynccallqueue::fire()

return made; // 這裡只返回判斷頭是否為空

}// 呼叫頭部synccall物件的make 並把頭指標指向下乙個

void asynccallqueue::firenext()

// 單間物件獲取函式

asynccallqueue & asynccallqueue :: instance()

Koa2原始碼學習

koa 基於 node.js 平台的下一代 web 開發框架 const koa require koa do some thing 以上 構建了乙個簡單的伺服器,你可以在瀏覽器輸入 localhost 8080 來訪問 下面我們通過建立koa伺服器,且傳送一次http請求來了解原始碼 在koa例項...

學習筆記 解讀CppUnit原始碼2

上次我詳細的剖析了與test.h相互關聯的 test類是cppunit的核心。test這個類相信看了上一章就知道,也就起到測試用例的作用,但是畢竟乙個類的功能有限,如何擴充test類的功能呢?下面裝飾者模式就登場了。testdecorator.h 這個類中儲存了乙份test的指標,這個類的count...

Feign學習筆記2 原始碼解讀

spring cloud netflix feign,這個是feign的全名。spring官網上是沒有feign這個專案存在的,feign是作為netflix的乙個子專案存在。netflix包涵eureka zuul ribbon feign hystrix hystrix dashboard tu...