Main MRPT website > C++ reference for MRPT 1.5.6
linux/thread.hpp
Go to the documentation of this file.
1 /*
2  * RPLIDAR SDK
3  *
4  * Copyright (c) 2009 - 2014 RoboPeak Team
5  * http://www.robopeak.com
6  * Copyright (c) 2014 - 2016 Shanghai Slamtec Co., Ltd.
7  * http://www.slamtec.com
8  *
9  */
10 /*
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions are met:
13  *
14  * 1. Redistributions of source code must retain the above copyright notice,
15  * this list of conditions and the following disclaimer.
16  *
17  * 2. Redistributions in binary form must reproduce the above copyright notice,
18  * this list of conditions and the following disclaimer in the documentation
19  * and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
25  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34 
35 #include "arch/linux/arch_linux.h"
36 
37 #include <sched.h>
38 
39 namespace rp{ namespace hal{
40 
41 Thread Thread::create(thread_proc_t proc, void * data)
42 {
43  Thread newborn(proc, data);
44 
45  // tricky code, we assume pthread_t is not a structure but a word size value
46  assert( sizeof(newborn._handle) >= sizeof(pthread_t));
47 
48  pthread_create((pthread_t *)&newborn._handle, NULL, (void * (*)(void *))proc, data);
49 
50  return newborn;
51 }
52 
54 {
55  if (!this->_handle) return RESULT_OK;
56 
57  return pthread_cancel((pthread_t)this->_handle)==0?RESULT_OK:RESULT_OPERATION_FAIL;
58 }
59 
61 {
62  if (!this->_handle) return RESULT_OPERATION_FAIL;
63 
64  // check whether current schedule policy supports priority levels
65 
66  int current_policy;
67  struct sched_param current_param;
68  int ans;
69  if (pthread_getschedparam( (pthread_t) this->_handle, &current_policy, &current_param))
70  {
71  // cannot retreieve values
72  return RESULT_OPERATION_FAIL;
73  }
74 
75  //int pthread_priority = 0 ;
76 
77  switch(p)
78  {
79  case PRIORITY_REALTIME:
80  //pthread_priority = pthread_priority_max;
81  current_policy = SCHED_RR;
82  break;
83  case PRIORITY_HIGH:
84  //pthread_priority = (pthread_priority_max + pthread_priority_min)/2;
85  current_policy = SCHED_RR;
86  break;
87  case PRIORITY_NORMAL:
88  case PRIORITY_LOW:
89  case PRIORITY_IDLE:
90  //pthread_priority = 0;
91  current_policy = SCHED_OTHER;
92  break;
93  }
94 
95  current_param.__sched_priority = current_policy;
96  if ( (ans = pthread_setschedparam( (pthread_t) this->_handle, current_policy, &current_param)) )
97  {
98  return RESULT_OPERATION_FAIL;
99  }
100  return RESULT_OK;
101 }
102 
104 {
105  if (!this->_handle) return PRIORITY_NORMAL;
106 
107  int current_policy;
108  struct sched_param current_param;
109  if (pthread_getschedparam( (pthread_t) this->_handle, &current_policy, &current_param))
110  {
111  // cannot retreieve values
112  return PRIORITY_NORMAL;
113  }
114 
115  int pthread_priority_max = sched_get_priority_max(SCHED_RR);
116  int pthread_priority_min = sched_get_priority_min(SCHED_RR);
117 
118  if (current_param.__sched_priority ==(pthread_priority_max ))
119  {
120  return PRIORITY_REALTIME;
121  }
122  if (current_param.__sched_priority >=(pthread_priority_max + pthread_priority_min)/2)
123  {
124  return PRIORITY_HIGH;
125  }
126  return PRIORITY_NORMAL;
127 }
128 
129 u_result Thread::join(unsigned long timeout)
130 {
131  if (!this->_handle) return RESULT_OK;
132 
133  pthread_join((pthread_t)(this->_handle), NULL);
134  return RESULT_OK;
135 }
136 
137 }}
_word_size_t _handle
Definition: thread.h:83
#define RESULT_OK
Definition: rptypes.h:102
u_result join(unsigned long timeout=-1)
static Thread create(thread_proc_t proc, void *data=NULL)
GLint GLenum GLsizei GLint GLsizei const GLvoid * data
Definition: glew.h:1284
GLfloat GLfloat p
Definition: glew.h:10113
u_result setPriority(priority_val_t p)
priority_val_t getPriority()
#define RESULT_OPERATION_FAIL
Definition: rptypes.h:106
u_result terminate()
uint32_t u_result
Definition: rptypes.h:100



Page generated by Doxygen 1.8.6 for MRPT 1.5.6 Git: 4c65e84 Tue Apr 24 08:18:17 2018 +0200 at mar abr 24 08:26:17 CEST 2018