"Regexp `%s' compilation failed!"
· указанное регулярное выражение-фильтр для визуализации системных событий (режим отладки) не удалось откомпилировать.
”Unknown TCT option %s!"
· неизвестная опция командной строки (следует за ключом -tct), определяющей начальный Т-контекст времени исполнения
"Internal feature failed"
· одно из встроенных расширений Т-микроядра не удалось проинициализировать
"Stack overflow"
· недостаточно памяти для требуемого программой количества суперпотоков
“Threads initialization failed"
· Ошибка на стадиии инициализации подсистемы поддержки суперпотоков
"Out of memory"
· недостаточно памяти для программы
“MPI_Error[%d!= %d]: %.*s"
· сбой подсистемы обмены сообщений MPI
"No free MPI_Request (%d tries)"
· недопустимая задержка в подсистеме коммуникаций
”Out of supermemory"
· исчерпан лимит ячеек суперпамяти. Необходимо увеличить размер суперматрицы.
“Deadlock detected" - внутреняя ошибка синхронизации.
"Drop or freeze on unitialized T-value!" - Т-функция не проинициализировала один из своих выходных аргументов
Информационные сообщения
Эта группа сообщений сигнализирует либо об исключительно важных для оператора событиях, либо выводятся в режиме отладки (опция компилятора -dbg)
“MemoryLeak:...”
· в программе осталась неосвобожденная память в момент завершения
“main result is ready and %d TFuns are still working. Memory leaks are possible”
· в момент завершения головной функции tfun main остались работающие Т-функции.
“Leaked cell %x,%lld with data %s (%d bytes)”
· в программе осталась неосвобожденная суперпамять в момент завершения
“local memo works”
· началось повторное использование результатов мемо-функций на одном узле
“global memo works”
· началось повторное использование результатов мемо-функций, вычисляющихся на других узлах
Приложение A. Пример вставки и замены листьев в дереве.
Файл trefal.tcc
#include <iostream>
#define DBG fprintf(stderr,"%d: %d\n",ts::myRank,__LINE__)
using namespace std;
struct Expr;
typedef ts::TVar<Expr> TExpr;
struct Expr: private ts::TExtData
{
private:
TExpr* terms;
void copyFrom (const Expr& e, size_t start, size_t length) {
TExpr* p = *this;
const TExpr* q = e;
q += start;
for (unsigned i = 0; i < length; i++)
new (p++) TExpr(*q++);
}
void clear () {
if (terms) {
delete[] terms;
terms = 0;
} else {
TExpr* p = *this;
for (unsigned i = 0; i < getLength(); i++)
p++->~TExpr();
}
}
public:
Expr (): terms(0) {};
void init (size_t s) {
assert(!terms);
terms = new TExpr[s];
extDataSize() = s * sizeof(TExpr);
};
operator const TExpr* () const { return terms? terms: (TExpr*)extData(); }
operator TExpr* () { return terms? terms: (TExpr*)extData(); }
Expr (const Expr& e): terms(0) {
copyFrom(e, 0, e.getLength());
}
Expr& operator= (const Expr& e) {
if (this!= &e) {
clear();
init(e.getLength());
copyFrom(e, 0, e.getLength());
}
return *this;
}
Expr subexpr (size_t start, size_t length) const {
Expr e;
e.init(length);
e.copyFrom(*this, start, length);
return e;
}
size_t getLength () const {
return extDataSize() / sizeof(TExpr);
}
TExpr& operator[] (int i) {
return ((TExpr *)*this)[i];
}
~Expr () {
clear();
}
};
// e is intentionally not const!
ostream& operator< (ostream& os, Expr& e) {
os < e.getLength();
TExpr* p = e;
for (unsigned i = 0; i < e.getLength(); i++)
os < " (" < (Expr &)*p++ < ")";
return os;
}
istream& operator> (istream& is, Expr& e) {
size_t len;
char c1, c2;
is > len;
e.init(len);
TExpr* p = e;
for (unsigned i = 0; i < len; i++) {
is > c1 > (Expr &)*p++ > c2;
assert (c1 == '(' & c2 == ')');
}
return is;
}
Expr operator+ (const Expr& e1, const Expr& e2) {
Expr e;
e.init(e1.getLength() + e2.getLength());
TExpr* p = e;
const TExpr* q = e1;
for (unsigned i = 0; i < e1.getLength(); i++)
new (p++) TExpr(*q++);
q = e2;
for (unsigned i = 0; i < e2.getLength(); i++)
new (p++) TExpr(*q++);
return e;
}
tfun int insert (TExpr e, TExpr s, Expr tout out) {
Expr& x = (Expr&) e;
if (x.getLength() == 0) {
out = (Expr&) s;
} else {
TExpr z;
Expr& o = (Expr&) z;
o.init(x.getLength());
TExpr* p = o;
TExpr* q = x;
for (unsigned i = 0; i < x.getLength(); i++)
insert(*q++, s, *p++);
out = o;
}
return 0;
}
Expr empty;
tfun int subst (TExpr e, TExpr s, Expr tout out) {
Expr& x = (Expr&) e;
if (x.getLength() == 0) {
out = empty;
} else {
TExpr out1;
TExpr* q = x;
if (((Expr&)*q).getLength() == 0)
out1 = s;
else {
TExpr o;
subst(*q, s, o);
((Expr&) out1).init(1);
((TExpr*)(Expr&) out1)[0] = o;
}
TExpr out2;
TExpr e2;
((Expr&) e2) = x.subexpr(1, x.getLength() - 1);
subst(e2, s, out2);
out = (Expr&)out1 + (Expr&)out2;
}
return 0;
}
tfun int main (int argc, char *argv[]) {
TExpr s;
TExpr e;
TExpr out;
cin > e > s;
cerr < "expr: " < e < endl < "subst: " < s < endl;
insert(e, s, out);
cerr < "after insert: " < out < endl;
TExpr out2;
insert(e, s, out2);
subst(out2, s, out2);
cerr < "after subst.insert: " < out2 < endl;
return 0;
}