Guest User

Untitled

a guest
Apr 28th, 2016
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.28 KB | None | 0 0
  1. struct node { struct node *next; };
  2.  
  3. int try_insert(struct node *after, struct node *node) {
  4.     //копируем after->next в node->next
  5.     node->next = __atomic_load_n(&after->next, __ATOMIC_ACQUIRE);
  6.     //если after->next = 0, значит выполняется попытка удаления узла after
  7.     if(!node->next) { return (0); }
  8.     //если значение after->next изменилось, значит узел after удаляется либо после него был вставлен другой узел
  9.     //если значение after->next не изменилось помещаем адрес добавляемого узла node
  10.     return __atomic_compare_exchange_n(&after->next, &node->next, node, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED);
  11. }
  12.  
  13. int try_delete(struct node *after) {
  14.     //удаляемый узел after->next
  15.     //копируем его адрес в локальную переменную
  16.     struct node *next = __atomic_load_n(&after->next, __ATOMIC_ACQUIRE);
  17.     //если after->next = 0, значит узел after удаляется
  18.     if(!next) { return (0); }
  19.     //копируем after->next->next в локальную переменную
  20.     //при этом атомарно помещаем в after->next->next = 0
  21.     struct node *next_next = __atomic_exchange_n(&next->next, 0, __ATOMIC_ACQ_REL);
  22.     //если after->next->next = 0, значит узел after->next удаляется
  23.     if(!next_next) { return (0); }
  24.     //если значение after->next изменилось, значит узел after удаляется либо после него был вставлен другой узел
  25.     //если значение after->next не изменилось помещаем адрес следующего за удаляемым узла используя локальную копию
  26.     int res = __atomic_compare_exchange_n(&after->next, &next, next_next, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED);
  27.     if(!res) {
  28.         //если значение after->next все-же изменилось
  29.         //возвращаем в after->next->next адрес следующего за удаляемым узла используя локальную копию next_next
  30.         __atomic_store_n (&next->next, next_next, __ATOMIC_RELEASE);
  31.     }
  32.     return res;
  33. }
Add Comment
Please, Sign In to add comment