#ifndef RTTASK_H
#define RTTASK_H

/******************************************************************************/
/******************************************************************************/
/*****************     Copyright 2004, 2005 Chronolytics Inc.   ***************/
/*****************     All Right Reserved                       ***************/
/******************************************************************************/
/******************************************************************************/

#include <RTMagic.h>
#include <RTFatal.h>
#include <RTEvent.h>
#include <pthread.h>
#include <sys/user.h>  /* PAGE_SIZE */

static volatile const char __attribute__ ((unused)) rcsid_RTTASK_H[] = "$Id: RTTask.h,v 1.13 2005/08/20 21:39:25 dave Exp $";

/* glibc pthreads uses a "too large" stack that is 8MB! */
#define RTTASK_DEFAULT_STACK_SIZE  (4 * PAGE_SIZE)

/* glibc pthreads uses a "too large" stack that is 8MB! */
#define RTTASK_STACK_TOO_LARGE (100 * PAGE_SIZE)  /* force override if stack > too large */

#define RTTask_MAGIC MAGIC("Task")

typedef void RTTask;  /* opaque Task : use RTTask * as pointer to void */

pthread_key_t taskkey;  /* TLS key for "this" RTTask */

static RTTask *RTTask_MyTask()
   {
   return (RTTask *) pthread_getspecific(taskkey);
}

const RTEventQueue RTTask_EventQueue();

  /* this allows late binding: don't call until POST_TASKING state  */
RTEventQueue RTTask_Constructor(char *name, pthread_attr_t *ap, void *(*start_routine)(void *), void *arg) __attribute__ ((weak));

char *RTTask_TaskName(void);

void RTTask_Exit(void *retval);

char *RTTask_SCHED_Name(int scheduler);

void RTTask_Suspend(RTTask *taskp);

void RTTask_Log_Task(void);

#endif /* RTTASK_H */


