ceph 對動態載入類的管理

2021-08-19 19:33:12 字數 2514 閱讀 8935

ceph提供了乙個classhandler來管理動態鏈結庫

使用classhandler 之前必要要先註冊

classhandler::classdata *classhandler::register_class(const char *cname)

return cls;

}繼續看_get_class

classhandler::classdata *classhandler::_get_class(const string& cname,

bool check_allowed)

else

#正常情況下應該走下面這段code 會新建乙個classdata.

cls = &classes[cname];

ldout(cct, 10) << "_get_class adding new class name " << cname << " " << cls << dendl;

cls->name = cname;

cls->handler = this;

cls->whitelisted = in_class_list(cname, cct->_conf->osd_class_default_list);

} return cls;

}註冊類後要為這個類註冊方法

classhandler::classmethod *classhandler::classdata::register_method(const char *mname,

int flags,

cls_method_call_t func)

ldout(handler->cct, 10) << "register_method " << name << "." << mname << " flags " << flags << " " << (void*)func << dendl;

classmethod& method = methods_map[mname];

method.func = func;

method.name = mname;

method.flags = flags;

method.cls = this;

return &method;

}可以看到基本是為method賦值

當使用的時候要呼叫open_class來dlopen動態鏈結庫

int classhandler::open_class(const string& cname, classdata **pcls)

*pcls = cls;

return 0;

}int classhandler::_load_class(classdata *cls)

else

cls->status = classdata::class_missing;

return r;

}#如果這個class 依賴其他class,則統計這些依賴類

cls_deps_t *(*cls_deps)();

cls_deps = (cls_deps_t *(*)())dlsym(cls->handle, "class_deps");

if (cls_deps)

}} // resolve dependencies

#統一load這些依賴類

set::iterator p = cls->missing_dependencies.begin();

while (p != cls->missing_dependencies.end())

ldout(cct, 10) << "_load_class " << cls->name << " satisfied dependency " << dc->name << dendl;

cls->missing_dependencies.erase(p++);

} 開啟這個類後就可以呼叫exec 來執行這個類的方法

int classhandler::classmethod::exec(cls_method_context_t ctx, bufferlist& indata, bufferlist& outdata)

else

} return ret;

}下來看乙個編寫helloworld的例子

static int say_hello(cls_method_context_t hctx, bufferlist *in, bufferlist *out)

/** * initialize class

* * we do two things here: we register the new class, and then register

* all of the class's methods.

*/cls_init(hello)

ceph為了方便大家提供了乙個套更簡答的api,例如本例中的cls_register

int cls_register(const char *name, cls_handle_t *handle)

對樹的動態載入

對樹的動態載入是因為樹的內容是不固定的,允許使用者可以對樹進行增刪改。這樣就直接涉及到了資料庫。對資料庫的設計有的就放一張表裡,有的有幾個level就放幾張表裡面,這就隨便你了,怎麼把資料從資料庫中提出來,我也不介紹了。現在是資料已經提出。我是將資料從庫中提出放到dataread中的。private...

類的動態載入 2

1.通過new建立物件是靜態載入,如圖一,假如此時word類和excel類並不存在,office類是不可以通過編譯的,再假如乙個類中要對很多類進行例項化,都是通過new例項化的,那麼,但凡有乙個類出問題了,那麼整個大類就不會通過編譯。2.如圖二,我們使用的是動態載入類的方法,在編譯此類時,並不會載入...

動態載入類(動態載入DLL檔案) zz

本人剛剛開始編寫程式不久,開發中發現一非常好的方法。大家共享。我們在編寫程式的時候經常會遇到這樣的情況 程式中要用到某種計算,而且這種計算的計算方式很多,我們不得不在編寫程式時就要考慮的十分全面,將各種情況到考慮到。但是這樣做又非常的費力,因為我們無法 到程式編好後,還會出現什麼樣的計算方式。如果計...