Я пытаюсь реализовать STM API в Java с использованием TL2. Я написал функции более низкого уровня, такие как ReadTx и WriteTx, но не смог преобразовать их в конструкции более высокого уровня, используя такие ключевые слова, как atomic. Например, моя текущая реализация работает для первого фрагмента кода, но, поскольку он громоздок, я хочу преобразовать его во второй.
void PushLeft(DQueue *q, int val) {
QNode *qn = malloc(sizeof(QNode));
qn->val = val;
do {
StartTx();
QNode *leftSentinel = ReadTx(&(q->left));
QNode *oldLeftNode = ReadTx(&(leftSentinel->right));
WriteTx(&(qn->left), leftSentinel);
WriteTx(&(qn->right), oldLeftNode);
WriteTx(&(leftSentinel->right), qn);
WriteTx(&(oldLeftNode->left), qn);
} while (!CommitTx());
}
void PushLeft(DQueue *q, int val) {
QNode *qn = malloc(sizeof(QNode));
qn->val = val;
atomic {
QNode *leftSentinel = q->left;
QNode *oldLeftNode = leftSentinel->right;
qn->left = leftSentinel;
qn->right = oldLeftNode;
leftSentinel->right = qn;
oldLeftNode->left = qn;
} }
Как это сделать без изменения синтаксиса языка?