PB Mutex in Userlib?

Fragen zu allen anderen Programmiersprachen.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

PB Mutex in Userlib?

Beitrag von Nero »

Hiho,

Hab da mal wieder ne kleine frage.
Und zwar muß ich in einer Userlib Mutex verwenden um eine Queue zubefüllen und von dieser zu lesen.
Die Thread dazu werden aber im PB Progie später erstellt.
Ist es möglich die Mutex in der Lib zu erstellen und in PB zu nutzen?

Eine andere möglichkeit die mir eingefallen ist, einfach 4 wrapper Proceduren im PB Progie zu erstellen und als Funktions zeiger an die Lib zu übergeben.

So in PB.

Code: Alles auswählen

Procedure.l CreateAVMutex()
  ProcedureReturn CreateMutex()
EndProcedure

Mutex = test(@CreateAVMutex())

LockMutex(Mutex)
UnlockMutex(Mutex)

Debug Mutex
Und so in der Lib ungefähr

Code: Alles auswählen

int (*CreateMutex)(void);
int test(int (*CM)(void))
{
    CreateMutex = CM;
    return CreateMutex();
}
Habe das allerdings noch nicht richtig getestet aber geht es nicht auch irgendwie einfacher nicht so umständlich?

Mfg Nero
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: PB Mutex in Userlib?

Beitrag von Nero »

Ok ich mache das nun so mit dem Übergeben der FunKtions pointer.

Das funktioniert nun auch echt toll nur man muß dem Compiler unbedingt mit "__attribute__((stdcall))" mitteilen das er stdcall nehmen muß
und nicht cdecl sonst wundert man sich 2 Stunden lang warum man am laufendem Band nen IMA bekommt :bluescreen:

Hier mal mein Code ist recht simpel funktioniert aber soweit ganz gut.
PB:

Code: Alles auswählen

Structure EXPORT_FUNCTIONS
  *CreateMutex.l
  *LockMutex.l
  *UnlockMutex.l
  *FreeMutex.l
  *CreateSemaphore.l
  *SignalSemaphore.l
  *WaitSemaphore.l
  *FreeSemaphore.l
  *Delay.l
  *Debug.l
EndStructure


Procedure.l EXPCreateMutex()
  ProcedureReturn CreateMutex()
EndProcedure

Procedure  EXPLockMutex(*Mutex.l)
   LockMutex(*Mutex)
 EndProcedure
 
 Procedure  EXPUnlockMutex(*Mutex.l)
  UnlockMutex(*Mutex)
EndProcedure

Procedure  EXPFreeMutex(Mutex.l)
  FreeMutex(Mutex)
EndProcedure

Procedure  EXPCreateSemaphore()
  ProcedureReturn CreateSemaphore()
EndProcedure

Procedure  EXPSignalSemaphore(Semaphore.l)
   SignalSemaphore(Semaphore)
 EndProcedure
 
Procedure  EXPWaitSemaphore(Semaphore.l)
  ProcedureReturn WaitSemaphore(Semaphore)
EndProcedure

Procedure  EXPFreeSemaphore(Semaphore.l)
  FreeSemaphore(Semaphore)
EndProcedure

Procedure  EXPDelay(Delay.l)
  Delay(Delay)
EndProcedure

Procedure  EXPDebug(check.l)
  Debug(check)
EndProcedure

EXPORT.EXPORT_FUNCTIONS
EXPORT\CreateMutex     = @EXPCreateMutex()
EXPORT\LockMutex       = @EXPLockMutex()
EXPORT\UnlockMutex     = @EXPUnlockMutex()
EXPORT\FreeMutex       = @EXPFreeMutex()
EXPORT\CreateSemaphore = @EXPCreateSemaphore()
EXPORT\SignalSemaphore = @EXPSignalSemaphore()
EXPORT\WaitSemaphore   = @EXPWaitSemaphore()
EXPORT\FreeSemaphore   = @EXPFreeSemaphore()
EXPORT\Delay           = @EXPDelay()
EXPORT\Debug           = @EXPDebug()

LIB_INIT(EXPORT)
C:

Code: Alles auswählen

