Создание моделей в ASP.NET MVC

Причина, по которой DX и R10 равны нулю

В соответствии с 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)

8
задан Benjamin Pollack 18 November 2009 в 22:49
поделиться

3 ответа

Я думаю, что вы хотите изменить вопрос. Сущности могут быть автоматически сгенерированы из базы данных, поэтому проблема заключается в простом использовании механизма .NET для поддержки схемы вашей базы данных. Поскольку вы не используете NHibernate, которого требуют эти другие решения, я бы предложил использовать MigratorDotNet . MigratorDotNet использует ту же идею, что и миграции Ruby on Rails:

  1. Ваша база данных отслеживает свою версию
  2. Каждый раз, когда вы хотите изменить схему, вы пишете небольшой класс для обработки обновления (и, при желании, перехода на более раннюю версию)
  3. Назначьте этим классам порядок выполнения
  4. Если база данных когда-либо не обновляется, просто выполните методы обновления классов в порядке

Поскольку вы будете регенерировать свои сущности только во время компиляции, я ' г рекомендовать запускать сценарии миграции, а затем регенерировать ваши сущности как часть процесса сборки. MigratorDotNet уже поставляется с MSBuildTarget , для его добавления потребуется всего лишь пара щелчков мышью.

6
ответ дан 5 December 2019 в 21:21
поделиться

Другой вариант - использовать NHibernate с FluentNhibernate , который автоматически сопоставит вашу модель на основе соглашений. Вы также можете переопределить сопоставление, чтобы настроить его под свои нужды.

1
ответ дан 5 December 2019 в 21:21
поделиться

Активная запись Castle Project - отличный способ сделать это.

If предлагает возможности, аналогичные активной записи ruby ​​on rails.

0
ответ дан 5 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: