Преобразовать аргумент 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 на уровне пользователя.

Другие вопросы по тегам