typedef struct IMPORT_FUNCTIONS
{
    int  (*CreateMutex)(void)       __attribute__((stdcall));
    void (*LockMutex)(int)          __attribute__((stdcall));
    void (*UnlockMutex)(int)        __attribute__((stdcall));
    void (*FreeMutex)(int)          __attribute__((stdcall));
    int  (*CreateSemaphore)(void)   __attribute__((stdcall));
    void (*SignalSemaphore)(int)    __attribute__((stdcall));
    void (*WaitSemaphore)(int)      __attribute__((stdcall));
    void (*FreeSemaphore)(int)      __attribute__((stdcall));
    void (*Delay)(int)              __attribute__((stdcall));
    void (*Debug)(int)              __attribute__((stdcall));
} __attribute__ ((packed)) IMPORT_FUNCTIONS;

IMPORT_FUNCTIONS * Imported;

void LIB_INIT(IMPORT_FUNCTIONS *imp)
{
      Imported = imp;
}
Wen jemand ne Idee hat wie das einfacher geht immer her damit, bin in sachen C noch der absolute noob und kenn daher nicht alle möglichkeiten die es geben könnte.

Mfg Nero
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: PB Mutex in Userlib?

Beitrag von NicTheQuick »

Ich frage mich ja eher, warum du nicht gleich die Mutexe nutzt, die es in C gibt. Schau dir dazu mal das hier an: PosixThreads

Zudem ist es nicht erlaubt einzelne PB-Funktionen als Lib zur Verfügung zu stellen (siehe Hilfe). Für den Privatgebrauch ist das aber kein Problem. :wink:
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: PB Mutex in Userlib?

Beitrag von Nero »

NicTheQuick hat geschrieben:Ich frage mich ja eher, warum du nicht gleich die Mutexe nutzt, die es in C gibt. Schau dir dazu mal das hier an: PosixThreads
Weil ich den Selben Mutex in der Lib und im Progie selbst nutzen wollte und wenn ich welche mit den Posix erstelle sind die Incompatiebel mit mit PB
NicTheQuick hat geschrieben:Zudem ist es nicht erlaubt einzelne PB-Funktionen als Lib zur Verfügung zu stellen (siehe Hilfe). Für den Privatgebrauch ist das aber kein Problem. :wink:
Naja die Lib stellt die Funktionen ja selbst nicht zu verfügung :)
So wie ich es zurzeit mache muß ich in meinem PB Progie der Lib erst die Funktionen als Funktionspointer zurverfügung stellen.
Damit verletzt das also keineswegs die PB Liezenz weil ich bevor ich die Lib nutzen kann die benötigten Funktionen als Pointer exportieren muß. :lol:

Das ist etwas umständlich aber ermöglicht mir in der Lib mit bewärten PB Funktionen zu arbeiten ohne etwas illegales zu tun.
Wäre halt cool wen man diesen Export etwas einfacher anstellen könnte.
Zuletzt geändert von Nero am 03.10.2011 14:40, insgesamt 1-mal geändert.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: PB Mutex in Userlib?

Beitrag von NicTheQuick »

Achso, ja. Jetzt hab ich das ganze erst richtig verstanden. Cool! 8)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: PB Mutex in Userlib?

Beitrag von edel »

Warum importierst du die einzelnen Funktionen nicht in deinem C Code?

Code: Alles auswählen

extern void * PB_CreateMutex()
naja, oder so aehnlich ;)
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: PB Mutex in Userlib?

Beitrag von Nero »

Hm bekomme da dann immer nen "Unresolved external symbol" fehler :cry:

Wie gesagt bin noch nicht so fit in C

EDIT:
Hm grad im Englischen Forum gelesen das die Funktionen in einer exe nicht exportiert werden daher dürfte das so auch nicht funktionieren oder?

Aber das ist ja eigentlich auch gut so weil sonst würde man ja einzelne befehle frei zugänglich machen was ja nicht gestattet ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: PB Mutex in Userlib?

Beitrag von edel »

Ich hoffe ich hab dich richtig verstanden, und du eine ganz normale Userlib bauen
willst. Wenn du PB Funktionen im C Code benoetigst, kannst du sie so in deinem
Code benutzen. Die (PB Mutex) Lib muss aber auch mit kompiliert werden, sonst
kommt es zu solchen Linker Fehlern. Kann man entweder in der DESC Datei angeben,
oder einfach einen Befehl aus der Lib im PB Quellcode benutzen, dann linkt der Linker
die MutexLIb automatisch mit.

Ach, denk mal an den stdcall Fehler, vielleicht musst du das dort auch angeben.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: PB Mutex in Userlib?

Beitrag von Nero »

:praise:

Ah nu gehts :allright: Danke

Code: Alles auswählen

extern int *PB_CreateMutex(void) __attribute__((stdcall));
Antworten