wait_queue_head_t osl_waitqueue_create
    (
    int         options                /* semaphore option modes */
    )
    {
    SEM_ID semId;/*lint !e578 */

    if ((semId = (SEM_ID) objAlloc (semClassId)) == NULL)
	return (NULL);

    /* initialize allocated semaphore */

    if (semQueueInit (semId, options, 0) != OK)
	{
	objFree (semClassId, (char *) semId);
	return (NULL);
	}

    /* mark object memory to be freed during automatic resource reclamation */
	/*lint -save -e115*/

    OBJ_SET_DEALLOC_MEM (&semId->objCore);
	/*lint -restore +e115*/

#ifdef _WRS_CONFIG_SV_INSTRUMENTATION
    /* system viewer - level 1 event logging */
    EVT_OBJ_3 (semId, semClassId, EVENT_SEMCCREATE,
               semId, options, initialCount);
#endif /* _WRS_CONFIG_SV_INSTRUMENTATION */

    return (wait_queue_head_t)(semId);
    }
Example #2
0
STATUS semDestroy(SEM_ID semId, BOOL dealloc)
{
    int level;

    level = intLock();

    if(!IS_CLASS(semId, semClassId))
    {
        return (ERROR);
    }

    objCoreTerminate(&semId->objCore);

    kernelState = TRUE;

    intUnlock(level);

    kernelSemDelete(semId);

    TASK_SAFE();

    kernelExit();

    if(dealloc)
    {
        objFree(semClassId, (char*)semId);
    }

    TASK_UNSAFE();

    return (OK);
}
Example #3
0
File: semBLib.c Project: phoboz/vmx
SEM_ID semBCreate(
    int         options,
    SEM_B_STATE state
    )
{
    SEM_ID semId;

    /* Check if lib is installed */
    if (semBLibInstalled != TRUE)
    {
        errnoSet(S_semLib_NOT_INSTALLED);
        semId = NULL;
    }
    else
    {
        /* Allocate memory */
        semId = (SEM_ID) objAlloc(semClassId);
        if (semId != NULL)
        {
            /* Initialze structure */
            if (semBInit(semId, options, state) != OK)
            {
                objFree(semClassId, semId);
                semId = NULL;
            }
        }
    }

    return semId;
}
Example #4
0
File: vmLib.c Project: phoboz/vmx
STATUS vmContextDestroy(
    VM_CONTEXT_ID context
    )
{
    STATUS status;

    /* Verify object class */
    if (OBJ_VERIFY(context, vmContextClassId) != OK)
    {
        status = ERROR;
    }
    else
    {
        semTake(&context->sem, WAIT_FOREVER);

        if (MMU_TRANS_TABLE_DESTROY(context->mmuTransTable) != OK)
        {
            status = ERROR;
        }
        else
        {
            /* Free datastructure */
            objFree(vmContextClassId, context);
            status = OK;
        }
    }

    return status;
}
Example #5
0
WDOG_ID wdCreate (void)
{
    WDOG_ID wdId;
#ifdef WV_INSTRUMENTATION
    int level;
#endif

    if ((!wdLibInstalled) && (wdLibInit () != OK))
        return (NULL);				/* package init problem */

    wdId = (WDOG_ID) objAlloc (wdClassId);


    /* initialize allocated watchdog */

    if ((wdId != NULL) && (wdInit (wdId) != OK))
    {
        objFree (wdClassId, (char *) wdId);
        return (NULL);
    }

#ifdef WV_INSTRUMENTATION
    /* windview - level 1 event logging */
    level = intLock ();
    EVT_OBJ_1 (OBJ, wdId, wdClassId, EVENT_WDCREATE, wdId);
    intUnlock (level);
#endif

    return (wdId);
}
Example #6
0
SEM_ID semBCreate
(
    int         options,                /* semaphore options */
    SEM_B_STATE initialState            /* initial semaphore state */
)
{
    SEM_ID semId;

    if ((!semBLibInstalled) && (semBLibInit () != OK))	/* initialize package */
    {
		return (NULL);
    }

    if ((semId = (SEM_ID) objAlloc (semClassId)) == NULL)
    {
		return (NULL);
    }

    /* initialize allocated semaphore */

    if (semBInit (semId, options, initialState) != OK)
	{
		objFree (semClassId, (char *) semId);
		return (NULL);
	}

    return (semId);
}
Example #7
0
File: wdLib.c Project: phoboz/vmx
WDOG_ID wdCreate(
    void
    )
{
    WDOG_ID wdId;

    if (wdLibInstalled != TRUE)
    {
        wdId = NULL;
    }
    else
    {
        /* Allocate struct */
        wdId = (WDOG_ID) objAlloc(wdClassId);
        if (wdId != NULL)
        {
            /* Initialize object */
            if (wdInit(wdId) != OK)
            {
                objFree(wdClassId, wdId);
                wdId = NULL;
            }
        }
    }

    return wdId;
}
Example #8
0
File: vmLib.c Project: phoboz/vmx
VM_CONTEXT_ID vmContextCreate(
    void
    )
{
    VM_CONTEXT_ID context;

    if (vmLibInstalled != TRUE)
    {
        errnoSet(S_vmLib_NOT_INSTALLED);
        context = NULL;
    }
    else
    {
        /* Allocate object */
        context = (VM_CONTEXT *) objAlloc(vmContextClassId);
        if (context != NULL)
        {
            /* Initialize structure */
            if (vmContextInit(context) != OK)
            {
                objFree(vmContextClassId, context);
                context = NULL;
            }
        }
    }

    return context;
}
Example #9
0
static STATUS msgQDestroy(MSG_Q_ID msgQId, BOOL dealloc)
{
	Q_JOB_NODE* pNode;
	FAST int timeout;
	FAST int nMsgs;
	
	/* TODO isr not allowed */

	TASK_SAFE();
	TASK_LOCK();

	if(!IS_CLASS(msgQId, msgQClassId))
	{
		TASK_UNLOCK();
		TASK_UNSAFE();
		return (ERROR);
	}

	objCoreTerminate(&msgQId->objCore);

	TASK_UNLOCK();

	timeout = NO_WAIT;
	nMsgs = 0;

	while(nMsgs < msgQId->maxMsgs)
	{
		while(((pNode = qJobGet(msgQId, &msgQId->freeQ, timeout)) != NULL) &&
			(pNode != (Q_JOB_NODE*)NONE))
		{
			nMsgs++;
		}

		while(((pNode = qJobGet(msgQId, &msgQId->msgQ, timeout)) != NULL) &&
			(pNode != (Q_JOB_NODE*)NONE))
		{
			nMsgs++;
		}

		timeout = 1;
	}

	kernelState = TRUE;

	qJobTerminate(&msgQId->msgQ);
	qJobTerminate(&msgQId->freeQ);

	kernelExit();

	if(dealloc)
	{
		objFree(msgQClassId, (char*)msgQId);
	}

	TASK_UNSAFE();

	return (OK);
}
Example #10
0
File: wdLib.c Project: phoboz/vmx
STATUS wdDestroy(
    WDOG_ID wdId,
    BOOL dealloc
    )
{
    STATUS status;
    int level;

    /* Not callable from interrupts */
    if (INT_RESTRICT() != OK)
    {
        status = ERROR;
    }
    else
    {
        /* Lock interrupts */
        INT_LOCK(level);

        /* Verify object */
        if (OBJ_VERIFY(wdId, wdClassId) != OK )
        {
            INT_UNLOCK(level);
            status = ERROR;
        }
        else
        {
            /* Terminate object */
            objCoreTerminate(&wdId->objCore);

            /* Enter kernel */
            kernelState = TRUE;

            /* Unlock interrupts */
            INT_UNLOCK(level);

            /* Cancel watchdog timer */
            vmxWdCancel(wdId);
            wdId->status = WDOG_DEAD;

            taskSafe();

            /* Exit kernel */
            vmxExit();

            /* Deallocate if requested */
            if (dealloc == TRUE)
            {
                objFree(wdClassId, wdId);
            }

            taskUnsafe();
            status = OK;
        }
    }

    return status;
}
Example #11
0
STATUS hashTblDestroy
    (
    HASH_ID hashId,             /* id of hash table to destroy */
    BOOL    dealloc             /* deallocate associated memory */
    )
    {
    if (OBJ_VERIFY (hashId, hashClassId) != OK)
	return (ERROR);				/* invalid hash id */

    objCoreTerminate (&hashId->objCore);	/* terminate core */

    if (dealloc)
	return (objFree (hashClassId, (char *) hashId));

    return (OK);
    }
