ClRcT _clGmsDbClose(
           CL_IN    ClGmsDbT*  const  gmsDb,
           CL_IN    const ClUint64T   numOfGroups)
{
    ClRcT   rc = CL_OK;
    ClInt32T   i = 0x0;

    if (gmsDb == NULL)
        return CL_ERR_NULL_POINTER;

    for (i=0; i < numOfGroups; i++) 
    {
       rc =_clGmsDbDestroy(&gmsDb[i]); 

       if (rc != CL_OK) return rc;

       rc = clOsalMutexDelete(gmsDb[i].viewMutex);
       if (rc != CL_OK) return rc;

       rc = clOsalMutexDelete(gmsDb[i].trackMutex);
       if (rc != CL_OK) return rc;
    }
        
    clHeapFree((void*)gmsDb);

    return rc;
}
static ClRcT 
clBitmapInfoInitialize(ClBitmapInfoT  *pBitmapInfo, 
                       ClUint32T      bitNum)
{
    ClRcT          rc           = CL_OK;    

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Enter"));

    rc = clOsalMutexCreate(&(pBitmapInfo->bitmapLock));
    if( CL_OK != rc )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clOsalMutexCreate() rc: %x", rc));
        return rc;
    }

    pBitmapInfo->pBitmap  = NULL;
    pBitmapInfo->nBytes   = 0;
    pBitmapInfo->nBits    = 0;
    pBitmapInfo->nBitsSet = 0;
    rc = clBitmapRealloc(pBitmapInfo, bitNum);    
    if( CL_OK != rc )
    {
        clOsalMutexDelete(pBitmapInfo->bitmapLock);
        return rc;
    }
    pBitmapInfo->nBits = bitNum + 1; /* bitNum is 0-based FIXME i felt this is
                                      wrong*/
    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Exit"));
    return rc;
}
ClRcT
clBitmapDestroy(ClBitmapHandleT  hBitmap)
{
    ClRcT          rc           = CL_OK;
    ClBitmapInfoT  *pBitmapInfo = hBitmap;

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Enter"));

    if( CL_BM_INVALID_BITMAP_HANDLE == hBitmap )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Invalid Handle"));
        return CL_BITMAP_RC(CL_ERR_INVALID_HANDLE);
    }

    do
    {
        rc = clOsalMutexDelete(pBitmapInfo->bitmapLock);
    }while( CL_OSAL_ERR_MUTEX_EBUSY == rc );

    clHeapFree(pBitmapInfo->pBitmap);
    clHeapFree(pBitmapInfo);

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Exit"));
    return rc;
}
/*
 * This api would be called when alarm library is being finalize
 */
