object.cpp 15 KB

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