1. Си / Говнокод #23411

    +5

    1. 1
    2. 2
    3. 3
    int hcreate(size_t nel);
    ENTRY *hsearch(ENTRY item, ACTION action);
    void hdestroy(void);

    Using these functions, only one hash table can be used at a time.
    The argument nel specifies the maximum number of entries in the table. (This maximum cannot be changed later, so choose it wisely).
    Individual hash table entries can be added, but not deleted.

    Одной хеш таблицы хватит для всех, ресайзить её или удалять элементы - нинужная фича.

    Запостил: bormand, 15 Октября 2017

    Комментарии (63) RSS

    • POSIX такой POSIX.
      Ответить
      • Linux:
        int hcreate_r(size_t nel, struct hsearch_data *htab);
        int hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab);
        void hdestroy_r(struct hsearch_data *htab);

        КОКОКО ЛИНУКС НЕ СТАНДАРТ ТАК НЕПРАВИЛЬНО ОДНОЙ ТАБЛИЦЫ ХВАТИТ НА ВСЕХ!!!пыщ-пыщ-пыщ
        Ответить
        • Ну это расширение от GNU. Согласно стандарту POSIX, программа должна юзать одну таблицу, время жизни которой совпадает со временем жизни программы.
          Ответить
          • Зачем вообще придумали нереентерабельные функции?
            Ответить
            • Для удобства же, чтобы лишние параметры не передавать. Ну и чтобы не отклоняться от стиля, заложенного создателями си.
              Ответить
              • Тогда предлагаю для соблюдения стиля добавить функции float sin_nonreentrant(void), float cos_nonreentrant(void), аргумент которых будет не передаваться в параметре, а, например, автоматически извлекаться из последнего оператора присвоения. Во-первых, не будем передавать «лишнего». Во-вторых, на платформах с сопроцессором в итоге всё равно сведётся к извлечению аргумента из регистра ST(0).
                Ответить
                • M_PI; // кто сказал, что это бесполезное выражение?
                  3.0;
                  div();
                  sin();
                  "sin(pi/3) = %f";
                  printf();
                  Ответить
                  • И конпелятор будет легче писать...
                    K&R ведь при создании языка главным критерием считали простоту создания конпелятора.
                    Ответить
                  • Запахло FORTH'ом.
                    Ответить
                • > к извлечению аргумента из регистра ST(0)
                  Как-будто где-то кроме x86 есть математический сопроцессор со стеком...
                  Ответить
                  • Царь другими платформами не пользуется.

                    *****

                    Глянул руководство по VFP, используемому на ARM — и правда, там все инструкции ссылаются на произвольные регистры, а не на стек.

                    А какие процессоры с сопроцессорами сейчас распространены?
                    Ответить
                    • Ну в ARM'ах это технически считается сопроцессором, хоть и на том же кристалле разведено.
                      Ответить
          • > время жизни которой совпадает со временем жизни программы.

            Кстати, а ведь когда-то время жизни программ было другим. Не было монстроподобных программ типа Open Office, зато были мелкие консольные утилиты, выполняющие одну мелкую операцию, типа cat, grep, sed, diff, patch, head, tail, split. Возможно, когда изобретали POSIX, думали, что сложные процессы будут составляться из запусков маленьких программок, которые будут жить недолго.
            Ответить
    • И вишенка на торте: The hdestroy() and hdestroy_r() functions do not free the buffers pointed to by the key and data elements of the hash table entries. (It can't do this because it doesn't know whether these buffers were allocated dynamically.) If these buffers need to be freed (perhaps because the program is repeatedly creating and destroying hash tables, rather than creating a single table whose lifetime matches that of the program), then the program must maintain bookkeeping data structures that allow it to free them.
      Ответить
    • Ein Kern!
      Ein Thread!
      Eine Haschtabelle!
      Ответить
      • Почему ты звук "ш" написал по немекци, а остальное по английски?
        Ответить
        • Kern по-немецки (по-английски будет kernel), Tabelle по-немецки (по-английски будет table).

          Что же касается заимствований Thread и Hasch, то я мог бы написать исконно немецкие варианты, но, во-первых, большинству читателей ГК будет труднее, во-вторых, я не знаю, какое из слов, обозначающих нить, используется в компьютерной терминологии.

          Кстати:
          http://www.linguee.com/english-german/search?source=auto&query=thread

          И самое смешное (осторожно, среди примеров есть сленг):
          http://www.linguee.com/english-german/search?source=auto&query=hash
          Ответить
          • ну вот я среагировал на Thread который стопудово не будет так читаться (th же не используется для передачи такого звука у немцев)
            Ответить
            • Пожалуй, никого не удивляет слово Bibliothek, в котором немцы th читают как t, хотя это слово заимствовано через латынь из греческого, а в греческом на месте th была буква θ, которая читается... как [θ], т. е. как th в английском.
              Ответить
              • > читается... как [θ], т. е. как th в английском
                th как think
                th как that
                s как доллар
                Ответить
                • In accents with th-debuccalization, the cluster /θr/ becomes [hr], giving these dialects a consonant cluster that doesn't occur in other dialects. The replacement of /θr/ with [hr] leads to pronunciations like:
                  three - [hri]
                  throw - [hro]
                  through, threw - [hrʉ]
                  (Википедия про th)

                  threwknee!
                  Ответить
                  • Какие-то пидорахи тебя минусуют. Вероятно, не хотят хрюкать.
                    Ответить
                  • Какой простор для эвфемизмов: через колено, бросил колено...
                    Ответить
                • «Тета» читается как th в слове think.

                  Как th в слове that читается буква «дельта».
                  Ответить
            • > который стопудово не будет так читаться

              В немецком полно заимствованных слов, которые читаются не по правилам. der Thread, кмк, оптимальный перевод.
              Ответить
    • так а нельзя потом просто компьютер перегрузить чтобы сброить?
      Ответить
      • Когда у нас в школе были компьютеры с DOS'ом, дотянуться до кнопки RESET и дождаться новой загрузки системы было быстрее, чем найти выход из программы. Жаль, сейчас времена изменились, перезагрузка стала требовательной к ресурсам...
        Ответить
    • А в эрланге тоже одна хэш-таблица на процесс.
      Ответить
      • эрланг форсил микросервисы за долго то того как докер сделал это брендом
        Ответить
        • Хм, что именно тебе в эрланге показалось похожим на микросервисы?
          Ответить
          • Акторы, разнесенные на разные ноды
            Ответить
            • Мне казалось, что суть микросервисов не в этом, а в изоляции компонентов системы. Distributed Erlang обеспечивает никакую изоляцию, ибо решает он противоположную задачу.
              Впрочем, я с микрушнёй не работала, спорить не буду.
              Ответить
    • Нихуя не понял, но ставлю плюс борманду.
      Ответить
    • а чё, нормально
      у нас в одной либе большие аргументы (мегабайт-два) передаются из функции в функцию через файл, потому что памяти мало
      а чтобы быстрее работало, файл создается на рамдиске
      Ответить
      • А рамдиск - в свопе (потому что памяти мало)?
        Ответить
        • А своп — на NTFS-разделе в файле с атрибутом «сжатый».
          Ответить
        • а в своп, вроде бы, операционка не умеет
          Ответить
      • охуясе, вот это call convenstion

        slow call, по аналогии со fast call
        Ответить
        • Можно ещё хранить в веб-сервисе.
          Ответить
          • но лучше всего на стриммере
            Правда, придется при каждом вызове метода обращаться к оператору, призывая его звоночком чтобы он перестал пить чай, и заправил кассету
            Ответить
            • господь с тобой, для этого есть робот - кассеты в стример заправлять
              Ответить
              • > робот
                Оператор может дешевле обойтись если скорость не нужна...
                Ответить
                • нет, не так
                  оператор нужен, чтобы записанные LTO кассеты забирать и увозить в банковское хранилище

                  недавно со мной рядом сокрушались, что когда-то была ещё и возможность архивировать на оптику, было очень прельстиво - сразу несколько физически разных носителей для ценных бекапов использовать - а сейчас уже болванки умерли, грусть печаль
                  Ответить
    • Выдержка из hcreate(3p)
      RATIONALE
             None.
      
      FUTURE DIRECTIONS
             None.
      Ответить
    • test comment
      Ответить
    • bormand, слушай, ты же силен в ACPI?

      Объясни дураку, почему в SSDT написано что встроенная в процессор карта сидит на шине PCI?
      Вообще если читать эту таблицу (или читать device manager / devices by connections в винде или dmesg на bsd) то можно увидеть что прямо из ACPI растет PCI и на ней сидят все, включая PCI-E.

      Зачем?!
      Ответить
      • > прямо из APCI растёт PCI
        Если не туплю, то это PCI Express Root Complex (раньше назывался PCI Host Bridge, линукс его так и показывает).

        > встроенная карта сидит на PCI
        Вай нот? Чтобы операционки её видели и конфигурили как нормальный PCI девайс, удобно же.
        Ответить
        • Сделал твой анус своим персональным девайсом, проверь.
          Ответить
        • >>Если не туплю
          Ну, тут я понимаю, только он не "раньше так назывался" а так он назывался в PCI: контроллер PCI сидел в северном мосту (позднее в мемори хабе) и назывался PCI Host Bridge (мост между хостом(процессором) и PCI).

          У PCI-Expressа подобный "корень" называется root complex и сидит (уже довольно давно) на кристалле.

          Тем не менее рут комплекс косплеит PCI host (мой sl):
          Device (PCI0)
                  {
                      Name (_HID, EisaId ("PNP0A08") /* PCI Express Bus */)  // _HID: Hardware ID
                      Name (_CID, EisaId ("PNP0A03") /* PCI Bus */)  // _CID: Compatible ID


          >>Вай нот?
          Значит, шоб не быть голословным -- вот он
          Scope (_SB.PCI0)
              {
                  Device (GFX0)
                  {
                      Name (_ADR, 0x00020000)  // _ADR: Address

          (кстати, что такое _ADR? Device 2 в терминах PCI?). Теперь, чего я собссно не понимаю:

          1) мне казалось что ACPI нужен чтобы найти корень, а там уже опросить шину специальным PCI способом (с помощью интерфейса того самого рута/бриджа).
          Можно представить что он реально сидит на PCI-Express (внутри кристала) но тогда накой хуй его хардкодить?? Его комплекс бы и так нашел. Выходит, что на PCI-Express его правда нет.

          2) Но если его нет, то как у него может быть device number?
          Разве не рут комплекс должен "знать" топологию своей шины?
          Его обманули и заставили верить чот у него там еще девайс сидит?
          А если я отключу его методом из ACPI то у меня и моник погаснет?

          3) Как фирмварь знает про мой встроенный видео? Или она в момент POSTа узнала про мой проц, и НАЛЕТУ ПРОПАТЧИЛА ACPI таблицу?

          --
          Вообще на каких форумах (можно англицких) про это лучше всего пиздеть? 99% "комптюетрщиков" нихуя не понимаю про ACPI:(
          Ответить
          • > ACPI нужен чтобы найти корень
            Ещё ради управления питанием, кулерами и прочим говном. Ну и чтобы найти адреса всякой мелочи типа ACPI таймера или легаси железок, которые не видно в PCI.

            > Его комплекс бы и так нашел.
            Ну описали и описали. Тебе мешает? По-любому оно и по нормальной енумерации находится.

            > НАЛЕТУ ПРОПАТЧИЛА ACPI
            SSDT это вроде как раз и есть динамический довесок к DSDT.

            > нарисовать деревце
            Эти таблицы же не совсем таблицы, это ебучий байткод (ASL), который исполняется ядром оси. И список девайсов, который будет описан в этой "таблице", может зависеть от версии операционки(!) (у меня так линукс на ноуте умер из-за того, что виндой 8.1 прикинулся).
            Ответить
            • >>Ещё ради управления питанием, кулерами и прочим говном.
              Разумеется. Но я сейчас не про термаильные зоны, а про построение дерева устройств и их методы.

              >>Ну описали и описали. Тебе мешает?
              Я пытаюсь понять: действительно-ли физически видеядро находится по ту сторону PCI-Express?
              Если я попрошу у руткомплекса сделать энумирацию -- он действительно мне найдет GFX0?

              >>оно и по нормальной енумерации находится.
              ..а тада зачем пейсать?

              может, ради того чотбы навести всякие методы типа
              Method (_BCL, 0, NotSerialized)  // _BCL: Brightness Control Levels

              ?

              Ну типа через PCI же их не экспортнешь.

              >>это вроде как раз и есть динамический довесок
              тогда ок, тогда я все понял

              >>операционки
              да, это когда там написана проверка что Os Windows2009, я понимаю.

              Вот тебе говнеца из моей таблички
              ElseIf (_OSI ("Windows 2012"))


              Окей, идею построения дерева нахуй.


              А есть хороший юзерфрендли туториал кроме спеки и доки по ACPICA?

              Мне чото стало интересно лучше понять это говно
              Ответить
            • ps:
              о, aida64 engineer умеет деревце по acpi
              Ответить
        • зы: а есть утилитка чтоб нарисовать деревце по DSDT файлу? Может, написать такую?
          Ответить

    Добавить комментарий