Helixis 1.0
Task Programming API
sources/native/native_channels.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2009-2011, helixis.org
00003 ** All rights reserved.
00004 **
00005 ** Redistribution and use in source and binary forms, with or without modification, are permitted provided
00006 ** that the following conditions are met:
00007 **
00008 ** Redistributions of source code must retain the above copyright notice, this list of conditions and the
00009 ** following disclaimer.
00010 **
00011 ** Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
00012 ** the following disclaimer in the documentation and/or other materials provided with the distribution.
00013 **
00014 ** Neither the name of the helixis.org nor the names of its contributors may be used to endorse or promote
00015 ** products derived from this software without specific prior written permission.
00016 **
00017 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
00018 ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00019 ** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
00020 ** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00021 ** TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00022 ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00023 ** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00024 ** POSSIBILITY OF SUCH DAMAGE.
00025 */
00026 
00027 /*
00028 ** INCLUDES
00029 */
00030 
00031 #include "hlx/core.h"
00032 #include "helixis_internal.h"
00033 
00034 #if !defined(HLX_BUILD_WITH_PARALLEL_THREADING)
00035 
00036 #ifdef __cplusplus
00037 extern "C"      {
00038 #endif
00039 
00040 /*
00041 ** EXTERNALS
00042 */
00043 
00044 extern hlx_api gl_api;
00045 
00046 /*
00047 ** GLOBALS
00048 */
00049 
00050 static _hlx_channel_manager gl_channel_manager;
00051 
00052 /*
00053 ** FUNCTIONS
00054 */
00055 
00056 static hlx_list_node*                   _hlx_get_channel_by_hash(unsigned long id)
00057 {
00058         hlx_list_node*                  it;
00059 
00060         for (it = gl_channel_manager.channels.first; it; it = it->next)
00061                 if (((_hlx_channel*)it->data)->hash_code == id)
00062                         return (it);
00063         return (0);
00064 }
00065 
00066 HLX_CHAN_WRITE_GENERATOR(short, short, s)
00067 HLX_CHAN_READ_GENERATOR(short, short, s)
00068 
00069 HLX_CHAN_WRITE_GENERATOR(int, int, i)
00070 HLX_CHAN_READ_GENERATOR(int, int, i)
00071 
00072 HLX_CHAN_WRITE_GENERATOR(char, char, c)
00073 HLX_CHAN_READ_GENERATOR(char, char, c)
00074 
00075 HLX_CHAN_WRITE_GENERATOR(float, float, f)
00076 HLX_CHAN_READ_GENERATOR(float, float, f)
00077 
00078 HLX_CHAN_WRITE_GENERATOR(ptr, void *, p)
00079 HLX_CHAN_READ_GENERATOR(ptr, void *, p)
00080 
00081 hlx_channel_errors              hlx_chan_create(unsigned long id)
00082 {
00083         _hlx_channel            *chan;
00084         hlx_list_node           *node;
00085 
00086         node = _hlx_get_channel_by_hash(id);
00087         if (node != 0)
00088                 return (CHAN_ERROR_ALREADY_EXISTS);
00089         if ((chan = gl_api.malloc_entry(sizeof(_hlx_channel))) == 0)
00090                 return (CHAN_ERROR_MEMORY_EXHAUSTED);
00091         chan->hash_code = id;
00092         chan->status = HLX_CHAN_AVAILABLE;
00093         if (hlx_list_push_back(&gl_channel_manager.channels, chan) == 0)
00094         {
00095                 gl_api.free_entry(chan);
00096                 return (CHAN_ERROR_MEMORY_EXHAUSTED);
00097         }
00098         return (CHAN_ERROR_SUCCESS);
00099 }
00100 
00101 void    _init_channel_manager(void)
00102 {
00103         hlx_list_construct(&gl_channel_manager.channels);
00104 }
00105 
00106 void    _destroy_channel_manager(void)
00107 {
00108         hlx_list_node*                  it;
00109 
00110         for (it = gl_channel_manager.channels.first; it; it = it->next)
00111                 gl_api.free_entry(((_hlx_channel*)it->data));
00112         hlx_list_destruct(&gl_channel_manager.channels);
00113 }
00114 
00115 #endif /* HLX_BUILD_WITH_KERNEL_THREAD */
00116 
00117 #ifdef __cplusplus
00118 }
00119 #endif
00120 
00121 /*
00122 ** END OF FILE
00123 */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines