Contiki 2.6

mt.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2006, Swedish Institute of Computer Science.
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * Author: Adam Dunkels <adam@sics.se>
00032  *
00033  * $Id: mt.c,v 1.7 2009/09/03 12:57:58 nvt-se Exp $
00034  */
00035 
00036 /**
00037  * \file
00038  * Implementation of the archtecture agnostic parts of the preemptive
00039  * multithreading library for Contiki.
00040  *
00041  * \author
00042  * Adam Dunkels <adam@sics.se>
00043  *
00044  */
00045 
00046 #include "contiki.h"
00047 #include "sys/mt.h"
00048 #include "sys/cc.h"
00049 
00050 #define MT_STATE_READY   1
00051 #define MT_STATE_RUNNING 2
00052 #define MT_STATE_EXITED  5
00053 
00054 static struct mt_thread *current;
00055 
00056 /*--------------------------------------------------------------------------*/
00057 void
00058 mt_init(void)
00059 {
00060   mtarch_init();
00061 }
00062 /*--------------------------------------------------------------------------*/
00063 void
00064 mt_remove(void)
00065 {
00066   mtarch_remove();
00067 }
00068 /*--------------------------------------------------------------------------*/
00069 void
00070 mt_start(struct mt_thread *thread, void (* function)(void *), void *data)
00071 {
00072   /* Call the architecture dependant function to set up the processor
00073      stack with the correct parameters. */
00074   mtarch_start(&thread->thread, function, data);
00075 
00076   thread->state = MT_STATE_READY;
00077 }
00078 /*--------------------------------------------------------------------------*/
00079 void
00080 mt_exec(struct mt_thread *thread)
00081 {
00082   if(thread->state == MT_STATE_READY) {
00083     thread->state = MT_STATE_RUNNING;
00084     current = thread;
00085     /* Switch context to the thread. The function call will not return
00086        until the the thread has yielded, or is preempted. */
00087     mtarch_exec(&thread->thread);
00088   }
00089 }
00090 /*--------------------------------------------------------------------------*/
00091 void
00092 mt_yield(void)
00093 {
00094   mtarch_pstop();
00095   current->state = MT_STATE_READY;
00096   current = NULL;
00097   /* This function is called from the running thread, and we call the
00098      switch function in order to switch the thread to the main Contiki
00099      program instead. For us, the switch function will not return
00100      until the next time we are scheduled to run. */
00101   mtarch_yield();
00102   
00103 }
00104 /*--------------------------------------------------------------------------*/
00105 void
00106 mt_exit(void)
00107 {
00108   current->state = MT_STATE_EXITED;
00109   current = NULL;
00110   mtarch_yield();
00111 }
00112 /*--------------------------------------------------------------------------*/
00113 void
00114 mt_stop(struct mt_thread *thread)
00115 {
00116   mtarch_stop(&thread->thread);
00117 }
00118 /*--------------------------------------------------------------------------*/