00001 00008 #define DKUTIL_C_THREAD_LOCK_C 00009 00010 #include "dkcThread.h" 00011 #include "dkcStdio.h" 00012 00013 00014 DKC_INLINE DKC_THREAD *WINAPI dkcAllocThread() 00015 { 00016 return dkcAllocate(sizeof(DKC_THREAD)); 00017 00018 } 00019 00020 DKC_INLINE int WINAPI dkcFreeThread(DKC_THREAD **pp){ 00021 return dkcFree((void **)pp); 00022 } 00023 00024 DKC_INLINE int WINAPI dkcGetCurrentThread(DKC_THREAD *out) 00025 { 00026 #ifdef WIN32 00027 out->handle = GetCurrentThread(); 00028 out->id = GetCurrentThreadId(); 00029 #else 00030 00031 #endif 00032 return edk_SUCCEEDED; 00033 00034 } 00035 00036 00037 DKC_EXTERN int WINAPI dkcGetThreadPriority(DKC_THREAD *p,int *priority) 00038 { 00039 #ifdef WIN32 00040 DWORD d = GetThreadPriority(p->handle); 00041 switch(d){ 00042 case THREAD_PRIORITY_LOWEST: 00043 *priority = edkcThreadPriorityLowest; 00044 break; 00045 case THREAD_PRIORITY_BELOW_NORMAL: 00046 *priority = edkcThreadPriorityBelowNormal; 00047 break; 00048 case THREAD_PRIORITY_NORMAL: 00049 *priority = edkcThreadPriorityNormal; 00050 break; 00051 case THREAD_PRIORITY_ABOVE_NORMAL: 00052 *priority = edkcThreadPriorityAboveNormal; 00053 break; 00054 case THREAD_PRIORITY_HIGHEST: 00055 *priority = edkcThreadPriorityHighest; 00056 break; 00057 case THREAD_PRIORITY_IDLE: 00058 *priority = edkcThreadPriorityIdle; 00059 break; 00060 case THREAD_PRIORITY_TIME_CRITICAL: 00061 *priority = edkcThreadPriorityTimeCritical; 00062 break; 00063 default: 00064 return edk_FAILED; 00065 } 00066 #else 00067 00068 00069 #endif 00070 return edk_SUCCEEDED; 00071 } 00072 DKC_EXTERN int WINAPI dkcSetThreadPriority(DKC_THREAD *p,int priority) 00073 { 00074 #ifdef WIN32 00075 int tp; 00076 switch(priority){ 00077 case edkcThreadPriorityLowest: 00078 tp = THREAD_PRIORITY_LOWEST; 00079 break; 00080 case edkcThreadPriorityBelowNormal: 00081 tp = THREAD_PRIORITY_BELOW_NORMAL; 00082 break; 00083 case edkcThreadPriorityNormal: 00084 tp = THREAD_PRIORITY_NORMAL; 00085 break; 00086 case edkcThreadPriorityAboveNormal: 00087 tp = THREAD_PRIORITY_ABOVE_NORMAL; 00088 break; 00089 case edkcThreadPriorityHighest: 00090 tp = THREAD_PRIORITY_HIGHEST; 00091 break; 00092 case edkcThreadPriorityIdle: 00093 tp = THREAD_PRIORITY_IDLE; 00094 break; 00095 case edkcThreadPriorityTimeCritical: 00096 tp = THREAD_PRIORITY_TIME_CRITICAL; 00097 break; 00098 default: 00099 return edk_FAILED; 00100 } 00101 if(FALSE==SetThreadPriority(p->handle,tp)){ 00102 return edk_FAILED; 00103 } 00104 #else 00105 00106 00107 #endif 00108 return edk_SUCCEEDED; 00109 } 00110 00111 DKC_INLINE int WINAPI dkcGetCurrentThreadPriority(int *priority) 00112 { 00113 DKC_THREAD t; 00114 int r; 00115 #ifdef WIN32 00116 r = dkcGetCurrentThread(&t); 00117 if(DKUTIL_FAILED(r)){return r;} 00118 r = dkcGetThreadPriority(&t,priority); 00119 #else 00120 00121 #endif 00122 return r; 00123 00124 } 00125 00126 DKC_INLINE int WINAPI dkcSetCurrentThreadPriority(int priority) 00127 { 00128 DKC_THREAD t; 00129 int r; 00130 #ifdef WIN32 00131 r = dkcGetCurrentThread(&t); 00132 if(DKUTIL_FAILED(r)){return r;} 00133 r = dkcSetThreadPriority(&t,priority); 00134 #else 00135 00136 #endif 00137 return r; 00138 00139 } 00140 00141 int WINAPI dkcGetProcessPriority(DKC_THREAD *p,int *priority) 00142 { 00143 #ifdef WIN32 00144 00145 DWORD d = GetPriorityClass(p->handle); 00146 switch(d){ 00147 case HIGH_PRIORITY_CLASS: 00148 *priority = edkcProcessPriorityHigh; 00149 break; 00150 case IDLE_PRIORITY_CLASS: 00151 *priority = edkcProcessPriorityIdle; 00152 break; 00153 case NORMAL_PRIORITY_CLASS: 00154 *priority = edkcProcessPriorityNormal; 00155 break; 00156 case REALTIME_PRIORITY_CLASS: 00157 *priority = edkcProcessPriorityRealTime; 00158 break; 00159 default: 00160 return edk_FAILED; 00161 } 00162 00163 #else 00164 00165 #endif 00166 return edk_SUCCEEDED; 00167 } 00168 00169 DKC_EXTERN int WINAPI dkcSetProcessPriority(DKC_THREAD *p,int priority){ 00170 #ifdef WIN32 00171 DWORD pc; 00172 switch(priority){ 00173 case edkcProcessPriorityHigh: 00174 pc = HIGH_PRIORITY_CLASS; 00175 break; 00176 case edkcProcessPriorityIdle: 00177 pc =IDLE_PRIORITY_CLASS; 00178 break; 00179 case edkcProcessPriorityNormal: 00180 pc =NORMAL_PRIORITY_CLASS; 00181 break; 00182 case edkcProcessPriorityRealTime: 00183 pc =REALTIME_PRIORITY_CLASS; 00184 break; 00185 default: 00186 return edk_FAILED; 00187 } 00188 if(FALSE==SetPriorityClass(p->handle,pc)){ 00189 return edk_FAILED; 00190 } 00191 #else 00192 00193 00194 #endif 00195 return edk_SUCCEEDED; 00196 00197 00198 } 00199 00200 int WINAPI dkcGetCurrentProcessPriority(int *priority){ 00201 DKC_THREAD t; 00202 int r; 00203 #ifdef WIN32 00204 r = dkcGetCurrentThread(&t); 00205 if(DKUTIL_FAILED(r)){return r;} 00206 r = dkcGetProcessPriority(&t,priority); 00207 #else 00208 00209 #endif 00210 return r; 00211 } 00212 int WINAPI dkcSetCurrentProcessPriority(int priority){ 00213 DKC_THREAD t; 00214 int r; 00215 #ifdef WIN32 00216 r = dkcGetCurrentThread(&t); 00217 if(DKUTIL_FAILED(r)){return r;} 00218 r = dkcSetProcessPriority(&t,priority); 00219 #else 00220 00221 #endif 00222 return r; 00223 }