object.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. #include "__object.h"
  2. #include "__env.h"
  3. #include "tool.h"
  4. /* ObjectData 创建与释放 */
  5. static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *base_obj,
  6. af_Environment *env);
  7. static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Environment *env);
  8. /* ObjectData API 创建与释放 */
  9. static af_ObjectAPINode *makeObjectAPINode(DLC_SYMBOL(objectAPIFunc) func, char *api_name);
  10. static af_ObjectAPINode *freeObjectAPINode(af_ObjectAPINode *apin);
  11. static void freeAllObjectAPINode(af_ObjectAPINode *apin);
  12. /* ObjectData API 管理函数 */
  13. static af_ObjectAPINode *findObjectDataAPINode(char *api_name, af_ObjectData *od);
  14. static int addAPIToObjectData(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_ObjectData *od);
  15. /*
  16. * 函数名: makeObjectData_Pri
  17. * 目标: 创建ObjectData
  18. * 注意: af_ObjectData不是对外开放的结构体
  19. * 注意: api不能为NULL
  20. */
  21. static af_ObjectData * makeObjectData_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *base_obj,
  22. af_Environment *env){
  23. af_ObjectData *od = calloc(1, sizeof(af_ObjectData));
  24. od->base = base_obj;
  25. base_obj->data = od;
  26. od->id = strCopy(id == NULL ? "Unknown" : id);
  27. od->api = api;
  28. od->free_api = free_api;
  29. od->allow_inherit = allow_inherit;
  30. od->var_space = makeVarSpace(base_obj, 3, 2, 0, env);
  31. od->inherit = NULL;
  32. obj_getDataSize *func = findAPI("obj_getDataSize", api);
  33. obj_initData *init = findAPI("obj_initData", api);
  34. if (func != NULL)
  35. od->size = func(id, base_obj);
  36. else
  37. od->size = 0;
  38. if (od->size != 0) {
  39. od->data = calloc(1, od->size);
  40. if (init != NULL)
  41. init(id, base_obj, od->data, env);
  42. }
  43. gc_addObjectData(od, env);
  44. return od;
  45. }
  46. static af_Object *makeObject_Pri(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Environment *env){
  47. af_Object *obj = calloc(1, sizeof(af_Object));
  48. obj->belong = NULL;
  49. makeObjectData_Pri(id, free_api, api, allow_inherit, obj, env);
  50. pthread_rwlock_init(&obj->lock, NULL);
  51. gc_addObject(obj, env);
  52. return obj;
  53. }
  54. /*
  55. * 函数名: 创建一个object
  56. * 目标: 生成Object和ObjectData, 并且添加到gc链表中
  57. * 若处于初始化模式, 则belong, inherit等可以设置为NULL, 由后期统一填上
  58. */
  59. af_Object *makeObject(char *id, bool free_api, af_ObjectAPI *api, bool allow_inherit, af_Object *belong,
  60. af_Inherit *inherit, af_Environment *env) {
  61. if (api == NULL)
  62. return NULL;
  63. af_Inherit *ih = NULL;
  64. if (inherit != NULL)
  65. ih = inherit;
  66. else if (env->global != NULL) // init模式生成: global
  67. ih = makeInherit(env->global);
  68. else if (env->status != core_creat)
  69. return NULL;
  70. if (belong == NULL) {
  71. if (env->activity != NULL)
  72. belong = env->activity->belong;
  73. else if (env->status == core_init) // init模式生成: global
  74. belong = env->global;
  75. else if (env->status != core_creat) // 只有creat可以使用belong=NULL
  76. return NULL;
  77. }
  78. af_Object *obj = makeObject_Pri(id, free_api, api, allow_inherit, env);
  79. obj->belong = belong;
  80. obj->data->inherit = ih;
  81. return obj;
  82. }
  83. /*
  84. * 函数名: freeObjectDataData
  85. * 目标: 释放ObjectData的void *data, 仅GC函数可用
  86. * 对外API中, 创建对象的基本单位都是af_Object, 无法直接操控af_ObjectData
  87. */
  88. void freeObjectDataData(af_ObjectData *od, af_Environment *env) {
  89. if (od->size == 0)
  90. return;
  91. obj_destructData *func = findAPI("obj_destructData", od->api);
  92. if (func != NULL)
  93. func(od->id, od->base, od->data, env);
  94. od->size = 0;
  95. free(od->data);
  96. }
  97. /*
  98. * 函数名: freeObjectData
  99. * 目标: 释放ObjectData, 仅GC函数可用
  100. * 对外API中, 创建对象的基本单位都是af_Object, 无法直接操控af_ObjectData
  101. */
  102. void freeObjectData(af_ObjectData *od, af_Environment *env) {
  103. if (od->size != 0) {
  104. obj_destructData *func = findAPI("obj_destructData", od->api);
  105. if (func != NULL)
  106. func(od->id, od->base, od->data, env);
  107. }
  108. free(od->id);
  109. free(od->data);
  110. if (od->free_api)
  111. freeObjectAPI(od->api);
  112. freeAllInherit(od->inherit);
  113. GC_FREE_EXCHANGE(od, ObjectData, env);
  114. free(od);
  115. }
  116. void freeObject(af_Object *obj, af_Environment *env) {
  117. GC_FREE_EXCHANGE(obj, Object, env);
  118. pthread_rwlock_destroy(&obj->lock);
  119. free(obj);
  120. }
  121. void *getObjectData(af_Object *obj) {
  122. pthread_rwlock_rdlock(&obj->lock);
  123. void *data = obj->data->data;
  124. pthread_rwlock_unlock(&obj->lock);
  125. return data;
  126. }
  127. af_Object *getBelongObject(af_Object *object){
  128. pthread_rwlock_wrlock(&object->lock);
  129. af_Object *belong = (object->belong == NULL ? object : object->belong);
  130. pthread_rwlock_unlock(&object->lock);
  131. return belong;
  132. }
  133. af_Inherit *makeInherit(af_Object *obj) {
  134. if (!obj->data->allow_inherit)
  135. return NULL;
  136. obj_getShareVarSpace *func = findAPI("obj_getShareVarSpace", obj->data->api);
  137. af_VarSpace *vs = NULL;
  138. if (func == NULL || (vs = func(obj->data->id, obj)) == NULL)
  139. return NULL;
  140. af_Inherit *ih = calloc(1, sizeof(af_Inherit));
  141. ih->vs = vs;
  142. ih->obj = obj; // 调用API获取vs
  143. return ih;
  144. }
  145. af_Inherit **pushInherit(af_Inherit **base, af_Inherit *new) {
  146. while ((*base) != NULL)
  147. base = &((*base)->next);
  148. *base = new;
  149. while ((*base) != NULL)
  150. base = &((*base)->next);
  151. return base;
  152. }
  153. static af_Inherit *freeInherit(af_Inherit *ih) {
  154. af_Inherit *next = ih->next; // vs一定是被gc托管的
  155. free(ih);
  156. return next;
  157. }
  158. void freeAllInherit(af_Inherit *ih) {
  159. while (ih != NULL)
  160. ih = freeInherit(ih);
  161. }
  162. bool checkPosterity(af_Object *base, af_Object *posterity) {
  163. pthread_rwlock_rdlock(&posterity->lock);
  164. af_ObjectData *data = posterity->data;
  165. pthread_rwlock_unlock(&posterity->lock);
  166. pthread_rwlock_rdlock(&base->lock);
  167. for (af_Inherit *ih = base->data->inherit; ih != NULL; ih = ih->next) {
  168. if (ih->obj->data == data) {
  169. pthread_rwlock_unlock(&base->lock);
  170. return true;
  171. }
  172. }
  173. pthread_rwlock_unlock(&base->lock);
  174. return false;
  175. }
  176. static af_ObjectAPINode *makeObjectAPINode(DLC_SYMBOL(objectAPIFunc) func, char *api_name) {
  177. if (func == NULL)
  178. return NULL;
  179. af_ObjectAPINode *apin = calloc(1, sizeof(af_ObjectAPINode));
  180. apin->api = COPY_SYMBOL(func, objectAPIFunc);
  181. apin->name = strCopy(api_name);
  182. return apin;
  183. }
  184. static af_ObjectAPINode *freeObjectAPINode(af_ObjectAPINode *apin) {
  185. af_ObjectAPINode *next = apin->next;
  186. FREE_SYMBOL(apin->api);
  187. free(apin->name);
  188. free(apin);
  189. return next;
  190. }
  191. static void freeAllObjectAPINode(af_ObjectAPINode *apin) {
  192. while (apin != NULL)
  193. apin = freeObjectAPINode(apin);
  194. }
  195. af_ObjectAPI *makeObjectAPI(void) {
  196. af_ObjectAPI *api = calloc(1, sizeof(af_ObjectAPI));
  197. return api;
  198. }
  199. void freeObjectAPI(af_ObjectAPI *api) {
  200. for (int i = 0; i < API_HASHTABLE_SIZE; i++)
  201. freeAllObjectAPINode(api->node[i]);
  202. free(api);
  203. }
  204. /*
  205. * 函数名: addAPIToObjectData
  206. * 目标: 从DLC中获取函数并写入api
  207. * 若已存在api则返回0且不作修改
  208. * 若dlc中不存在指定函数则返回-1且不作修改
  209. * 操作成功返回1
  210. */
  211. int addAPI(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_ObjectAPI *api) {
  212. time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
  213. af_ObjectAPINode **pNode = &api->node[index];
  214. for (NULL; *pNode != NULL; pNode = &((*pNode)->next)) {
  215. if (EQ_STR((*pNode)->name, api_name))
  216. return 0;
  217. }
  218. *pNode = makeObjectAPINode(func, api_name);
  219. api->count++;
  220. return *pNode == NULL ? -1 : 1;
  221. }
  222. void *findAPI(char *api_name, af_ObjectAPI *api) {
  223. time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
  224. for (af_ObjectAPINode *node = api->node[index]; node != NULL; node = node->next) {
  225. if (EQ_STR(node->name, api_name))
  226. return GET_SYMBOL(node->api);
  227. }
  228. return NULL;
  229. }
  230. /*
  231. * 函数名: addAPIToObjectData
  232. * 目标: 从DLC中获取函数并写入api
  233. * 若已存在api则返回0且不作修改
  234. * 若dlc中不存在指定函数则返回-1且不作修改
  235. * 操作成功返回1
  236. */
  237. static int addAPIToObjectData(DLC_SYMBOL(objectAPIFunc) func, char *api_name,
  238. af_ObjectData *od) {
  239. time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
  240. af_ObjectAPINode **pNode = &od->api->node[index];
  241. for (NULL; *pNode != NULL; pNode = &((*pNode)->next)) {
  242. if (EQ_STR((*pNode)->name, api_name))
  243. return 0;
  244. }
  245. *pNode = makeObjectAPINode(func, api_name);
  246. od->api->count++;
  247. return *pNode == NULL ? -1 : 1;
  248. }
  249. static af_ObjectAPINode *findObjectDataAPINode(char *api_name, af_ObjectData *od) {
  250. time33_t index = time33(api_name) % API_HASHTABLE_SIZE;
  251. for (af_ObjectAPINode *node = od->api->node[index]; node != NULL; node = node->next) {
  252. if (EQ_STR(node->name, api_name))
  253. return node;
  254. }
  255. return NULL;
  256. }
  257. /*
  258. * 函数名: findObjectDataAPINode
  259. * 目标: 从DLC中获取函数并写入Object的API
  260. */
  261. int addAPIToObject(DLC_SYMBOL(objectAPIFunc) func, char *api_name, af_Object *obj) {
  262. pthread_rwlock_rdlock(&obj->lock);
  263. af_ObjectData *data = obj->data;
  264. pthread_rwlock_unlock(&obj->lock);
  265. return addAPIToObjectData(func, api_name, data);
  266. }
  267. /*
  268. * 函数名: findObjectAPI
  269. * 目标: 从Object中获取指定api的函数指针
  270. */
  271. void *findObjectAPI(char *api_name, af_Object *obj) {
  272. pthread_rwlock_rdlock(&obj->lock);
  273. af_ObjectData *data = obj->data;
  274. pthread_rwlock_unlock(&obj->lock);
  275. af_ObjectAPINode *node = findObjectDataAPINode(api_name, data);
  276. if (node == NULL)
  277. return NULL;
  278. return GET_SYMBOL(node->api);
  279. }
  280. af_Object *findObjectAttributes(char *name, af_Object *visitor, af_Object *obj) {
  281. pthread_rwlock_rdlock(&obj->lock);
  282. af_ObjectData *data = obj->data;
  283. pthread_rwlock_unlock(&obj->lock);
  284. af_Var *var = findVarFromVarSpace(name, visitor, data->var_space);
  285. if (var != NULL)
  286. return findVarNode(var, NULL);
  287. for (af_Inherit *ih = data->inherit; ih != NULL; ih = ih->next) {
  288. var = findVarFromVarSpace(name, visitor, ih->vs); // 搜索共享变量空间
  289. if (var != NULL)
  290. return findVarNode(var, NULL);
  291. }
  292. return NULL;
  293. }
  294. bool setObjectAttributes(char *name, char p_self, char p_posterity, char p_external, af_Object *attributes,
  295. af_Object *obj, af_Object *visitor, af_Environment *env){
  296. pthread_rwlock_rdlock(&obj->lock);
  297. af_ObjectData *data = obj->data;
  298. pthread_rwlock_unlock(&obj->lock);
  299. return makeVarToVarSpace(name, p_self, p_posterity, p_external, attributes, data->var_space, visitor, env);
  300. }
  301. af_Object *findObjectAttributesByObjectData(char *name, af_Object *visitor, af_ObjectData *od) {
  302. af_Var *var = findVarFromVarSpace(name, visitor, od->var_space);
  303. if (var != NULL)
  304. return findVarNode(var, NULL);
  305. for (af_Inherit *ih = od->inherit; ih != NULL; ih = ih->next) {
  306. var = findVarFromVarSpace(name, visitor, ih->vs); // 搜索共享变量空间
  307. if (var != NULL)
  308. return findVarNode(var, NULL);
  309. }
  310. return NULL;
  311. }
  312. char *getObjectID(af_Object *obj) {
  313. pthread_rwlock_rdlock(&obj->lock);
  314. af_ObjectData *data = obj->data;
  315. pthread_rwlock_unlock(&obj->lock);
  316. return data->id;
  317. }
  318. af_ObjectAPI *getObjectAPI(af_Object *obj) {
  319. pthread_rwlock_rdlock(&obj->lock);
  320. af_ObjectData *data = obj->data;
  321. pthread_rwlock_unlock(&obj->lock);
  322. return data->api;
  323. }
  324. af_Inherit *getObjectInherit(af_Object *obj) {
  325. pthread_rwlock_rdlock(&obj->lock);
  326. af_ObjectData *data = obj->data;
  327. pthread_rwlock_unlock(&obj->lock);
  328. return data->inherit;
  329. }
  330. af_VarSpace *getObjectVarSpace(af_Object *obj) {
  331. pthread_rwlock_rdlock(&obj->lock);
  332. af_ObjectData *data = obj->data;
  333. pthread_rwlock_unlock(&obj->lock);
  334. return data->var_space;
  335. }
  336. af_Inherit *getInheritNext(af_Inherit *ih) {
  337. return ih->next;
  338. }
  339. af_Object *getInheritObject(af_Inherit *ih) {
  340. return ih->obj;
  341. }
  342. af_VarSpace *getInheritVarSpace(af_Inherit *ih) {
  343. return ih->vs;
  344. }
  345. ObjAPIUint getAPICount(af_ObjectAPI *api) {
  346. return api->count;
  347. }
  348. void objectSetAllowInherit(af_Object *obj, bool allow) {
  349. pthread_rwlock_rdlock(&obj->lock);
  350. af_ObjectData *data = obj->data;
  351. pthread_rwlock_unlock(&obj->lock);
  352. data->allow_inherit = allow;
  353. }