当前位置: 首页 > news >正文

南京网站设计制作公司排名榜视频分享网站建设难吗

南京网站设计制作公司排名榜,视频分享网站建设难吗,大画册设计网站,推荐专业做网站公司接前一篇文章#xff1a;QEMU源码全解析24 —— QOM介绍#xff08;13#xff09; 本文内容参考#xff1a; 《趣谈Linux操作系统》 —— 刘超#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强#xff0c;机械工业出版社 特此致谢#xff01; 本文开始对于…接前一篇文章QEMU源码全解析24 —— QOM介绍13 本文内容参考 《趣谈Linux操作系统》 —— 刘超极客时间 《QEMU/KVM》源码解析与应用 —— 李强机械工业出版社 特此致谢 本文开始对于属性ObjectProperty进行深入讲解。 ObjectProperty结构在include/qom/object.h中定义代码如下 typedef struct ObjectProperty ObjectProperty;……struct ObjectProperty {char *name;char *type;char *description;ObjectPropertyAccessor *get;ObjectPropertyAccessor *set;ObjectPropertyResolve *resolve;ObjectPropertyRelease *release;ObjectPropertyInit *init;void *opaque;QObject *defval; }; 其中 name表示名字type表示属性的类型。如有的属性是字符串有的是bool类型有的是link等其它更复杂的类型description表示对于属性的描述get对属性进行获取set对属性进行设置resolve对属性进行操作release对属性进行释放opaque指向一个具体的属性如BoolProperty等。 每一种具体的属性都会有一个结构体来描述它。例如表示布尔类型的属性的BoolProperty、表示字符串类型的属性的StringProperty以及表示link类型的属性的LinkProperty。三者都在qom/object.c中定义不挨着定义分别如下 typedef struct {union {Object **targetp;Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer */ptrdiff_t offset; /* if OBJ_PROP_LINK_CLASS */};void (*check)(const Object *, const char *, Object *, Error **);ObjectPropertyLinkFlags flags; } LinkProperty;……typedef struct StringProperty {char *(*get)(Object *, Error **);void (*set)(Object *, const char *, Error **); } StringProperty;……typedef struct BoolProperty {bool (*get)(Object *, Error **);void (*set)(Object *, bool, Error **); } BoolProperty;总结一下Object、ObjectProperty和各个具体属性的关系 Objectstruct object- GHashTable *properties中存放着属性名到ObjectPropertystruct ObjectProperty的映射。ObjectProperty - void *opaque指向一个具体的属性。 下边介绍几个属性的操作接口。属性的添加分为类属性的添加和对象属性的添加。 对于对象属性来说其属性添加是通过object_property_add接口完成的。object_property_add函数在qom/object.c中代码如下 ObjectProperty * object_property_add(Object *obj, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque) {return object_property_try_add(obj, name, type, get, set, release,opaque, error_abort); } 该函数实际上是object_property_try_add函数的简单封装object_property_try_add函数就在上边代码如下 ObjectProperty * object_property_try_add(Object *obj, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque, Error **errp) {ObjectProperty *prop;size_t name_len strlen(name);if (name_len 3 !memcmp(name name_len - 3, [*], 4)) {int i;ObjectProperty *ret NULL;char *name_no_array g_strdup(name);name_no_array[name_len - 3] \0;for (i 0; i INT16_MAX; i) {char *full_name g_strdup_printf(%s[%d], name_no_array, i);ret object_property_try_add(obj, full_name, type, get, set,release, opaque, NULL);g_free(full_name);if (ret) {break;}}g_free(name_no_array);assert(ret);return ret;}if (object_property_find(obj, name) ! NULL) {error_setg(errp, attempt to add duplicate property %s to object (type %s),name, object_get_typename(obj));return NULL;}prop g_malloc0(sizeof(*prop));prop-name g_strdup(name);prop-type g_strdup(type);prop-get get;prop-set set;prop-release release;prop-opaque opaque;g_hash_table_insert(obj-properties, prop-name, prop);return prop; }先不管通配符的情况即if (name_len 3 !memcmp(name name_len - 3, [*], 4)) 条件判断中的内容直接跳过往下看。首先调用object_property_find函数来确认所插入的属性是否已经存在。如果已存在则报错返回确保不会添加重复的属性。 随后分配一个ObjectProperty结构并使用函数参数进行初始化。代码片段如下 prop g_malloc0(sizeof(*prop));prop-name g_strdup(name);prop-type g_strdup(type);prop-get get;prop-set set;prop-release release;prop-opaque opaque; 最后调用以下代码将其插入到对象的properties域中并返回此prop g_hash_table_insert(obj-properties, prop-name, prop); 返回头来看一下object_property_find函数的具体实现。object_property_find函数在同文件qom/object.c中代码如下 ObjectProperty *object_property_find(Object *obj, const char *name) {ObjectProperty *prop;ObjectClass *klass object_get_class(obj);prop object_class_property_find(klass, name);if (prop) {return prop;}return g_hash_table_lookup(obj-properties, name); }​ 此函数首先调用object_get_class函数由Object结构对象的指针obj得到ObjectClass对象的指针kclass。object_get_class函数在qom/object.c中代码如下 ObjectClass *object_get_class(Object *obj) {return obj-class; } 然后调用object_class_property_find函数以确认自己所属的类以及所有父类都不存在这个属性。object_class_property_find函数同样在qom/object.c中代码如下 ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name) {ObjectClass *parent_klass;parent_klass object_class_get_parent(klass);if (parent_klass) {ObjectProperty *prop object_class_property_find(parent_klass, name);if (prop) {return prop;}}return g_hash_table_lookup(klass-properties, name); } 最后在遍历递归完所有父类之后调用g_hash_table_lookup(obj-properties, name);在自己的域中查找。 欲知后事如何且看下回分解。
http://www.hkea.cn/news/14586543/

