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