В соответствии с man-страницей клона , они используются, только когда установлены CLONE_PARENT_SETTID
, CLONE_CHILD_SETTID
.
CLONE_PARENT_SETTID (начиная с Linux 2.5.49) Сохраните идентификатор дочернего потока в месте ptid в памяти родителя. (В Linux 2.5.32-2.5.48 был флаг CLONE_SETTID, который сделал это.) Операция сохранения завершается до того, как clone () возвращает управление в пространство пользователя.
CLONE_CHILD_SETTID (начиная с Linux 2.5.49) Сохраните идентификатор дочернего потока в месте ctid в памяти дочернего элемента. Операция сохранения завершается до того, как clone () вернет управление в пространство пользователя.
blockquote>DX и R10 соответствуют
ptid
иctid
в этой справочной странице ( Ссылка ).На самом деле этот флаг не устанавливается при вызове runtime.clone () из os_linux.go: Source .
Причина, по которой им не нужен tid, может быть в том, что это не библиотека типа pthread, в которой пользователь делает что-то сложное, используя tid.
Что R8, R9 и R12 используются для
Вкратце, R8, R9 и R12 не используются системным вызовом, но используются для построения стека после него.
Обратите внимание, что R8 и R9 передаются в качестве аргумента системному вызову, но не используются клоном (см. Причину ниже), и R12 сохраняется после системного вызова, эти регистры безопасно использовать после системного вызова. ( Ссылка )
Посмотрим подробнее.
внутренне runtime.clone вызывается следующим образом: Источник
func newosproc(mp *m) { stk := unsafe.Pointer(mp.g0.stack.hi) .... ret := clone(cloneFlags, stk, unsafe.Pointer(mp), unsafe.Pointer(mp.g0), unsafe.Pointer(funcPC(mstart))) .... }
Чтение Краткое руководство по ассемблеру Go и опубликованный код OP, вы можете видеть, что R8 - это указатель на
mp
, а R9 - это указатель наmp.g0
, а R12 - это указатель на некоторую функцию, которую вы хотите вызвать в потокеclone
ed. (структураm
иg
выглядит следующим образом: Источник и это: Источник ).R8 является аргументом клонирования, который указывает tls (локальное хранилище потока), но он не используется, если не установлено
CLONE_SETTLS
: ИсточникR9 обычно используется в качестве 6-го аргумента для системный вызов, но клон не использует его, потому что он использует только 5 аргументов ( Источник ).
R12 - это регистр, который сохраняется после системного вызова.
Итак, наконец, давайте посмотрим на источник runtime.clone. Важная вещь после
SYSCALL
. Они делают некоторую настройку стека, используя R8 и R9 в дочернем потоке, который создается, и, наконец, вызывают R12.// int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); TEXT runtime·clone(SB),NOSPLIT,[111] MOVL flags+0(FP), DI MOVQ stk+8(FP), SI MOVQ [111], DX MOVQ [111], R10 // Copy mp, gp, fn off parent stack for use by child. // Careful: Linux system call clobbers CX and R11. MOVQ mp+16(FP), R8 MOVQ gp+24(FP), R9 MOVQ fn+32(FP), R12 MOVL $SYS_clone, AX SYSCALL // In parent, return. CMPQ AX, [111] JEQ 3(PC) MOVL AX, ret+40(FP) RET // In child, on new stack. MOVQ SI, SP // If g or m are nil, skip Go-related setup. CMPQ R8, [111] // m JEQ nog CMPQ R9, [111] // g JEQ nog // Initialize m->procid to Linux tid MOVL $SYS_gettid, AX SYSCALL MOVQ AX, m_procid(R8) // Set FS to point at m->tls. LEAQ m_tls(R8), DI CALL runtime·settls(SB) // In child, set up new stack get_tls(CX) MOVQ R8, g_m(R9) MOVQ R9, g(CX) CALL runtime·stackcheck(SB) nog: // Call fn CALL R12 //(omitted)
Я думаю, что вы хотите изменить вопрос. Сущности могут быть автоматически сгенерированы из базы данных, поэтому проблема заключается в простом использовании механизма .NET для поддержки схемы вашей базы данных. Поскольку вы не используете NHibernate, которого требуют эти другие решения, я бы предложил использовать MigratorDotNet . MigratorDotNet использует ту же идею, что и миграции Ruby on Rails:
Поскольку вы будете регенерировать свои сущности только во время компиляции, я ' г рекомендовать запускать сценарии миграции, а затем регенерировать ваши сущности как часть процесса сборки. MigratorDotNet уже поставляется с MSBuildTarget , для его добавления потребуется всего лишь пара щелчков мышью.
Другой вариант - использовать NHibernate с FluentNhibernate , который автоматически сопоставит вашу модель на основе соглашений. Вы также можете переопределить сопоставление, чтобы настроить его под свои нужды.
Активная запись Castle Project - отличный способ сделать это.
If предлагает возможности, аналогичные активной записи ruby on rails.