Example #12
0
File: semLib.c Project: phoboz/vmx
STATUS semDestroy(
    SEM_ID semId,
    BOOL   deallocate
    )
{
    STATUS status;
    int level;

    if (INT_RESTRICT() != OK)
    {
        errnoSet(S_intLib_NOT_ISR_CALLABLE);
        status = ERROR;
    }
    else
    {
        INT_LOCK(level);

        if (OBJ_VERIFY(semId, semClassId) != OK)
        {
            INT_UNLOCK(level);
            status = ERROR;
        }
        else
        {
            objCoreTerminate(&semId->objCore);

            /* Delete it */
            kernelState = TRUE;
            INT_UNLOCK(level);
            vmxSemDelete(semId);

            taskSafe();
            vmxExit();

            if (deallocate == TRUE)
            {
                objFree(semClassId, semId);
            }

            taskUnsafe();
            status = OK;
        }
    }

    return status;
}
Example #13
0
STATUS wdDestroy
(
    WDOG_ID wdId,               /* ID of watchdog to terminate */
    BOOL    dealloc             /* dealloc associated memory */
)
{
    int level;

    if (INT_RESTRICT () != OK)			/* restrict isr use */
        return (ERROR);

    level = intLock ();				/* LOCK INTERRUPTS */

    if (OBJ_VERIFY (wdId, wdClassId) != OK)	/* validate watchdog ID */
    {
        intUnlock (level);			/* UNLOCK INTERRUPTS */
        return (ERROR);
    }

#ifdef WV_INSTRUMENTATION
    /* windview - level 1 event logging */
    EVT_OBJ_1 (OBJ, wdId, wdClassId, EVENT_WDDELETE, wdId);
#endif

    objCoreTerminate (&wdId->objCore);		/* invalidate watchdog */

    kernelState = TRUE;				/* KERNEL ENTER */

    intUnlock (level);				/* UNLOCK INTERRUPTS */

    windWdCancel (wdId);			/* cancel watchdog */

    wdId->status = WDOG_DEAD;			/* dead dog */

    TASK_SAFE ();				/* TASK SAFE */

    windExit ();				/* EXIT KERNEL */

    if (dealloc)
        objFree (wdClassId, (char *) wdId);	/* deallocate watchdog */

    TASK_UNSAFE ();				/* TASK UNSAFE */

    return (OK);
}
Example #14
0
MSG_Q_ID msgQCreate(int maxMsgs, int maxMsgLength, int options)
{
    MSG_Q_ID	msgQId;
    void *	pPool;		/* pointer to memory for messages */
    UINT	size = (UINT) maxMsgs * MSG_NODE_SIZE (maxMsgLength);

    /* TODO restrict ISR from calling */
	
    if ((!msgQLibInstalled) && (msgQLibInit () != OK))
		return (NULL);			/* package init problem */

    if ((msgQId = (MSG_Q_ID)objAllocExtra (msgQClassId, size, &pPool)) == NULL)
		return (NULL);

    if (msgQInit (msgQId, maxMsgs, maxMsgLength, options, pPool) != OK)
	{
		objFree (msgQClassId, (char *) msgQId);
		return (NULL);
	}

    return ((MSG_Q_ID) msgQId);
}
Example #15
0
static void testObjectSerialization(CuTest *tc, const char *sample,
									int (*parse)(KSI_CTX *, unsigned char *, size_t, void **),
									int (*serialize)(void *, unsigned char **, size_t *),
									void (*objFree)(void *)) {
	int res;
	void *pdu = NULL;
	unsigned char in[0xffff + 4];
	size_t in_len;
	unsigned char *out = NULL;
	size_t out_len;
	FILE *f = NULL;
	char errm[1024];

	f = fopen(sample, "rb");
	KSI_snprintf(errm, sizeof(errm), "Unable to open pdu file: '%s'.", sample);
	CuAssert(tc, errm, f != NULL);

	in_len = (unsigned)fread(in, 1, sizeof(in), f);
	fclose(f);
	KSI_snprintf(errm, sizeof(errm), "Unable to read pdu file: '%s'.", sample);
	CuAssert(tc, errm, in_len > 0);

	res = parse(ctx, in, in_len, &pdu);
	KSI_snprintf(errm, sizeof(errm), "Unable to parse pdu: '%s'.", sample);
	CuAssert(tc, errm, res == KSI_OK && pdu != NULL);

	res = serialize(pdu, &out, &out_len);
	KSI_snprintf(errm, sizeof(errm), "Unable to serialize pdu: '%s'.", sample);
	CuAssert(tc, errm, res == KSI_OK && out != NULL && out_len > 0);

	KSI_snprintf(errm, sizeof(errm), "Serialized pdu length mismatch: '%s'.", sample);
	CuAssert(tc, errm, res == KSI_OK && out_len == in_len);

	KSI_snprintf(errm, sizeof(errm), "Serialised pdu content mismatch: '%s'.", sample);
	CuAssert(tc, errm, !KSITest_memcmp(in, out, in_len));

	KSI_free(out);
	objFree(pdu);
}
Example #16
0
File: taskLib.c Project: phoboz/vmx
int taskCreat(
    const char *name,
    unsigned    priority,
    int         options,
    unsigned    stackSize,
    FUNCPTR     func,
    ARG         arg0,
    ARG         arg1,
    ARG         arg2,
    ARG         arg3,
    ARG         arg4,
    ARG         arg5,
    ARG         arg6,
    ARG         arg7,
    ARG         arg8,
    ARG         arg9
    )
{
    static char digits[] = "0123456789";

    TCB_ID  tcbId;
    char   *pTaskMem;
    char   *pStackBase;
    char    newName[20];
    int     value;
    int     nBytes;
    int     nPreBytes;
    char   *pBufStart;
    char   *pBufEnd;
    char    ch;

    /* Check if task lib is installed */
    if (taskLibInstalled != TRUE)
    {
        errnoSet(S_taskLib_NOT_INSTALLED);
        tcbId = NULL;
    }
    else
    {
        /* If NULL name create default name for task */
        if (name == NULL)
        {
            strcpy(newName, namelessPrefix);
            nBytes    = strlen(newName);
            nPreBytes = nBytes;
            value     = ++namelessCount;

            /* Do while value is non-zero */
            do
            {
                newName[nBytes++] = digits[value % 10];
                value /= 10;
            } while(value != 0);

            /* Calculate start/end positions in name */
            pBufStart = newName + nPreBytes;
            pBufEnd   = newName + nBytes - 1;

            /* While startbuffer lt. end buffer */
            while (pBufStart < pBufEnd)
            {
                ch         = *pBufStart;
                *pBufStart = *pBufEnd;
                *pBufEnd   = ch;
                pBufStart++;
                pBufEnd--;
            }

            /* Terminate string */
            newName[nBytes] = EOS;

            /* Use this a the name for the task */
            name = newName;
        }

        /* Round up stack size */
        stackSize = STACK_ROUND_UP(stackSize);

        /* Allocate new TCB plus stack */
        pTaskMem = objAllocPad(
                       taskClassId,
                       (unsigned) stackSize,
                       (void **) NULL
                       );
        if (pTaskMem == NULL)
        {
            /* errno set by objAllocPad() */
            tcbId = NULL;
        }
        else
        {
            /* Setup stack vars */

#if (_STACK_DIR == _STACK_GROWS_DOWN)
            pStackBase = pTaskMem + stackSize;
            tcbId      = (TCB_ID) pStackBase;
#else /* _STACK_GROWS_UP */
            tcbId      = (TCB_ID) (pTaskMem + TASK_EXTRA_BYTES);
            pStackBase = STACK_ROUND_UP(
                             pTaskMem + TASK_EXTRA_BYTES + sizeof(TCB)
                             );
#endif /* _STACK_DIR */

            /* Initialize task */
            if (taskInit(
                    tcbId,
                    name,
                    priority,
                    options,
                    pStackBase,
                    stackSize,
                    func,
                    arg0,
                    arg1,
                    arg2,
                    arg3,
                    arg4,
                    arg5,
                    arg6,
                    arg7,
                    arg8,
                    arg9
                    ) != OK)
            {
                /* errno set by taskInit() */
                objFree(taskClassId, tcbId);
                tcbId = NULL;
            }
        }
    }

    return (int) tcbId;
}
Example #17
0
File: taskLib.c Project: phoboz/vmx
STATUS taskDestroy(
    int      taskId,
    BOOL     freeStack,
    unsigned timeout,
    BOOL     forceDestroy
    )
{
  STATUS status;
  int i, level;
  TCB_ID tcbId;

  if (INT_RESTRICT() != OK)
  {
    errnoSet (S_intLib_NOT_ISR_CALLABLE);
    return ERROR;
  }

  /* Get task context */
  tcbId = taskTcb(taskId);
  if (tcbId == NULL)
    return ERROR;

  /* If task self destruct and excption lib installed */
  if (tcbId == taskIdCurrent) {

    /* Wait for safe to destroy */
    while (tcbId->safeCount > 0)
      taskUnsafe();

    /* Kill it */
    status = excJobAdd(
        (VOIDFUNCPTR) taskDestroy,
        (ARG) tcbId,
        (ARG) freeStack,
        (ARG) WAIT_NONE,
        (ARG) FALSE,
        (ARG) 0,
        (ARG) 0
        );

    /* Block here and suspend */
    while(status == OK)
      taskSuspend(0);

  } /* End if task self destruct and exception lib installed */

taskDestroyLoop:

  /* Lock interrupts */
  INT_LOCK(level);

  /* Check id */
  if (TASK_ID_VERIFY(tcbId) != OK)
  {
    /* errno set by taskIdVerify() */

    /* Unlock interrupts */
    INT_UNLOCK(level);

    return ERROR;
  }

  /* Mask all signals */
  if (tcbId->pSignalInfo != NULL)
    tcbId->pSignalInfo->sigt_blocked = 0xffffffff;

  /* Block here for safe and running locked tasks */
  while ( (tcbId->safeCount > 0) ||
          ( (tcbId->status == TASK_READY) && (tcbId->lockCount > 0) )
        )
  {
    /* Enter kernel mode */
    kernelState = TRUE;

    /* Unlock interrupts */
    INT_UNLOCK(level);

    /* Check if force deletion, or suicide */
    if (forceDestroy || (tcbId == taskIdCurrent))
    {

      /* Remove protections */
      tcbId->safeCount = 0;
      tcbId->lockCount = 0;

      /* Check if flush of safety queue is needed */
      if (Q_FIRST(&tcbId->safetyQ) != NULL)
        vmxPendQFlush(&tcbId->safetyQ);

      /* Exit trough kernel */
      vmxExit();
    }
    else
    {
      /* Not forced deletion or suicide */

      /* Put task on safe queue */
      if (vmxPendQPut(&tcbId->safetyQ, timeout) != OK)
      {
        /* Exit trough kernel */
        vmxExit();

        errnoSet (S_taskLib_INVALID_TIMEOUT);

        return ERROR;
      }

      /* Exit trough kernel */
      status = vmxExit();

      /* Check for restart */
      if (status == SIG_RESTART)
      {
        timeout = (sigTimeoutRecalc)(timeout);
        goto taskDestroyLoop;
      }

      /* Check if unsuccessful */
      if (status == ERROR)
      {
          /* timer should have set errno to S_objLib_TIMEOUT */
          return ERROR;
      }

    } /* End else forced or suicide */

    /* Lock interrupts */
    INT_LOCK(level);

    /* Now verify class id again */
    if (TASK_ID_VERIFY(tcbId) != OK)
    {
      /* errno set by taskIdVerify() */

      /* Unlock interrupts */
      INT_UNLOCK(level);

      return ERROR;
    }

  } /* End while blocked by safety */

  /* Now only one cadidate is selected for deletion */

  /* Make myself safe */
  taskSafe();

  /* Protet deletion cadidate */
  tcbId->safeCount++;

   /* Check if not suicide */
   if (tcbId != taskIdCurrent)
   {
     /* Enter kernel mode */
     kernelState = TRUE;

     /* Unlock interrupts */
     INT_UNLOCK(level);

     /* Suspend victim */
     vmxSuspend(tcbId);

     /* Exit trough kernel */
     vmxExit();
  }
  else
  {
     /* Unlock interrupts */
     INT_UNLOCK(level);
  }

  /* Run deletion hooks */
  for (i = 0; i < MAX_TASK_DELETE_HOOKS; i++)
    if (taskDeleteHooks[i] != NULL)
      (*taskDeleteHooks[i])(tcbId);

  /* Lock task */
  taskLock();

  /* If dealloc and options dealloc stack */
  if ( freeStack && (tcbId->options & TASK_OPTIONS_DEALLOC_STACK) ) {

#if (_STACK_DIR == _STACK_GROWS_DOWN)

    objFree(taskClassId, tcbId->pStackEnd);

#else /* _STACK_GROWS_UP */

    objFree(taskClassId, tbcId - TASK_EXTRA_BYTES);

#endif /* _STACK_DIR */

  }

  /* Lock interrupts */
  INT_LOCK(level);

  /* Invalidate id */
  objCoreTerminate(&tcbId->objCore);

  /* Enter kernel mode */
  kernelState = TRUE;

  /* Unlock interrupts */
  INT_UNLOCK(level);

  /* Delete task */
  status = vmxDelete(tcbId);

  /* Check if safe quque needs to be flushed */
  if (Q_FIRST(&tcbId->safetyQ) != NULL)
    vmxPendQFlush(&tcbId->safetyQ);

  /* Exit trough kernel */
  vmxExit();

  /* Unprotect */
  taskUnlock();
  taskUnsafe();

  return OK;
}
Example #18
0
void delObject(Object* Obj)
{
	objFree(Obj);
	free(Obj);
}