vthread-win32.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF ,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. #ifdef WIN32
  51.     
  52. #include <cassert>
  53. #include "VThread.h"
  54. #include "cpLog.h"
  55. /*********************************************************************
  56. VThread for WIN32
  57. *********************************************************************/
  58. VThread::VThread( void )
  59. {
  60.     myId = VTHREAD_ID_INVALID;
  61.     ::memset (&myAttributes, 0, sizeof (myAttributes));
  62. }
  63.     
  64. VThread::~VThread( void )
  65. {
  66.     if( myId != VTHREAD_ID_INVALID )
  67.     {
  68. // warn user but don't kill thread
  69. cpLog( LOG_DEBUG, "active VThread:%d going out of scope", myId );
  70.     }
  71.     myId = VTHREAD_ID_INVALID;
  72. }
  73.     
  74. int
  75. VThread::spawn( void *( *startFunc )( void * ),
  76. void *startArgs,
  77. unsigned long flags,
  78. unsigned long priority,
  79. int stack_size 
  80.     )
  81. {
  82.     if( myId != VTHREAD_ID_INVALID )
  83.     {
  84. // return without spawning another thread
  85. cpLog( LOG_ERR, "VThread:%d is already active", myId );
  86. return (int)myId;
  87.     }
  88.     struct sched_param priorityParams;
  89.     int retVal = 0;
  90.     
  91.     assert( pthread_attr_init(&myAttributes) == 0 );
  92. /* not implemented in Pthreads-win32
  93.     assert( pthread_attr_setinheritsched( &myAttributes,
  94.   PTHREAD_EXPLICIT_SCHED ) == 0 );
  95. */
  96.     // extract scheduling preference from flags
  97.     switch( flags & VTHREAD_SCHED_MASK )
  98.     {
  99. case VTHREAD_SCHED_FIFO:
  100. {    
  101. /* not implemented in Pthreads-win32
  102.     retVal = pthread_attr_setschedpolicy( &myAttributes,
  103.   SCHED_FIFO );
  104. */
  105.     if( true )
  106.     {
  107. throw VThreadExceptionInvalidAttributes(
  108.     "cannot set schedule as VTHREAD_SCHED_FIFO",
  109.     __FILE__,
  110.     __LINE__,
  111.     retVal );
  112.     }
  113. }
  114. break;
  115.     
  116. case VTHREAD_SCHED_RR:
  117. {
  118. /* not implemented in Pthreads-win32
  119.     retVal = pthread_attr_setschedpolicy( &myAttributes,
  120.   SCHED_RR );
  121. */
  122.     if( true )
  123.     {
  124. throw VThreadExceptionInvalidAttributes(
  125.     "cannot set schedule as VTHREAD_SCHED_RR",
  126.     __FILE__,
  127.     __LINE__,
  128.     retVal );
  129.     }
  130. }
  131. break;
  132.         case VTHREAD_SCHED_DEFAULT:
  133. default:
  134. {
  135.     // SCHED_OTHER is the default for pthread
  136. /* not implemented in Pthreads-win32
  137.     retVal = pthread_attr_setschedpolicy( &myAttributes,
  138.   SCHED_OTHER );
  139.     
  140. if( true )
  141.     {
  142. throw VThreadExceptionInvalidAttributes(
  143.     "cannot set schedule as VTHREAD_SCHED_OTHER",
  144.     __FILE__,
  145.     __LINE__,
  146.     retVal );
  147.     }
  148. */
  149. }
  150. break;
  151.     }
  152.     
  153.     if( priority != VTHREAD_PRIORITY_DEFAULT )
  154.     {
  155. // probably should improve to use relative values
  156. priorityParams.sched_priority = priority;
  157. retVal = pthread_attr_setschedparam( &myAttributes,
  158.      &priorityParams );
  159. if( retVal )
  160. {
  161.     throw VThreadExceptionInvalidPriority(
  162. "cannot set priority",
  163. __FILE__,
  164. __LINE__,
  165. retVal );
  166. }
  167.     }
  168.     
  169.     return( pthread_create( &myId, &myAttributes, startFunc, startArgs ) );
  170. }
  171.     
  172. int
  173. VThread::join( void **status )
  174. {
  175.     int retVal = pthread_join( myId, status );
  176.     myId = VTHREAD_ID_INVALID;
  177.     return retVal;
  178. }
  179.     
  180. int
  181. VThread::getPriority( void ) const
  182. {
  183.     struct sched_param priorityParams;
  184.     
  185.     assert( pthread_attr_getschedparam( &myAttributes,
  186. &priorityParams ) == 0 );
  187.     return priorityParams.sched_priority;
  188. }
  189. int
  190. VThread::setPriority( int priority )
  191. {
  192.     struct sched_param priorityParams;
  193.     int policy = 0;
  194.     int retVal;
  195.     
  196.     retVal = pthread_attr_setschedparam( &myAttributes, &priorityParams );
  197.     if( retVal )
  198.     {
  199. throw VThreadExceptionInvalidPriority(
  200.     "cannot set priority",
  201.     __FILE__,
  202.     __LINE__,
  203.     retVal );
  204.     }
  205.     
  206. /* not implemented in Pthreads-win32
  207.     retVal = pthread_attr_getschedpolicy( &myAttributes, &policy );
  208.     if( retVal )
  209.     {
  210. throw VThreadExceptionInvalidPriority(
  211.     "cannot set policy",
  212.     __FILE__,
  213.     __LINE__,
  214.     retVal );
  215.     }
  216. */
  217.     return( pthread_setschedparam( myId, policy, &priorityParams ) );
  218. }
  219. const vthread_t*
  220. VThread::getId( void ) const
  221. {
  222.     return &myId;
  223. }
  224.     
  225. const vthread_attr_t*
  226. VThread::getAttributes( void ) const
  227. {
  228.     return &myAttributes;
  229. }
  230. void
  231. VThread::exit( void )
  232. {
  233.     if( myId != VTHREAD_ID_INVALID )
  234.     {
  235. pthread_cancel( myId );
  236. myId = VTHREAD_ID_INVALID;
  237.     }
  238. }
  239. const vthread_t
  240. VThread::selfId( void )
  241. {
  242.     return pthread_self();
  243. }
  244. int
  245. sleep( int seconds )
  246. {
  247. Sleep (seconds * 1000);
  248. return 0;
  249. }
  250. int
  251. usleep( int useconds )
  252. {
  253.     Sleep(useconds / 1000);
  254. return 0;
  255. }
  256. #endif // WIN32