ClRcT clAlarmPayloadCntDeleteAll(void)
{
    ClRcT rc = CL_OK;
    clOsalMutexLock(gClAlarmPayloadCntMutex);
    rc = clCntDelete(gPayloadCntHandle);
    clOsalMutexUnlock(gClAlarmPayloadCntMutex);    
    clOsalMutexDelete(gClAlarmPayloadCntMutex);

    if(CL_OK != rc)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("container deletion failed [%x]",rc));
        return rc;
    }
	return rc;
}
static ClRcT
tsActiveTimersQueueCreate (void)
{
    ClRcT returnCode = CL_ERR_INVALID_HANDLE;
    CL_FUNC_ENTER();

    gActiveTimerQueue.pFirstTimer = NULL;
    gActiveTimerQueue.pLastTimer = NULL;


    returnCode = clOsalMutexCreate (&gActiveTimerQueue.timerMutex);
    if (returnCode != CL_OK) {
        CL_FUNC_EXIT();
        return (returnCode);
    }

    gActiveTimerQueue.tickInMilliSec = gTimerConfig.timerResolution;

    /* spawn off the timer-task */
    returnCode = clOsalTaskCreateAttached("TIMER TASK",
                                          CL_OSAL_SCHED_OTHER,
                                          CL_OSAL_THREAD_PRI_NOT_APPLICABLE,  /* gTimerConfig.timerTaskPriority: Normally it would be this, but OTHER scheduling has no priority */
                                          TIMER_TASK_STACK_SIZE,
                                          tsTimerTask,
                                          NULL,
                                          &gActiveTimerQueue.timerTaskId);

    if (returnCode != CL_OK) {
        if(CL_OK != clOsalMutexDelete (gActiveTimerQueue.timerMutex)) {
            CL_FUNC_EXIT();
            return(returnCode);
        }
        CL_FUNC_EXIT();
        return (returnCode);
    }

    gActiveTimerQueue.timerServiceInitialized = 1;

    CL_FUNC_EXIT();
    return (CL_OK);
}
static ClRcT
tsActiveTimersQueueDestroy (void)
{
    ClRcT returnCode = CL_ERR_INVALID_HANDLE;
    TsTimer_t* pUserTimer = NULL;
    TsTimer_t* pNextUserTimer = NULL;

    CL_FUNC_ENTER();
    returnCode = clOsalMutexLock (gActiveTimerQueue.timerMutex);

    if (returnCode != CL_OK) {
        CL_FUNC_EXIT();
        return (returnCode);
    }

    pNextUserTimer = NULL;

    for (pUserTimer = gActiveTimerQueue.pFirstTimer;
            pUserTimer != NULL;
            pUserTimer = pNextUserTimer) {

        pNextUserTimer = pUserTimer->pNextActiveTimer;

        returnCode = clOsalMutexUnlock (gActiveTimerQueue.timerMutex);

        returnCode = clTimerDelete ((ClTimerHandleT*)&pUserTimer);

        returnCode = clOsalMutexLock (gActiveTimerQueue.timerMutex);
    }

    gActiveTimerQueue.timerServiceInitialized = 0;

    returnCode = clOsalMutexUnlock (gActiveTimerQueue.timerMutex);

    returnCode = clOsalMutexDelete (gActiveTimerQueue.timerMutex);

    CL_FUNC_EXIT();
    return (returnCode);
}
ClRcT   ckptShutDown()
{
    /*
     * Uninstall the notification callback function
     */
    if(CL_HANDLE_INVALID_VALUE != gIocCallbackHandle)
    {
        clCpmNotificationCallbackUninstall(&gIocCallbackHandle);
    }
    /*
     * Inform peers about the departure.
     */
    ckptSvrDepartureAnnounce();

    /*
     * Finalize the event library.
     */
    ckptEventSvcFinalize();

    /*
     * Uninstall the native client table.
     */
    clEoClientUninstall (gCkptSvr->eoHdl, CL_EO_NATIVE_COMPONENT_TABLE_ID);

    /*
     * Finalize the gms library.
     */
    clGmsFinalize(gCkptSvr->gmsHdl);

    /*
     * Cleanup the resources acquired bu the ckpt server.
     */
    clOsalMutexLock(&gCkptSvr->ckptClusterSem);
    ckptSvrCbFree(gCkptSvr);
    clOsalMutexUnlock(&gCkptSvr->ckptClusterSem);
    clOsalMutexDelete(gCkptSvr->ckptActiveSem);
    return CL_OK;
}
ClRcT clEvtTestAppFinalize()
{

    ClRcT rc = CL_OK;

    ClEoExecutionObjT *pEoObj;

    /*
     * Delete the list maintaining the mapping b/n Init Name & evtHandle 
     */
    clCntDelete(gEvtTestInitInfo);

    /*
     * Delete the Mutes for the List in Init 
     */
    clOsalMutexDelete(gEvtTestInitMutex);

    rc = clEoMyEoObjectGet(&pEoObj);

    rc = clEoClientUninstall(pEoObj, CL_EO_NATIVE_COMPONENT_TABLE_ID);

    return CL_OK;
}
ClRcT
clAmsSAFinalize(
        CL_IN       ClAmsClientHandleT          amsHandle)
{

    ClRcT                                       rc;
    clAmsClientFinalizeRequestT                 req;
    clAmsClientFinalizeResponseT                *res = NULL;
    struct ams_instance                         *ams_instance = NULL;

    /* 
     * Checkout the client handle 
     */

    if ( (rc = clHandleCheckout(
                    handle_database,
                    amsHandle,
                    (void *)&ams_instance))
            != CL_OK )
        goto error;

    if ( ( rc = clOsalMutexLock(ams_instance->response_mutex)) != CL_OK )
        goto error;

    /*
     * Another thread has already started finalizing
     */

    if (ams_instance->finalize)
    {
        if (( rc = clOsalMutexUnlock(ams_instance->response_mutex)) != CL_OK )
            goto error;
        clHandleCheckin(handle_database, amsHandle);
        rc = CL_ERR_INVALID_HANDLE;
        goto error;
    }

    ams_instance->finalize = 1;

    if ( (rc = clOsalMutexUnlock(ams_instance->response_mutex)) != CL_OK )
        goto error;

    /* 
     * Send the information to the server to finalize the 
     * corresponding handle 
     */

    req.handle = ams_instance->server_handle;
    if ( (rc = cl_ams_client_finalize(
                    &req,
                    &res))
            != CL_OK )
        goto error;

    /*
     * Delete the Mutex
     */

    if ( (rc = clOsalMutexDelete (ams_instance->response_mutex) ) != CL_OK )
        goto error;

    /* 
     * Destroy the handle 
     */

    if ( (rc = clHandleDestroy(
                    handle_database,
                    amsHandle))
            != CL_OK )
        goto error;

    /* 
     * Check-In the handle 
     */

    if ( (rc = clHandleCheckin(
                    handle_database,
                    amsHandle))
            != CL_OK )
        goto error;

    clHeapFree((void*)res);
    res = NULL;
    return CL_OK;

error:

    clHeapFree((void*)res);
    res = NULL;
    return CL_AMS_RC(rc);

}
ClRcT
clInstInitId()
{
    ClRcT           rc          = CL_OK;
    InstrumentedId *tmpPtr      = 0;

    CL_FUNC_ENTER();
    // check whether the id has been initialized
    if (myInstId != 0)
    {
        CL_FUNC_EXIT();
        return CL_OK;
    }

    if (sock == -1)
    {
        rc = initSocket();
        if (rc != CL_OK)
        {
            clOsalPrintf("failed to initialize instrumentation socket\n");
            return rc;
        }
    }


    // Nope, not initialized, so try to initialize it here.
    // First, try to lock a mutex so that only one thread
    // will be creating the id.
    // Then, try to get our component name, our local node name
    // and then allocate the id and set it from the component
    // and local node name.
    // Finally, unlock and delete the mutex.
    if (!id_mutex)
    {
        if ((rc = clOsalMutexCreateAndLock(&id_mutex)) != CL_OK)
        {
            clOsalPrintf("Failed [0x%x] to create and lock mutex\n", rc);
            CL_FUNC_EXIT();
            return rc;
        }
    }
    else
    {
        // Some other thread must have come through here and set
        // the mutex before us.  We're done.
        CL_FUNC_EXIT();
        return CL_OK;
    }

    if ((tmpPtr = clHeapCalloc(1, sizeof (InstrumentedId))) == 0)
    {
        clOsalPrintf("failed to allocate InstrumentedID\n");
        rc = CL_RC(0, CL_ERR_NO_MEMORY);
        goto breakdown;
    }
    memset(&tmpPtr->compName, 0, sizeof tmpPtr->compName);
    memset(&tmpPtr->nodeName, 0, sizeof tmpPtr->nodeName);
    rc = CL_OK;
    myInstId = tmpPtr;
    tmpPtr = 0;

breakdown:
    clOsalMutexUnlock(id_mutex);
    clOsalMutexDelete(id_mutex);
    id_mutex = 0;

    CL_FUNC_EXIT();
    return rc;
}
/* Handle destructor function. */
static void clDispatchHandleDestructor(void* cbArgs)
{
    ClRcT   rc = CL_OK;
    ClDispatchDbEntryT* thisDbEntry = NULL;
    ClUint32T   queueSize = 0;
    ClDispatchCbQueueDataT*   queueData = NULL;

    if (cbArgs == NULL)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Handle destructor is called with NULL pointer"));
        return;
    }

    thisDbEntry = (ClDispatchDbEntryT*)cbArgs;

    /* Lock the queue mutex */
    rc = clOsalMutexLock(thisDbEntry->dispatchMutex);
    if (rc != CL_OK)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Unable to lock dispatch Mutex in Handle destructor callback"));
        return;
    }

    /*
     * Before deleting the queue you need to flush the queue.
     * Even though clQueueDelete will flush the node, we need
     * handle it explicitly so that we can invoke
     * ClDispatchQueueDestroyCallbackT registered during Register
     * which will deallocate the memory for the callback arguments.
     */
    rc = clQueueSizeGet(thisDbEntry->cbQueue, &queueSize);
    if (rc != CL_OK)
    {
        goto proceed_other_functions;
    }

    while (queueSize != 0)
    {
        rc = clQueueNodeDelete(thisDbEntry->cbQueue, (ClQueueDataT*)&queueData);
        if (rc != CL_OK)
        {
            goto proceed_other_functions;
        }
        CL_ASSERT(queueData != NULL);

        /* Invoke the queue destroy callback function */
        thisDbEntry->queueDestroyCallback(queueData->callbackType,
                                          queueData->callbackArgs);

        rc = clQueueSizeGet(thisDbEntry->cbQueue, &queueSize);
        if (rc != CL_OK)
        {
            goto proceed_other_functions;
        }
    }

