var.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. #include "__var.h"
  2. #include "core_init.h"
  3. #include "tool.h"
  4. /* VarNode 创建与释放 */
  5. static af_VarNode *makeVarNode(af_Object *obj, char *id);
  6. static af_VarNode *freeVarNode(af_VarNode *vn);
  7. static void freeAllVarNode(af_VarNode *vn);
  8. /* VarNode 相关操作 */
  9. static af_VarNode *findVarNode_(af_Var *var, char *id);
  10. /* VarCup 创建与释放 */
  11. static af_VarCup *makeVarCup(af_Var *var);
  12. static af_VarCup *freeVarCup(af_VarCup *vp);
  13. static void freeAllVarCup(af_VarCup *vp);
  14. /* VarSpace 寻值函数 */
  15. static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpace *vs);
  16. /* 变量权限函数 */
  17. static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
  18. static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs);
  19. static af_VarNode *makeVarNode(af_Object *obj, char *id) {
  20. af_VarNode *vn = calloc(1, sizeof(af_VarNode));
  21. if (id != NULL)
  22. vn->id = strCopy(id);
  23. vn->obj = obj;
  24. return vn;
  25. }
  26. static af_VarNode *freeVarNode(af_VarNode *vn) {
  27. af_VarNode *next = vn->next;
  28. free(vn->id);
  29. free(vn);
  30. return next;
  31. }
  32. static void freeAllVarNode(af_VarNode *vn) {
  33. while (vn != NULL)
  34. vn = freeVarNode(vn);
  35. }
  36. af_Var *makeVar(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env){
  37. pthread_mutex_lock(&env->base->gc_factory->mutex);
  38. af_VarNode *vn = makeVarNode(obj, NULL);
  39. af_Var *var = calloc(1, sizeof(af_Var));
  40. var->name = strCopy(name);
  41. var->vn = vn;
  42. var->permissions[0] = p_self;
  43. var->permissions[1] = p_posterity;
  44. var->permissions[2] = p_external;
  45. pthread_rwlock_init(&var->lock, NULL);
  46. gc_addVar(var, env->base);
  47. pthread_mutex_unlock(&env->base->gc_factory->mutex);
  48. return var;
  49. }
  50. void freeVar(af_Var *var, af_Environment *env){
  51. freeAllVarNode(var->vn);
  52. free(var->name);
  53. gc_delVar(var, env);
  54. pthread_rwlock_destroy(&var->lock);
  55. free(var);
  56. }
  57. /**
  58. * 查找指定名字的VarNode
  59. * 内部函数, 无锁
  60. * @param var
  61. * @param id
  62. * @return
  63. */
  64. static af_VarNode *findVarNode_(af_Var *var, char *id) {
  65. af_VarNode *vn = var->vn->next;
  66. if (id == NULL)
  67. return var->vn;
  68. for (NULL; vn != NULL; vn = vn->next) {
  69. if (EQ_STR(vn->id, id))
  70. return vn;
  71. }
  72. return NULL;
  73. }
  74. void addVarNode(af_Var *var, af_Object *obj, char *id) {
  75. af_VarNode *vn = makeVarNode(obj, id);
  76. pthread_rwlock_wrlock(&var->lock);
  77. vn->next = var->vn->next; // 第一个 vn 必须为 id=NULL
  78. var->vn->next = vn;
  79. pthread_rwlock_unlock(&var->lock);
  80. }
  81. /**
  82. * 查找指定名字的VarNode
  83. * 外部函数, 带锁
  84. * 返回值自动添加 gc_addReference
  85. * @param var
  86. * @param id
  87. * @return
  88. */
  89. af_Object *findVarNode(af_Var *var, char *id, af_Environment *env){
  90. pthread_rwlock_rdlock(&var->lock);
  91. af_VarNode *vn = findVarNode_(var, id);
  92. af_Object *obj = NULL;
  93. if (vn != NULL) {
  94. obj = vn->obj;
  95. gc_addReference(obj, env);
  96. }
  97. pthread_rwlock_unlock(&var->lock);
  98. return obj;
  99. }
  100. static af_VarCup *makeVarCup(af_Var *var) {
  101. af_VarCup *vp = calloc(1, sizeof(af_VarCup));
  102. vp->var = var;
  103. return vp;
  104. }
  105. static af_VarCup *freeVarCup(af_VarCup *vp) {
  106. af_VarCup *next = vp->next;
  107. free(vp);
  108. return next;
  109. }
  110. static void freeAllVarCup(af_VarCup *vp) {
  111. while (vp != NULL)
  112. vp = freeVarCup(vp);
  113. }
  114. af_VarSpace *makeVarSpace(af_Object *belong, char p_self, char p_posterity, char p_external, af_Environment *env){
  115. assertFatalErrorLog(getCoreStatus(env) == core_creat || belong != NULL, aFunCoreLogger, 1, "makeVarSpace error");
  116. pthread_mutex_lock(&env->base->gc_factory->mutex);
  117. af_VarSpace *vs = calloc(1, sizeof(af_VarSpace));
  118. vs->belong = belong;
  119. vs->permissions[0] = p_self;
  120. vs->permissions[1] = p_posterity;
  121. vs->permissions[2] = p_external;
  122. pthread_rwlock_init(&vs->lock, NULL);
  123. gc_addVarSpace(vs, env->base);
  124. pthread_mutex_unlock(&env->base->gc_factory->mutex);
  125. return vs;
  126. }
  127. void freeVarSpace(af_VarSpace *vs, af_Environment *env) {
  128. for (int i = 0; i < VAR_HASHTABLE_SIZE; i++)
  129. freeAllVarCup(vs->var[i]);
  130. gc_delVarSpace(vs, env);
  131. pthread_rwlock_destroy(&vs->lock);
  132. free(vs);
  133. }
  134. af_VarSpaceListNode *makeVarSpaceList(af_VarSpace *vs) {
  135. af_VarSpaceListNode *vsl = calloc(1, sizeof(af_VarSpaceListNode));
  136. vsl->vs = vs;
  137. return vsl;
  138. }
  139. af_VarSpaceListNode *copyVarSpaceList(af_VarSpaceListNode *vsl) {
  140. af_VarSpaceListNode *base = NULL;
  141. af_VarSpaceListNode **pvsl = &base;
  142. for (NULL; vsl != NULL; vsl = vsl->next, pvsl = &((*pvsl)->next))
  143. *pvsl = makeVarSpaceList(vsl->vs);
  144. return base;
  145. }
  146. static af_VarSpaceListNode *freeVarSpaceList(af_VarSpaceListNode *vsl){
  147. af_VarSpaceListNode *next = vsl->next;
  148. free(vsl);
  149. return next;
  150. }
  151. void freeAllVarSpaceList(af_VarSpaceListNode *vsl){
  152. while (vsl != NULL)
  153. vsl = freeVarSpaceList(vsl);
  154. }
  155. af_VarSpace *getVarSpaceFromList(af_VarSpaceListNode *vsl) {
  156. if (vsl != NULL)
  157. return vsl->vs;
  158. return NULL;
  159. }
  160. bool freeVarSpaceListCount(size_t count, af_VarSpaceListNode *vsl) {
  161. for (size_t i = count; i > 0; i--) {
  162. if (vsl == NULL) // 发生了错误
  163. return false;
  164. vsl = freeVarSpaceList(vsl);
  165. }
  166. return true;
  167. }
  168. /**
  169. * 检查访问者是否有定义变量的权限
  170. * 注意: 无锁, 由调用者加锁
  171. * @param visitor 访问者
  172. * @param vs 变量空间
  173. */
  174. static bool checkVarSpaceDefinePermissions(af_Object *visitor, af_VarSpace *vs){
  175. char p = vs->permissions[2]; // 默认外部权限
  176. af_ObjectData *belong_data = NULL;
  177. if (vs->belong != NULL) {
  178. pthread_rwlock_rdlock(&vs->belong->lock);
  179. belong_data = vs->belong->data;
  180. pthread_rwlock_unlock(&vs->belong->lock);
  181. }
  182. af_ObjectData *visitor_data = NULL;
  183. if (visitor != NULL) {
  184. pthread_rwlock_rdlock(&visitor->lock);
  185. visitor_data = visitor->data;
  186. pthread_rwlock_unlock(&visitor->lock);
  187. }
  188. if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
  189. p = vs->permissions[0];
  190. else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
  191. p = vs->permissions[1];
  192. return p == 2 || p == 3;
  193. }
  194. /**
  195. * 把var添加到VarSpace中
  196. * 注意: Var必须添加 gc_addReference
  197. * @param var 变量
  198. * @param visitor 访问者
  199. * @param vs 变量空间
  200. * @return 若空间被保护, 权限错误或已存在同名Var则返回false不作修改 否则返回true
  201. */
  202. bool addVarToVarSpace(af_Var *var, af_Object *visitor, af_VarSpace *vs, af_Environment *env){
  203. pthread_rwlock_rdlock(&var->lock);
  204. pthread_rwlock_wrlock(&vs->lock);
  205. time33_t index = time33(var->name) % VAR_HASHTABLE_SIZE;
  206. af_VarCup **pCup = &vs->var[index];
  207. if (vs->is_protect)
  208. goto RETURN_FALSE;
  209. if (!checkVarSpaceDefinePermissions(visitor, vs))
  210. goto RETURN_FALSE;
  211. for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
  212. pthread_rwlock_wrlock(&(*pCup)->var->lock);
  213. bool res = EQ_STR((*pCup)->var->name, var->name);
  214. pthread_rwlock_unlock(&(*pCup)->var->lock);
  215. if (res)
  216. goto RETURN_FALSE;
  217. }
  218. *pCup = makeVarCup(var);
  219. pthread_rwlock_unlock(&vs->lock);
  220. pthread_rwlock_unlock(&var->lock);
  221. gc_delReference(var, env);
  222. return true;
  223. RETURN_FALSE:
  224. pthread_rwlock_unlock(&vs->lock);
  225. pthread_rwlock_unlock(&var->lock);
  226. return false;
  227. }
  228. /**
  229. * 创建一个新的var添加到VarSpace中
  230. * 若已存在同名Var则返回false不作修改
  231. * 否则返回true
  232. * 调用 addVarToVarSpace
  233. * 注意: 必须保证 VarSpace被 gc 引用
  234. */
  235. bool makeVarToVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_VarSpace *vs,
  236. af_Object *visitor, af_Environment *env){
  237. af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
  238. if (addVarToVarSpace(var, visitor, vs, env))
  239. return true;
  240. gc_delReference(var, env);
  241. return false;
  242. }
  243. /*
  244. * 函数名: makeVarToVarSpace
  245. * 目标: 添加一个Var到VarSpaceList
  246. * 自动跳过保护空间
  247. * 调用 addVarToVarSpace
  248. */
  249. bool addVarToVarSpaceList(af_Var *var, af_Object *visitor, af_VarSpaceListNode *vsl, af_Environment *env){
  250. for (NULL; vsl != NULL; vsl = vsl->next) {
  251. if (!vsl->vs->is_protect)
  252. return addVarToVarSpace(var, visitor, vsl->vs, env);
  253. }
  254. return false;
  255. }
  256. /**
  257. * 创建一个新的var到VarSpaceList
  258. * 自动跳过保护空间
  259. * 调用 addVarToVarSpaceList -> addVarToVarSpace
  260. * 注意: 必须保证 VarSpace被 gc 引用
  261. */
  262. bool makeVarToVarSpaceList(char *name, char p_self, char p_posterity, char p_external, af_Object *obj,
  263. af_VarSpaceListNode *vsl, af_Object *visitor, af_Environment *env){
  264. af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
  265. if (addVarToVarSpaceList(var, visitor, vsl, env))
  266. return true;
  267. gc_delReference(var, env);
  268. return false;
  269. }
  270. /**
  271. * 创建一个新的var变量添加到保护空间中
  272. * 若已存在同名Var则返回false不作修改
  273. * 否则返回true
  274. * 调用 addVarToVarSpace
  275. */
  276. bool makeVarToProtectVarSpace(char *name, char p_self, char p_posterity, char p_external, af_Object *obj, af_Environment *env){
  277. pthread_rwlock_wrlock(&env->protect->lock);
  278. bool is_protect = env->protect->is_protect;
  279. env->protect->is_protect = false;
  280. pthread_rwlock_unlock(&env->protect->lock);
  281. af_Var *var = makeVar(name, p_self, p_posterity, p_external, obj, env);
  282. bool re = addVarToVarSpace(var, env->activity->belong,
  283. env->protect, env);
  284. if (!re)
  285. gc_delReference(var, env);
  286. pthread_rwlock_wrlock(&env->protect->lock);
  287. env->protect->is_protect = is_protect;
  288. pthread_rwlock_unlock(&env->protect->lock);
  289. return re;
  290. }
  291. /*
  292. * 函数名: addVarToProtectVarSpace
  293. * 目标: 添加一个var变量添加到保护空间中 (Var需要提前gc_addReference)
  294. * 若已存在同名Var则返回false不作修改
  295. * 否则返回true
  296. * 调用 addVarToVarSpace
  297. */
  298. bool addVarToProtectVarSpace(af_Var *var, af_Environment *env) {
  299. pthread_rwlock_wrlock(&env->protect->lock);
  300. bool is_protect = env->protect->is_protect;
  301. env->protect->is_protect = false;
  302. pthread_rwlock_unlock(&env->protect->lock);
  303. bool re = addVarToVarSpace(var, NULL, env->protect, env);
  304. pthread_rwlock_wrlock(&env->protect->lock);
  305. env->protect->is_protect = is_protect;
  306. pthread_rwlock_unlock(&env->protect->lock);
  307. return re;
  308. }
  309. /**
  310. * 检查访问者是否有删除变量的权限
  311. * 注意: 无锁, 由调用者加锁
  312. * @param visitor 访问者
  313. * @param vs 变量空间
  314. * @return
  315. */
  316. static bool checkVarSpaceDelPermissions(af_Object *visitor, af_VarSpace *vs) {
  317. char p = vs->permissions[2]; // 默认外部权限
  318. af_ObjectData *belong_data = NULL;
  319. if (vs->belong != NULL) {
  320. pthread_rwlock_rdlock(&vs->belong->lock);
  321. belong_data = vs->belong->data;
  322. pthread_rwlock_unlock(&vs->belong->lock);
  323. }
  324. af_ObjectData *visitor_data = NULL;
  325. if (visitor != NULL) {
  326. pthread_rwlock_rdlock(&visitor->lock);
  327. visitor_data = visitor->data;
  328. pthread_rwlock_unlock(&visitor->lock);
  329. }
  330. if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
  331. p = vs->permissions[0];
  332. else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
  333. p = vs->permissions[1];
  334. return p == 1 || p == 3;
  335. }
  336. /*
  337. * 函数名: delVarFromVarSpace
  338. * 目标: 从VarSpace中删除指定的变量
  339. * 若空间被保护, 权限错误或已存在同名Var则返回false不作修改
  340. * 否则返回true
  341. */
  342. bool delVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs) {
  343. time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
  344. pthread_rwlock_wrlock(&vs->lock);
  345. af_VarCup **pCup = &vs->var[index];
  346. if (vs->is_protect)
  347. goto RETRUN_FALSE;
  348. if (!checkVarSpaceDelPermissions(visitor, vs))
  349. goto RETRUN_FALSE;
  350. for (NULL; *pCup != NULL; pCup = &((*pCup)->next)) {
  351. pthread_rwlock_wrlock(&(*pCup)->var->lock);
  352. if (EQ_STR((*pCup)->var->name, name)) {
  353. *pCup = freeVarCup(*pCup);
  354. pthread_rwlock_unlock(&(*pCup)->var->lock);
  355. pthread_rwlock_unlock(&vs->lock);
  356. return true;
  357. }
  358. pthread_rwlock_unlock(&(*pCup)->var->lock);
  359. }
  360. RETRUN_FALSE:
  361. pthread_rwlock_unlock(&vs->lock);
  362. return false;
  363. }
  364. /*
  365. * 函数名: delVarFromVarList
  366. * 目标: 从VarSpaceList中第一层的VarSpace中删除指定的变量
  367. * 若空间被保护, 权限错误或已存在同名Var则返回false不作修改
  368. * 否则返回true
  369. * 调用delVarFromVarSpace
  370. */
  371. bool delVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl) {
  372. return delVarFromVarSpace(name, visitor, vsl->vs);
  373. }
  374. /*
  375. * 函数名: findVarFromVarSpaceByIndex
  376. * 目标: 根据指定的index, 在VarSpace中搜索var
  377. * 权限检查交给 findVarFromVarSpace 和 findVarFromVarList
  378. */
  379. static af_Var *findVarFromVarSpaceByIndex(time33_t index, char *name, af_VarSpace *vs) {
  380. pthread_rwlock_rdlock(&vs->lock);
  381. for (af_VarCup *cup = vs->var[index]; cup != NULL; cup = cup->next) {
  382. pthread_rwlock_wrlock(&cup->var->lock);
  383. if (EQ_STR(cup->var->name, name)) {
  384. af_Var *var = cup->var;
  385. pthread_rwlock_unlock(&cup->var->lock);
  386. pthread_rwlock_unlock(&vs->lock);
  387. return var;
  388. }
  389. pthread_rwlock_unlock(&cup->var->lock);
  390. }
  391. pthread_rwlock_unlock(&vs->lock);
  392. return NULL;
  393. }
  394. /**
  395. * 检查访问者是否有读取变量的权限
  396. * 注意: 会给VarSpace和Var加读锁
  397. * @param var 变量
  398. * @param visitor 访问者
  399. * @param vs 变量空间
  400. * @return 返回是否具有读取权限
  401. */
  402. static bool checkVarReadPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
  403. char p = var->permissions[2]; // 默认外部权限
  404. pthread_rwlock_rdlock(&vs->lock);
  405. pthread_rwlock_rdlock(&var->lock);
  406. af_ObjectData *belong_data = NULL;
  407. if (vs->belong != NULL) {
  408. pthread_rwlock_rdlock(&vs->belong->lock);
  409. belong_data = vs->belong->data;
  410. pthread_rwlock_unlock(&vs->belong->lock);
  411. }
  412. af_ObjectData *visitor_data = NULL;
  413. if (visitor != NULL) {
  414. pthread_rwlock_rdlock(&visitor->lock);
  415. visitor_data = visitor->data;
  416. pthread_rwlock_unlock(&visitor->lock);
  417. }
  418. if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
  419. p = var->permissions[0];
  420. else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
  421. p = var->permissions[1];
  422. pthread_rwlock_unlock(&vs->lock);
  423. pthread_rwlock_unlock(&var->lock);
  424. return p == 1 || p == 3;
  425. }
  426. /*
  427. * 函数名: findVarFromVarSpace
  428. * 目标: 在VarSpace中搜索var
  429. * 调用: findVarFromVarSpaceByIndex
  430. */
  431. af_Var *findVarFromVarSpace(char *name, af_Object *visitor, af_VarSpace *vs){
  432. af_Var *var = findVarFromVarSpaceByIndex(time33(name) % VAR_HASHTABLE_SIZE, name, vs);
  433. if (var == NULL)
  434. return NULL;
  435. if (checkVarReadPermissions(var, visitor, vs))
  436. return var;
  437. return NULL;
  438. }
  439. /*
  440. * 函数名: findVarFromVarList
  441. * 目标: 在VarSpaceListNode中搜索var
  442. * 调用: findVarFromVarSpaceByIndex
  443. */
  444. af_Var *findVarFromVarList(char *name, af_Object *visitor, af_VarSpaceListNode *vsl) {
  445. time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
  446. af_Var *var = NULL;
  447. for (NULL; vsl != NULL; vsl = vsl->next) {
  448. var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
  449. if (var != NULL) {
  450. if (checkVarReadPermissions(var, visitor, vsl->vs))
  451. return var;
  452. return NULL;
  453. }
  454. }
  455. return NULL;
  456. }
  457. /**
  458. * 检查访问者是否有改写变量的权限
  459. * 注意: 不会给VarList加锁, 给Var加读锁, 由调用者加锁
  460. * @param var 变量
  461. * @param visitor 访问者
  462. * @param vs 变量空间
  463. * @return
  464. */
  465. static bool checkVarWritePermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs){
  466. char p = var->permissions[2]; // 默认外部权限
  467. af_ObjectData *belong_data = NULL;
  468. if (vs->belong != NULL) {
  469. pthread_rwlock_rdlock(&vs->belong->lock);
  470. belong_data = vs->belong->data;
  471. pthread_rwlock_unlock(&vs->belong->lock);
  472. }
  473. af_ObjectData *visitor_data = NULL;
  474. if (visitor != NULL) {
  475. pthread_rwlock_rdlock(&visitor->lock);
  476. visitor_data = visitor->data;
  477. pthread_rwlock_unlock(&visitor->lock);
  478. }
  479. pthread_rwlock_rdlock(&vs->lock);
  480. if (vs->belong == NULL || (visitor != NULL && belong_data == visitor_data)) // (无权限设定或ObjectData匹配) 应用自身权限
  481. p = var->permissions[0];
  482. else if (visitor != NULL && checkPosterity(vs->belong, visitor)) // 应用后代权限
  483. p = var->permissions[1];
  484. pthread_rwlock_unlock(&vs->lock);
  485. return p == 2 || p == 3;
  486. }
  487. /*
  488. * 函数名: setVarToVarSpace
  489. * 目标: 在VarSpace中搜索var并修改其值
  490. * 调用: findVarFromVarSpaceByIndex
  491. */
  492. bool setVarToVarSpace(char *name, af_Object *obj, af_Object *visitor, af_VarSpace *vs){
  493. af_Var *var = findVarFromVarSpaceByIndex(time33(name) % VAR_HASHTABLE_SIZE, name, vs);
  494. if (var == NULL)
  495. return false;
  496. pthread_rwlock_wrlock(&vs->lock);
  497. if (checkVarWritePermissions(var, visitor, vs)) {
  498. pthread_rwlock_unlock(&vs->lock);
  499. pthread_rwlock_wrlock(&var->lock);
  500. var->vn->obj = obj;
  501. pthread_rwlock_unlock(&var->lock);
  502. return true;
  503. }
  504. pthread_rwlock_unlock(&vs->lock);
  505. return false;
  506. }
  507. /*
  508. * 函数名: setVarToVarList
  509. * 目标: 在VarSpaceListNode中搜索var并修改其值
  510. * 调用: findVarFromVarSpaceByIndex
  511. */
  512. bool setVarToVarList(char *name, af_Object *obj, af_Object *visitor, af_VarSpaceListNode *vsl) {
  513. time33_t index = time33(name) % VAR_HASHTABLE_SIZE;
  514. af_Var *var = NULL;
  515. for (NULL; vsl != NULL; vsl = vsl->next) {
  516. var = findVarFromVarSpaceByIndex(index, name, vsl->vs);
  517. if (var != NULL) {
  518. pthread_rwlock_wrlock(&vsl->vs->lock);
  519. if (checkVarWritePermissions(var, visitor, vsl->vs)) {
  520. pthread_rwlock_unlock(&vsl->vs->lock);
  521. pthread_rwlock_wrlock(&var->lock);
  522. var->vn->obj = obj;
  523. pthread_rwlock_unlock(&var->lock);
  524. return true;
  525. }
  526. pthread_rwlock_unlock(&vsl->vs->lock);
  527. return false;
  528. }
  529. }
  530. return false;
  531. }
  532. af_VarSpaceListNode *pushNewVarList(af_Object *belong, af_VarSpaceListNode *base, af_Environment *env){
  533. af_VarSpace *vs = makeVarSpace(belong, 3, 2, 0, env);
  534. af_VarSpaceListNode *new = makeVarSpaceList(vs);
  535. new->next = base;
  536. return new;
  537. }
  538. void setVarPermissions(af_Var *var, af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external) {
  539. pthread_rwlock_rdlock(&vs->lock);
  540. af_ObjectData *belong_data = NULL;
  541. if (vs->belong != NULL) {
  542. pthread_rwlock_rdlock(&vs->belong->lock);
  543. belong_data = vs->belong->data;
  544. pthread_rwlock_unlock(&vs->belong->lock);
  545. }
  546. af_ObjectData *visitor_data = NULL;
  547. if (visitor != NULL) {
  548. pthread_rwlock_rdlock(&visitor->lock);
  549. visitor_data = visitor->data;
  550. pthread_rwlock_unlock(&visitor->lock);
  551. }
  552. pthread_rwlock_unlock(&vs->lock);
  553. if (belong_data != NULL && belong_data != visitor_data)
  554. return;
  555. pthread_rwlock_wrlock(&var->lock);
  556. var->permissions[0] = p_self;
  557. var->permissions[1] = p_posterity;
  558. var->permissions[2] = p_external;
  559. pthread_rwlock_unlock(&var->lock);
  560. }
  561. void setVarSpacePermissions(af_Object *visitor, af_VarSpace *vs, char p_self, char p_posterity, char p_external) {
  562. pthread_rwlock_rdlock(&vs->lock);
  563. af_ObjectData *belong_data = NULL;
  564. if (vs->belong != NULL) {
  565. pthread_rwlock_rdlock(&vs->belong->lock);
  566. belong_data = vs->belong->data;
  567. pthread_rwlock_unlock(&vs->belong->lock);
  568. }
  569. af_ObjectData *visitor_data = NULL;
  570. if (visitor != NULL) {
  571. pthread_rwlock_rdlock(&visitor->lock);
  572. visitor_data = visitor->data;
  573. pthread_rwlock_unlock(&visitor->lock);
  574. }
  575. pthread_rwlock_unlock(&vs->lock);
  576. if (belong_data != NULL && belong_data != visitor_data)
  577. return;
  578. vs->permissions[0] = p_self;
  579. vs->permissions[1] = p_posterity;
  580. vs->permissions[2] = p_external;
  581. }
  582. bool isProtectVarSpace(af_VarSpace *vs) {
  583. pthread_rwlock_rdlock(&vs->lock);
  584. bool res = vs->is_protect;
  585. pthread_rwlock_unlock(&vs->lock);
  586. return res;
  587. }
  588. bool setVarSpaceProtect(af_Object *visitor, af_VarSpace *vs, bool protect) {
  589. pthread_rwlock_wrlock(&vs->lock);
  590. bool re = vs->is_protect;
  591. af_ObjectData *belong_data = NULL;
  592. if (vs->belong != NULL) {
  593. pthread_rwlock_rdlock(&vs->belong->lock);
  594. belong_data = vs->belong->data;
  595. pthread_rwlock_unlock(&vs->belong->lock);
  596. }
  597. af_ObjectData *visitor_data = NULL;
  598. if (visitor != NULL) {
  599. pthread_rwlock_rdlock(&visitor->lock);
  600. visitor_data = visitor->data;
  601. pthread_rwlock_unlock(&visitor->lock);
  602. }
  603. if (belong_data != NULL && belong_data != visitor_data) {
  604. pthread_rwlock_unlock(&vs->lock);
  605. return re;
  606. }
  607. vs->is_protect = protect;
  608. pthread_rwlock_unlock(&vs->lock);
  609. return re;
  610. }