Преобразовать аргумент ref dataType в ptr(dataType) в часовне
Существует ли официальный способ преобразования аргумента, переданного по ссылке, в указатель на тот же тип? Я знаю, что на этапе компиляции CodeGen это ref int
становится int *
и я знаю, что вы можете сделать это с помощью extern для совместимости с C, но как насчет написания абстракций Chapel? Кроме того, как обстоят дела с широкими ссылками и широкими указателями? Как бы вы справились с чем-то подобным.
Для тех, кто интересуется, я экспериментирую с некоторым PGAS-STM (Секционированное глобальное адресное пространство - программная транзакционная память), и одна из вещей, которые мне нужно сделать, - разрешить семантику следующим образом...
Добавить к списку с помощью STM:
// Global variables
var head : node(eltType);
// Local variables
var newHead = new node(eltType);
var retry = false;
var stm = manager.getDescriptor();
do {
retry = false;
try! {
stm.begin();
// Takes pointer of 'head' via its reference...
// What happens if its a wide reference???
var h = stm.read(head);
newHead.next = h;
stm.write(head, nextHead);
stm.commit();
} catch retry : STMRetry {
retry = true;
}
} while retry;
Да, в настоящее время это ужасно, но это очень ранний прототип.
Изменить: изменение имени для STMBegin
в begin
1 ответ
Существует ли официальный способ преобразования аргумента, переданного по ссылке, в указатель на тот же тип?
Я не знаю про "чиновника", но мой инстинкт был попытаться использовать c_ptrTo
следующим образом, который, кажется, работает с часовни 1.16. Учитывая эти файлы:
testit.chpl:
extern proc bar(x: c_ptr(int));
require "testit.h";
var i = 42;
foo(i);
writeln("after foo, i is: ", i);
proc foo(ref x: int) {
var c_ptr_to_x: c_ptr(int) = c_ptrTo(x);
bar(c_ptr_to_x);
writeln("after bar, x is: ", x);
x = 22;
}
testit.h:
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
static void bar(int64_t* x) {
printf("bar got: %"PRId64"\n", *x);
*x = 32;
}
результат, кажется, работает, как я надеялся:
$ chpl testit.chpl
$ ./testit
bar got: 42
after bar, x is: 32
after foo, i is: 22
а что ради написания абстракций в часовне?
Я бы сказал, что c_ptr()
типы на самом деле предназначены только для взаимодействия с C, а не для написания абстракций на основе указателей в самой Chapel.
Кроме того, как обстоят дела с широкими ссылками и широкими указателями?
Это концепции реализации, а не абстракции, которые представляются конечным пользователям на уровне языка, поэтому я не уверен, что существует определенный способ работы с этими типами в Chapel на уровне пользователя.