proceed_other_functions:
    /* 
     * Delete the queue. This will also flush the queue. So all the
     * pending callbacks will be flushed.
     */
    rc = clQueueDelete(&thisDbEntry->cbQueue);
    if (rc != CL_OK)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Unable to delete the queue. Rc = 0x%x",rc));
    }
        
    /* Delete the pipe */
    errno = 0;
    if ((close(thisDbEntry->readFd)) < 0)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Unable to close write fd of the pipe:%s",strerror(errno)));
    }

    errno = 0;
    if ((close(thisDbEntry->writeFd)) < 0)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Unable to close read fd of the pipe:%s",strerror(errno)));
    }


    /* Delete the mutex */
    rc = clOsalMutexUnlock(thisDbEntry->dispatchMutex);
    if (rc != CL_OK)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Failed to unlock the dispatch mutex"));
    }
    rc = clOsalMutexDelete(thisDbEntry->dispatchMutex);
    if (rc != CL_OK)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                ("Failed to delete the dispatch mutex"));
    }


    return;
}
ClRcT clSnmpMutexFini(void)
{
    return clOsalMutexDelete(gOper.mtx);
}
예제 #13
0
ClRcT clRmdObjClose(ClRmdObjHandleT p)
{
#if 0 // Don't know why safplus_amf process hang at clOsalMutexLock(pRmdObject->semaForRecvHashTable)
    ClRcT retCode = CL_OK;
    ClRmdObjT *pRmdObject = NULL;

    CL_FUNC_ENTER();

    pRmdObject = (ClRmdObjT *) p;

    if (NULL == pRmdObject)
    {
        RMD_DBG1((" RMD  Invalid rmd handle in objclose\n"));
        CL_FUNC_EXIT();
        return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
    }

    /*
     * Avoid deleting the mutexes so its still valid in case any context is abusing the terminate
     * and initiating or not quitting the rmd sends.
     */

    retCode = clOsalMutexDelete(pRmdObject->semaForRecvHashTable);

    if (CL_OK != retCode)
    {
        RMD_DBG1((" RMD Recv mutex delete failed\n"));
    }
    
    retCode = clOsalMutexDelete(pRmdObject->semaForSendHashTable);

    if (CL_OK != retCode)
    {
        RMD_DBG1((" RMD Send mutex delete failed\n"));
    }

    clOsalMutexLock(pRmdObject->semaForRecvHashTable);
    retCode = clCntDelete(pRmdObject->rcvRecContainerHandle);
    if (CL_OK != retCode)
    {
        RMD_DBG1((" RMD rcv hash table destroy failed\n"));
    }
    pRmdObject->rcvRecContainerHandle = 0;
    clOsalMutexUnlock(pRmdObject->semaForRecvHashTable);

    clOsalMutexLock(pRmdObject->semaForSendHashTable);
    retCode = clCntDelete(pRmdObject->sndRecContainerHandle);
    if (CL_OK != retCode)
    {
        RMD_DBG1((" RMD snd hash table destroy failed\n"));

    }
    pRmdObject->sndRecContainerHandle = 0;
    clOsalMutexUnlock(pRmdObject->semaForSendHashTable);

    retCode = clHandleDatabaseDestroy(pRmdObject->responseCntxtDbHdl);
    if (CL_OK != retCode)
    {
        RMD_DBG1((" RMD snd hash table destroy failed\n"));

    }
    pRmdObject->responseCntxtDbHdl = 0;

    /*
     * Don't release the rmd context to respect abusers or initiators of rmd send outside
     * terminate callback contexts.
     */
    clHeapFree(pRmdObject);
#endif

    CL_FUNC_EXIT();
    return (CL_OK);
}
예제 #14
0
ClRcT clRmdObjInit(ClRmdObjHandleT *p)
{
    ClRcT retCode = CL_OK;
    ClRmdObjT *pRmdObject = NULL;
    //unsigned long timeStamp = 0;
    struct timeval tm1;

#ifdef DEBUG
    static ClUint8T rmdAddedTodbgComp = CL_FALSE;

    if (CL_FALSE == rmdAddedTodbgComp)
    {
        retCode = dbgAddComponent(COMP_PREFIX, COMP_NAME, COMP_DEBUG_VAR_PTR);
        rmdAddedTodbgComp = CL_TRUE;
        if (CL_OK != retCode)
        {
            clLogError("OBG","INI","dbgAddComponent FAILED ");
            CL_FUNC_EXIT();
            return retCode;
        }
    }
#endif
    CL_FUNC_ENTER();

    if (NULL == p)
    {
        RMD_DBG1((" RMD Invalid Object handle passed\n"));
        CL_FUNC_EXIT();
        return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
    }

    retCode = clOsalInitialize(NULL);

    retCode = clTimerInitialize(NULL);
    pRmdObject = (ClRmdObjT *) clHeapAllocate(sizeof(ClRmdObjT));

    if (NULL == pRmdObject)
    {
        RMD_DBG1((" RMD No Memory\n"));
        CL_FUNC_EXIT();
        return ((CL_RMD_RC(CL_ERR_NO_MEMORY)));
    }

    gettimeofday(&tm1, NULL);
    //timeStamp = tm1.tv_sec * 1000000 + tm1.tv_usec;
    pRmdObject->msgId = 1;
    retCode = clOsalMutexCreate(&pRmdObject->semaForSendHashTable);

    if (CL_OK != CL_GET_ERROR_CODE(retCode))
    {
        RMD_DBG1((" RMD send Mutex creation failed\n"));
        CL_FUNC_EXIT();
        return (retCode);
    }
    retCode = clOsalMutexCreate(&pRmdObject->semaForRecvHashTable);

    if (CL_OK != CL_GET_ERROR_CODE(retCode))
    {
        RMD_DBG1((" RMD  recv Mutex creation failed\n"));

        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForSendHashTable));
        CL_FUNC_EXIT();
        return (retCode);
    }

    retCode =
        clCntHashtblCreate(NUMBER_OF_RECV_BUCKETS, recvKeyCompare,
                           recvHashFunction, recvHashDeleteCallBack,
                           recvHashDeleteCallBack, CL_CNT_UNIQUE_KEY,
                           &pRmdObject->rcvRecContainerHandle);
    if (CL_OK != CL_GET_ERROR_CODE(retCode))
    {
        RMD_DBG1((" RMD  send Hash table creation failed\n"));

        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForRecvHashTable));
        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForSendHashTable));
        CL_FUNC_EXIT();
        return (retCode);
    }
    retCode =
        clCntHashtblCreate(NUMBER_OF_SEND_BUCKETS, sendKeyCompare,
                           sendHashFunction, sendHashDeleteCallBack,
                           sendHashDestroyCallBack, CL_CNT_UNIQUE_KEY,
                           &pRmdObject->sndRecContainerHandle);
    if (CL_OK != CL_GET_ERROR_CODE(retCode))
    {
        RMD_DBG1((" RMD  recv Hash table creation failed\n"));

        IGNORE_RETURN(clCntDelete(pRmdObject->rcvRecContainerHandle));
        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForRecvHashTable));
        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForSendHashTable));
        CL_FUNC_EXIT();
        return (retCode);
    }

    pRmdObject->responseCntxtDbHdl = 0;
    retCode = clHandleDatabaseCreate(NULL, &pRmdObject->responseCntxtDbHdl);
    if (retCode != CL_OK)
    {
        RMD_DBG1((" RMD  Sync Handle Database create failed\n"));
        IGNORE_RETURN(clCntDelete(pRmdObject->sndRecContainerHandle));
        IGNORE_RETURN(clCntDelete(pRmdObject->rcvRecContainerHandle));
        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForRecvHashTable));
        IGNORE_RETURN(clOsalMutexDelete(pRmdObject->semaForSendHashTable));

        CL_FUNC_EXIT();
        return retCode;
    }

    pRmdObject->numAtmostOnceEntry = 0;
    pRmdObject->lastAtmostOnceCleanupTime = clOsalStopWatchTimeGet();
    pRmdObject->rmdStats.nRmdCalls = 0;
    pRmdObject->rmdStats.nFailedCalls = 0;
    pRmdObject->rmdStats.nResendRequests = 0;
    pRmdObject->rmdStats.nRmdReplies = 0;
    pRmdObject->rmdStats.nBadReplies = 0;
    pRmdObject->rmdStats.nRmdRequests = 0;
    pRmdObject->rmdStats.nBadRequests = 0;
    pRmdObject->rmdStats.nCallTimeouts = 0;
    pRmdObject->rmdStats.nDupRequests = 0;
    pRmdObject->rmdStats.nAtmostOnceCalls = 0;
    pRmdObject->rmdStats.nResendReplies = 0;
    pRmdObject->rmdStats.nReplySend = 0;
    pRmdObject->rmdStats.nRmdCallOptimized = 0;
    *p = (ClRmdObjHandleT) pRmdObject;
    CL_FUNC_EXIT();
    return (CL_OK);
}
/**
 *  Creates a new Extended State machine Instance.
 *
 *  This API creates a new Extended State macine Instance of given
 *  state machine type.  The extended state machine shall include
 *  all the regular state machine instance functionalities, plus
 *  additional event queue, history, and lock capabilities.
 *                                                                        
 *  @param sm       State machine type 
 *  @param instance [out] newly created extended state machine instance
 *
 *  @returns 
 *    CL_OK on CL_OK <br/>
 *    CL_SM_RC(CL_ERR_NO_MEMORY) on memory allocation FAILURE <br/>
 *    CL_SM_RC(CL_ERR_NULL_POINTER) on invalid/null sm / instance <br/>
 *
 *  @see #clEsmInstanceDelete
 */
