[#1] ListConstructor - zagadka
Witam! Siedzę już nad tym problemem dosyć długo i nie mogę się z tym uporać. Skompilowanie kodu, który zamieszczam niżej i jego uruchomienie powoduje, że reslib (autorstwa Morgotha) wywala mi tego typu błąd: [00000] [EE] test: Unable to locate 0x207dd8c0 pool ... [00001] [EE] test: Mismatched pooled 0x207dd8c0 allocation [Size: 18 Type: 0x21] from test.c:24/ListConstructor() A tutaj program, uproszczony już chyba do granic możliwości:

Jeśli dla próby "ręcznie" zaalokuję sobie poolheadera, wszystko jest OK. Na pierwszy rzut oka wygląda więc na to, że w niewłaściwy sposób pobieram parametr mempool w ListConstructor(). Czy ktoś bardziej doświadczony mógłby na szybko zerknąć na to?

[#2] Re: ListConstructor - zagadka

@Kamul, post #1

poprosimy o wersje normalnie sformatowana

[#3] Re: ListConstructor - zagadka

@Kamul, post #1

Najpierw naucz się wklejać kod. Z powodu rozwalania layoutu strony przez Twój post, kod został wycięty.

[#4] Re: ListConstructor - zagadka

@Grzegorz Kraszewski, post #3

Najpierw naucz się wklejać kod.

Zawsze przed wysłaniem posta oglądam preview. Nie wiem jak to wyglądało po wysłaniu, w każdym razie nie było to zamierzone - przepraszam. A swoją drogą, Ty też mogłeś się powstrzymać od złośliwości.

Dodane: No i wszystko jasne. Od dawna posty wysyłam ze Sputnika. Kilka
razy zrobiłem wyjątek i już problemy. Tego posta także posypało... Co
ciekawe, na preview wyglądał w porządku. Teraz już Sputnik w akcji.



Ostatnia modyfikacja: 03.01.08 15:40
[#5] Re: ListConstructor - zagadka

@Kamul, post #4

A swoją drogą, Ty też mogłeś się powstrzymać od złośliwości.

Żadna złośliwość, ot zwykła operacja techniczna.

[#6] Re: ListConstructor - zagadka

@kiero, post #2

Teraz powinno być lepiej. Jak nie, to chyba założę wątek z pytaniem
jak pisać posty... ;)

Witam!

Siedzę już nad tym problemem dosyć długo i nie mogę się z tym uporać. Skompilowanie kodu, który zamieszczam niżej i jego uruchomienie powoduje, że reslib (autorstwa Morgotha) wywala mi tego typu błąd:

[00000] [EE] test: Unable to locate 0x207dd8c0 pool ...
[00001] [EE] test: Mismatched pooled 0x207dd8c0 allocation [Size: 18 Type: 0x21] from test.c:24/ListConstructor()

A tutaj program, uproszczony już chyba do granic możliwości:

#define MEMTRACK

#include 
#include 
#include 

#include 
#include 
#include 

#include 


Object *winTest, *appTest, *Listview;

struct Library *MUIMasterBase, *UtilityBase;

// ============================================================================

static ULONG ListConstructor(struct Hook *h, APTR mempool, STRPTR str)
{
  char *tekst_copy = NULL;

  if ((tekst_copy = AllocPooled(mempool, strlen(str) + 1)))
    strcpy(tekst_copy, str);

  return ((ULONG) tekst_copy);
}

static struct Hook h_ListConstructor = { {0, 0}, (HOOKFUNC) HookEntry, (HOOKFUNC)
 ListConstructor };

// ----------------------------------------------------------------------------

static ULONG ListDestructor(struct Hook *h, APTR mempool, STRPTR str)
{
  if (str)
    FreePooled(mempool, str, strlen(str) + 1);
  return (0);
}

static struct Hook h_ListDestructor = { {0, 0}, (HOOKFUNC) HookEntry, (HOOKFUNC)
 ListDestructor };

// ============================================================================

ULONG BuildApplication (void)
{
  appTest = MUI_NewObject (MUIC_Application,
   MUIA_Application_Window, winTest = MUI_NewObject (MUIC_Window,
    MUIA_Window_RootObject, MUI_NewObject (MUIC_Group,
     MUIA_Group_Child, Listview = MUI_NewObject (MUIC_Listview,
      MUIA_Listview_List, MUI_NewObject (MUIC_List,
       MUIA_List_ConstructHook, &h_ListConstructor,
       MUIA_List_DestructHook, &h_ListDestructor,
       MUIA_Frame, MUIV_Frame_ReadList,
      TAG_END),
     TAG_END),
    TAG_END),
   TAG_END),
  TAG_END);

  return ((ULONG) appTest);
}

// ============================================================================

void SetNotifications (void)
{
  DoMethod (winTest, MUIM_Notify, MUIA_Window_CloseRequest,
  MUIV_EveryTime, appTest, 2, MUIM_Application_ReturnID,
  MUIV_Application_ReturnID_Quit);

  return;
}

// ============================================================================

void MainLoop (void)
{
  long signals;

  SetAttrs (winTest, MUIA_Window_Open, TRUE, TAG_END);

  while (DoMethod (appTest, MUIM_Application_NewInput, &signals) !=
 MUIV_Application_ReturnID_Quit)
  {
    if (signals)
    {
      signals = Wait (signals | SIGBREAKF_CTRL_C);
      if (signals & SIGBREAKF_CTRL_C) break;
    }
  }

  SetAttrs (winTest, MUIA_Window_Open, FALSE, TAG_END);
  return;
 }

// ============================================================================

int main (void)
{
  PrepareMemTrack("test", RESF_CLEANUP & REFS_WALL);

  if ((IntuitionBase = (struct IntuitionBase*)OpenLibrary ("intuition.library",
 37)))
  {
    if ((UtilityBase = OpenLibrary ("utility.library", 37)))
    {
      if ((MUIMasterBase = OpenLibrary ("muimaster.library", 19)))
      {
        if (BuildApplication ())
        {
          SetNotifications ();

          DoMethod(Listview, MUIM_List_InsertSingle, "przykładowy tekst", 
    MUIV_List_Insert_Top);

          MainLoop ();
          MUI_DisposeObject (appTest);
        }
        CloseLibrary (MUIMasterBase);
      }
      CloseLibrary (UtilityBase);
    }
    CloseLibrary ((struct Library*)IntuitionBase);
  }
  EndMemTrack();

  return (0);
}


Jeśli dla próby "ręcznie" zaalokuję sobie poolheadera, wszystko jest OK. Na pierwszy rzut oka wygląda więc na to, że w niewłaściwy sposób pobieram parametr mempool w ListConstructor().

Czy ktoś bardziej doświadczony mógłby na szybko zerknąć na to?

PS. Zamiast całego kodu mogłem dać tylko linka do niego. Wychodzę
jednak z założenia, że informacje na forum mogą się jeszcze komuś w
przyszłości przydać.
[#7] Re: ListConstructor - zagadka

@Kamul, post #6

Pod jaki Ty to system piszesz?
Konstrukcja Hooków jest zależna od systemu. Podobnie przekazywanie przez nie parametrów.

[#8] Re: ListConstructor - zagadka

@Kamul, post #6

dostajesz te komunikaty bo biblioteka morgotha nie ma pojecia o istnieniu poola dostarczanego do hooka przez mui. mozesz utworzyc sobie wlasnego poola i przekazac go do listy. wtedy memtrack bedzie wiedzial o jego stworzeniu i nie bedzie marudzil



Ostatnia modyfikacja: 03.01.08 15:53
[#9] Re: ListConstructor - zagadka

@MinisterQ, post #7

Pod jaki Ty to system piszesz?
Konstrukcja Hooków jest zależna od systemu. Podobnie
przekazywanie przez nie parametrów.


To akurat kompilowałem pod Morphosa. Wcześniej korzystałem z makr
MaaGa. Teraz, żeby nie zaciemniać, na potrzeby forum zrobiłem to bez
nich.

[#10] Re: ListConstructor - zagadka

@Grzegorz Kraszewski, post #5

Żadna złośliwość, ot zwykła operacja techniczna.

Owszem, to:
"Z powodu rozwalania layoutu strony przez Twój post, kod został
wycięty."
była operacja techniczna. I zapewniam, że gdybyś na tym poprzestał,
Twój komunikat nie byłby dla mnie ani trochę mniej czytelny.
Natomiast
"Najpierw naucz się wklejać kod."
nie zabrzmiało zbyt grzecznie. I mimo wszystko chyba masz świadomość,
że mogłeś sobie darować. Tym bardziej, że nie należę do ludzi
których głównym celem jest zaśmiecanie forum. A o tym, że post został
posypany, nawet nie wiedziałem. Jak już pisałem, w podglądzie wszystko
było OK.

Zresztą, mniejsza o to.
[#11] Re: ListConstructor - zagadka

@kiero, post #8

Najgorsze jest to, że on nie tylko marudzi, ale też udaremnia próbę
alokacji pamięci. :) W efekcie do listy nic nie jest dodawane. Ale
skoro z samym kodem jest wszystko w porządku, to nie będę się tym
przejmował. Dla samego debugu pamięć będę, tak jak piszesz, alokował
po swojemu. W pozostałych przypadkach nie ma to znaczenia, bo memtrack
nie jest wtedy używany.

Dzięki!

[#12] Re: ListConstructor - zagadka

@Kamul, post #11

Korzystanie z mempoola listy nie jest obligatoryjne.

[#13] Re: ListConstructor - zagadka

@Kamul, post #10

I mimo wszystko chyba masz świadomość,
że mogłeś sobie darować.


Przepraszam.

[#14] Re: ListConstructor - zagadka

@Grzegorz Kraszewski, post #13

Nie ma problemu. :)

[#15] Re: ListConstructor - zagadka

@MinisterQ, post #12

Korzystanie z mempoola listy nie jest obligatoryjne.

Ale jest wygodne. ;)

Gdybym jednak miał zrobić to po swojemu, to jak to najlepiej
rozwiązać? Mempool jako zmienna globalna i CreatePool() np. w main()?
Jakie wartości puddleSize i threshSize byłyby optymalne w tym
zastosowaniu? Typowo pojedyncza alokacja nie będzie przekraczać
powiedzmy 100B, ale może się zdarzyć, że będzie potrzebny dużo większy
kawałem pamięci (np. kilkaset kB i więcej). Ale to chyba niczemu nie
szkodzi, jedynie pamięć ta będzie zaalokowana w nowym poolu. A może
się mylę?

[#16] Re: ListConstructor - zagadka

@Kamul, post #15

podajesz poola poprzez MUIA_List_Pool. wtedy dostaniesz go w hooku. a parametry zaleza od danych jakie wrzucasz. jezeli masz np elementy sredniej wielkosci 100 bajtow to zrob threshold na nieco wiecej niz 100 a puddlesize na 100*n (np 100*64. zaleznie od ilosci elementow).

[#17] Re: ListConstructor - zagadka

@kiero, post #16

Typowo to będzie rzeczywiście nie więcej jak 100B. Jeśli jednak
trafi się string np. 5MB (nie mogę akurat tego wykluczyć), to czy może
wydarzyć się coś niedobrego? Jeśli dobrze to rozumiem:
"Allocations larger than the threshSize are allocation in their own
puddles."
to tylko obszar zostanie zaalokowany poza stworzonym wcześniej
poolem. Ponieważ jednak jest to przypadek nieczęsty, to nie ma on
znaczącego wpływu na fragmentację pamięci.

I druga sprawa - czy to:
"Pools automatically expand and shrink based on demand."
oznacza, że jeśli elementów (przy danym rozmiarze) będzie za dużo aby
pomieścić w danym poolu, to zostanie on automatycznie powiększony?

Niby to wszystko proste, ale jakoś nie mogę sobie tego dokładnie
w głowie ułożyć przez to, że raz o poolach pisze, potem zaś o
puddle'ach. :)
[#18] Re: ListConstructor - zagadka

@Kamul, post #17

"wydarzyć się coś niedobrego? Jeśli dobrze to rozumiem:
"Allocations larger than the threshSize are allocation in their own
puddles."
to tylko obszar zostanie zaalokowany poza stworzonym wcześniej
poolem."

tak.

"I druga sprawa - czy to:
"Pools automatically expand and shrink based on demand."
oznacza, że jeśli elementów (przy danym rozmiarze) będzie za dużo aby
pomieścić w danym poolu, to zostanie on automatycznie powiększony?"


zostanie przydzielony od systemu kolejny blok pamieci o wielkosci puddlesize i z niego beda brane kolejne alokacje. jezeli wszystkie alokacje z pudla zostana zwolnione, on takze zostanie zwolniony do systemu.

[#19] Re: ListConstructor - zagadka

@kiero, post #18

OK, wielkie dzięki! Wszystko jasne. :)

Przejrzałem właśnie listę wątków i doszedłem do wniosku, że teraz
kolej na pytanie od MDW. ;)
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem