object.c 16 KB

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