ClRcT
clEsmInstanceCreate(ClSmTemplatePtrT sm, 
                  ClExSmInstancePtrT* instance
                  )
{
  ClRcT ret = CL_OK;

  CL_FUNC_ENTER();
  CL_ASSERT(instance);  
  CL_ASSERT(sm);  

  clLogTrace(ESM_LOG_AREA,ESM_LOG_CTX_CREATE,"Create Extended State Machine Instance");

  if(sm && instance) 
    {
      /* allocate the instance space */
      *instance = (ClExSmInstancePtrT) mALLOC(sizeof(ClExSmInstanceT));
      if(*instance!=0) 
        {
          memset(*instance, 0, sizeof(ClExSmInstanceT));
          /* call sm create here */
          ret = clSmInstanceCreate(sm, &(*instance)->fsm);
          if(ret == CL_OK)
            {
              ret = clOsalMutexCreate(&(*instance)->lock);
              if (CL_OK != ret)
              {
                  clSmInstanceDelete((*instance)->fsm);
                  mFREE(*instance);
                  ret = SM_ERR_NO_SEMA;
              }
              else
              {
              /* create queue and init */
              ret = SMQ_CREATE((*instance)->q);
              if(ret == CL_OK)
                {
                  /* init log buffer */
                  ESM_LOG_INIT((*instance)->log, ESM_LOG_ENTRIES);
                }
              if(!(*instance)->log.buffer || ret != CL_OK)
                {
                  /* delete the instance */
                  ret = clSmInstanceDelete((*instance)->fsm);
                  /* delete the mutex */
                  clOsalMutexDelete((*instance)->lock);
                  /* check if q init succeeded */
                  if(ret == CL_OK)
                    {
                      /* delete the queue */
                      clQueueDelete(&((*instance)->q));
                    }
                  /* free the instance */
                  mFREE(*instance);
                  ret = CL_SM_RC(CL_ERR_NO_MEMORY);
                }
              }
            }
          
        } else 
          {
            ret = CL_SM_RC(CL_ERR_NO_MEMORY);
          }
    } else 
      {
        ret = CL_SM_RC(CL_ERR_NULL_POINTER);
      }
  
  CL_FUNC_EXIT();
  return ret;
}
/** 
 *  Delete Extended State machine Instance.
 *  
 *  API to delete a previously created State macine Instance. Also
 *  frees up the events that are in the Q.
 *                                                                        
 *  @param smThis Extended State machine Instance to be deleted
 *
 *  @returns 
 *    CL_OK on CL_OK <br/>
 *    CL_SM_RC(CL_ERR_NULL_POINTER) on invalid/null instance handle <br/>
 *
 *  @see #clEsmInstanceCreate
 *
 */