相关文章:

  • 利用百度图片做网站外链传智播客培训机构官网
  • 电子商务网站建设哪家好免费咨询医生妇科医生
  • 长沙专业做网站公司有哪些排名好的手机网站建设
  • wordpress建站免费教程湛江论坛
  • 网站服务器做下载链接国际网站卖东西怎么做
  • 上海高端建站wordpress进度条源码
  • 网站的自动登录是怎么做的品牌网站设计
  • 网站title是什么意思北京住房城乡建设网站
  • 裕顺网站建设广州市住房城乡建设局网站
  • 东营有什么网站建设公司怎么给餐饮店做网站
  • 江宁做网站价格广告代理商是什么意思
  • 网站系统的软件和硬件接口个人网站对应网站网址
  • 中国建设银行网站忘记密码怎么办wordpress添加一言
  • 个人做门户网站爬黄山旅游攻略游览路线
  • 网站推广技巧wordpress如何设置导航
  • 辽宁省品牌建设促进会网站承德市住房和城乡建设局网站
  • 面包屑 网站做电影网站只放链接算侵权吗
  • 东莞高端商城网站制作网站如何做广告
  • 手机网站如何生成app贵阳网站开发报价
  • 百度公司做网站优化多少钱阿里巴巴网站的功能
  • 最火的做牛排沙拉网站泉州排名推广
  • 网站推广方案怎么写的谷歌推广
  • 旅店网站建设规划书wordpress如何适配手机
  • 潍坊网站建设小程序网络设计是不是艺术类
  • 腾讯云网站模板盘锦seo网站建设
  • 广州网站建设开发公司网站开发类标书报价明细表
  • 百度推广需要手机网站做百度竞价对网站有无要求
  • 如何在一个地方建设网站wordpress去版权
  • 机械类 网站源码如何将自己做的网站传到网上
  • 网站子页面设计html5网站制作软件