Hi All,
As every body knows we can't use global variables directly in the shared
library so i created a structure as a global variable and used global variables
inside structure.
Then i tryed to allocate memory for the structure variable in LibOpen finction
using MemPtrNew and free in LibClose function.
Library compiled fine and when i try to open it in my application it is
crashing.
here is my code
typedef struct
{
int x ;
int y ;
float z;
}GLOBALTEST;
GLOBALTEST *globaltest;
It is there in the global scope.
Then in my ECLibOpen function i allocated memory as shown below.
Err ECLibOpen(UInt16 refNum, UInt32 *clientContextP)
{
ECLibGlobalsType *gP;
Err err = errNone;
Int16 originalOpenCount = 0;
/* Error-check our parameters */
ErrFatalDisplayIf(
clientContextP == NULL,
"null context variable pointer");
/* Initialize return variable */
*clientContextP = 0;
/* Get library globals */
gP = PrvLockGlobals(refNum);
/* Check if already open */
if (!gP)
{
/* Allocate and initialize our library globals. */
gP = PrvMakeGlobals(refNum);
if ( !gP )
err = memErrNotEnoughSpace;
}
/* If we have globals, create a client context, increment open
* count, and unlock our globals */
if ( gP )
{
originalOpenCount = gP->openCount;
globaltest=MemPtrNew(sizeof(GLOBALTEST)); //Here
err = PrvCreateClientContext(gP, clientContextP);
if ( !err )
gP->openCount++;
PrvUnlockGlobals(gP);
/* If there was an error creating a client context and there */
/* are no other clients, free our globals */
if ( err && (originalOpenCount == 0) )
PrvFreeGlobals(refNum);
}
return( err );
}
And EClibClose i am freeing
Err ECLibClose(UInt16 refNum, UInt32 clientContext)
{
ECLibGlobalsType * gP;
Int16 openCount;
Int16 contextCount;
Err err = errNone;
gP = PrvLockGlobals(refNum);
/* If not open, return */
if (!gP)
{
/* MUST return zero here to get around a bug in system v1.x that
* would cause SysLibRemove to fail. */
MemPtrFree(globaltest);
return errNone;
}
/* Destroy the client context (we ignore the return code in this
implementation) */
PrvDestroyClientContext(gP, clientContext);
/* Decrement our library open count */
gP->openCount--;
/* Error check for open count underflow */
ErrFatalDisplayIf(gP->openCount < 0, "ECLib open count underflow");
/* Save the new open count and the context count */
openCount = gP->openCount;
contextCount = gP->contextCount;
PrvUnlockGlobals(gP);
/* If open count reached zero, free our library globals */
if ( openCount <= 0 )
{
/* Error check to make sure that all client contexts were
destroyed */
ErrFatalDisplayIf(contextCount != 0, "not all client contexts
were destroyed");
/* Free our library globals */
PrvFreeGlobals(refNum);
}
else
{
/* return this error code to inform the caller
* that others are still using this library */
err = ECLibErrStillOpen;
}
return err;
}
Can any body help me where i am doing wrong.
Thanks in advance,
Regards,
Harsha
--
For information on using the PalmSource Developer Forums, or to unsubscribe,
please see http://www.palmos.com/dev/support/forums/