summaryrefslogtreecommitdiff
path: root/src/common/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/thread.c')
-rw-r--r--src/common/thread.c141
1 files changed, 69 insertions, 72 deletions
diff --git a/src/common/thread.c b/src/common/thread.c
index 315b310b2..1d0285302 100644
--- a/src/common/thread.c
+++ b/src/common/thread.c
@@ -6,30 +6,32 @@
// Copyright (c) rAthena Project (www.rathena.org) - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
+#define HERCULES_CORE
+
+#include "thread.h"
+
+#include "../common/sysinfo.h" // sysinfo->getpagesize()
+#include "../common/cbasetypes.h"
+#include "../common/malloc.h"
+#include "../common/showmsg.h"
+
#ifdef WIN32
-#include "../common/winapi.h"
-#define getpagesize() 4096 // @TODO: implement this properly (GetSystemInfo .. dwPageSize..). (Atm as on all supported win platforms its 4k its static.)
-#define __thread __declspec( thread )
+# include "../common/winapi.h"
+# define __thread __declspec( thread )
#else
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <signal.h>
-#include <pthread.h>
-#include <sched.h>
+# include <pthread.h>
+# include <sched.h>
+# include <signal.h>
+# include <stdlib.h>
+# include <string.h>
+# include <unistd.h>
#endif
-#include "cbasetypes.h"
-#include "malloc.h"
-#include "showmsg.h"
-#include "thread.h"
-
// When Compiling using MSC (on win32..) we know we have support in any case!
-#ifdef _MSC_VER
-#define HAS_TLS
+#ifdef _MSC_VER
+#define HAS_TLS
#endif
-
#define RA_THREADS_MAX 64
struct rAthread {
@@ -37,7 +39,7 @@ struct rAthread {
RATHREAD_PRIO prio;
rAthreadProc proc;
- void *param;
+ void *param;
#ifdef WIN32
HANDLE hThread;
@@ -57,7 +59,7 @@ __thread int g_rathread_ID = -1;
///
static struct rAthread l_threads[RA_THREADS_MAX];
-void rathread_init(){
+void rathread_init(void) {
register unsigned int i;
memset(&l_threads, 0x00, RA_THREADS_MAX * sizeof(struct rAthread) );
@@ -65,7 +67,7 @@ void rathread_init(){
l_threads[i].myID = i;
}
- // now lets init thread id 0, which represnts the main thread
+ // now lets init thread id 0, which represents the main thread
#ifdef HAS_TLS
g_rathread_ID = 0;
#endif
@@ -76,12 +78,12 @@ void rathread_init(){
-void rathread_final(){
+void rathread_final(void) {
register unsigned int i;
- // Unterminated Threads Left?
- // Should'nt happen ..
- // Kill 'em all!
+ // Unterminated Threads Left?
+ // Shouldn't happen ..
+ // Kill 'em all!
//
for(i = 1; i < RA_THREADS_MAX; i++){
if(l_threads[i].proc != NULL){
@@ -96,35 +98,31 @@ void rathread_final(){
// gets called whenever a thread terminated ..
-static void rat_thread_terminated( rAthread handle ){
-
- int id_backup = handle->myID;
-
- // Simply set all members to 0 (except the id)
- memset(handle, 0x00, sizeof(struct rAthread));
-
- handle->myID = id_backup; // done ;)
-
+static void rat_thread_terminated(rAthread *handle) {
+ // Preserve handle->myID and handle->hThread, set everything else to its default value
+ handle->param = NULL;
+ handle->proc = NULL;
+ handle->prio = RAT_PRIO_NORMAL;
}//end: rat_thread_terminated()
#ifdef WIN32
-DWORD WINAPI _raThreadMainRedirector(LPVOID p){
+DWORD WINAPI raThreadMainRedirector(LPVOID p){
#else
-static void *_raThreadMainRedirector( void *p ){
+static void *raThreadMainRedirector( void *p ){
sigset_t set; // on Posix Thread platforms
#endif
void *ret;
// Update myID @ TLS to right id.
#ifdef HAS_TLS
- g_rathread_ID = ((rAthread)p)->myID;
+ g_rathread_ID = ((rAthread*)p)->myID;
#endif
#ifndef WIN32
// When using posix threads
- // the threads inherits the Signal mask from the thread which's spawned
+ // the threads inherits the Signal mask from the thread which spawned
// this thread
- // so we've to block everything we dont care about.
+ // so we've to block everything we don't care about.
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGTERM);
@@ -135,19 +133,19 @@ static void *_raThreadMainRedirector( void *p ){
#endif
- ret = ((rAthread)p)->proc( ((rAthread)p)->param ) ;
+ ret = ((rAthread*)p)->proc( ((rAthread*)p)->param ) ;
-#ifdef WIN32
- CloseHandle( ((rAthread)p)->hThread );
+#ifdef WIN32
+ CloseHandle( ((rAthread*)p)->hThread );
#endif
- rat_thread_terminated( (rAthread)p );
+ rat_thread_terminated( (rAthread*)p );
#ifdef WIN32
return (DWORD)ret;
#else
return ret;
#endif
-}//end: _raThreadMainRedirector()
+}//end: raThreadMainRedirector()
@@ -155,28 +153,28 @@ static void *_raThreadMainRedirector( void *p ){
///
/// API Level
-///
-rAthread rathread_create( rAthreadProc entryPoint, void *param ){
+///
+rAthread *rathread_create(rAthreadProc entryPoint, void *param) {
return rathread_createEx( entryPoint, param, (1<<23) /*8MB*/, RAT_PRIO_NORMAL );
}//end: rathread_create()
-rAthread rathread_createEx( rAthreadProc entryPoint, void *param, size_t szStack, RATHREAD_PRIO prio ){
+rAthread *rathread_createEx(rAthreadProc entryPoint, void *param, size_t szStack, RATHREAD_PRIO prio) {
#ifndef WIN32
pthread_attr_t attr;
#endif
size_t tmp;
unsigned int i;
- rAthread handle = NULL;
+ rAthread *handle = NULL;
// given stacksize aligned to systems pagesize?
- tmp = szStack % getpagesize();
+ tmp = szStack % sysinfo->getpagesize();
if(tmp != 0)
szStack += tmp;
- // Get a free Thread Slot.
+ // Get a free Thread Slot.
for(i = 0; i < RA_THREADS_MAX; i++){
if(l_threads[i].proc == NULL){
handle = &l_threads[i];
@@ -195,12 +193,12 @@ rAthread rathread_createEx( rAthreadProc entryPoint, void *param, size_t szSta
handle->param = param;
#ifdef WIN32
- handle->hThread = CreateThread(NULL, szStack, _raThreadMainRedirector, (void*)handle, 0, NULL);
+ handle->hThread = CreateThread(NULL, szStack, raThreadMainRedirector, (void*)handle, 0, NULL);
#else
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, szStack);
- if(pthread_create(&handle->hThread, &attr, _raThreadMainRedirector, (void*)handle) != 0){
+ if(pthread_create(&handle->hThread, &attr, raThreadMainRedirector, (void*)handle) != 0){
handle->proc = NULL;
handle->param = NULL;
return NULL;
@@ -214,7 +212,7 @@ rAthread rathread_createEx( rAthreadProc entryPoint, void *param, size_t szSta
}//end: rathread_createEx
-void rathread_destroy ( rAthread handle ){
+void rathread_destroy(rAthread *handle) {
#ifdef WIN32
if( TerminateThread(handle->hThread, 0) != FALSE){
CloseHandle(handle->hThread);
@@ -223,24 +221,23 @@ void rathread_destroy ( rAthread handle ){
#else
if( pthread_cancel( handle->hThread ) == 0){
- // We have to join it, otherwise pthread wont re-cycle its internal ressources assoc. with this thread.
- //
+ // We have to join it, otherwise pthread wont re-cycle its internal resources assoc. with this thread.
pthread_join( handle->hThread, NULL );
- // Tell our manager to release ressources ;)
+ // Tell our manager to release resources ;)
rat_thread_terminated(handle);
}
#endif
}//end: rathread_destroy()
-rAthread rathread_self( ){
+rAthread *rathread_self(void) {
#ifdef HAS_TLS
- rAthread handle = &l_threads[g_rathread_ID];
+ rAthread *handle = &l_threads[g_rathread_ID];
- if(handle->proc != NULL) // entry point set, so its used!
+ if(handle->proc != NULL) // entry point set, so its used!
return handle;
#else
- // .. so no tls means we have to search the thread by its api-handle ..
+ // .. so no tls means we have to search the thread by its api-handle ..
int i;
#ifdef WIN32
@@ -258,16 +255,16 @@ rAthread rathread_self( ){
#endif
- return NULL;
+ return NULL;
}//end: rathread_self()
-int rathread_get_tid(){
+int rathread_get_tid(void) {
-#ifdef HAS_TLS
+#ifdef HAS_TLS
return g_rathread_ID;
#else
- // todo
+ // TODO
#ifdef WIN32
return (int)GetCurrentThreadId();
#else
@@ -279,7 +276,7 @@ int rathread_get_tid(){
}//end: rathread_get_tid()
-bool rathread_wait( rAthread handle, void* *out_exitCode ){
+bool rathread_wait(rAthread *handle, void **out_exitCode) {
// Hint:
// no thread data cleanup routine call here!
@@ -287,7 +284,7 @@ bool rathread_wait( rAthread handle, void* *out_exitCode ){
//
#ifdef WIN32
WaitForSingleObject(handle->hThread, INFINITE);
- return true;
+ return true;
#else
if(pthread_join(handle->hThread, out_exitCode) == 0)
return true;
@@ -297,21 +294,21 @@ bool rathread_wait( rAthread handle, void* *out_exitCode ){
}//end: rathread_wait()
-void rathread_prio_set( rAthread handle, RATHREAD_PRIO prio ){
- handle->prio = RAT_PRIO_NORMAL;
- //@TODO
+void rathread_prio_set(rAthread *handle, RATHREAD_PRIO prio) {
+ handle->prio = RAT_PRIO_NORMAL;
+ //@TODO
}//end: rathread_prio_set()
-RATHREAD_PRIO rathread_prio_get( rAthread handle){
+RATHREAD_PRIO rathread_prio_get(rAthread *handle) {
return handle->prio;
}//end: rathread_prio_get()
-void rathread_yield(){
-#ifdef WIN32
+void rathread_yield(void) {
+#ifdef WIN32
SwitchToThread();
#else
sched_yield();
-#endif
+#endif
}//end: rathread_yield()