ClRcT 
clEsmInstanceDelete(ClExSmInstancePtrT smThis
                 )
{
  ClRcT ret = CL_OK;

  CL_FUNC_ENTER();
  CL_ASSERT(smThis);  

  clLogTrace(ESM_LOG_AREA,ESM_LOG_CTX_DELETE,"Delete Extended State Machine Instance");

  if(smThis) 
    {
      ClUint32T sz = 0;

      if(ESM_LOCK(smThis)!=CL_OK)
        {
          ret = SM_ERR_LOCKED;
          CL_FUNC_EXIT();
          return ret;
        }

      /* free the fsm first */
      ret = clSmInstanceDelete(smThis->fsm);

      SMQ_SIZE(smThis->q, sz);
      /* Check if the queue is empty, if not, dequeue and delete them */
      if(sz > 0) 
        {
          ClSmQueueItemPtrT item;
          ClRcT rc;

          rc = SMQ_DEQUEUE(smThis->q, item);
          while(rc==CL_OK && item)
            {
              mFREE(item);
              rc = SMQ_DEQUEUE(smThis->q, item);
            }
          clLogInfo(ESM_LOG_AREA,ESM_LOG_CTX_DELETE,"***Delete: Events are present in Q! Dropped to floor!!! ***");
        }

      /* delete the queue */
      clQueueDelete(&smThis->q);

      /* free the history buffer */
      mFREE(smThis->log.buffer);

      /* unlock it before, so we can delete the mutex */
      ESM_UNLOCK(smThis);

      /* delete the mutex */
      clOsalMutexDelete(smThis->lock);

      /* free the object */
      mFREE(smThis);
    } else 
      {
        ret = CL_SM_RC(CL_ERR_NULL_POINTER);
      }

  CL_FUNC_EXIT();
  return ret;
}