From 8dfb783b14dfd5da99268acec49592f0a0fe5a1b Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 25 Jan 2007 20:42:07 +0000 Subject: [PATCH] added linux support --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40361 --- extensions/threader/Makefile | 92 +++++++++++++++++++++ extensions/threader/smsdk_ext.cpp | 31 +++++++ extensions/threader/smsdk_ext.h | 2 + extensions/threader/thread/PosixThreads.cpp | 16 ++++ extensions/threader/thread/PosixThreads.h | 16 ++-- 5 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 extensions/threader/Makefile diff --git a/extensions/threader/Makefile b/extensions/threader/Makefile new file mode 100644 index 00000000..a02f6076 --- /dev/null +++ b/extensions/threader/Makefile @@ -0,0 +1,92 @@ +#(C)2004-2006 SourceMM Development Team +# Makefile written by David "BAILOPAN" Anderson + +SMSDK = ../.. +SRCDS = ~/srcds +SOURCEMM = ../../../../sourcemm + +##################################### +### EDIT BELOW FOR OTHER PROJECTS ### +##################################### + +PROJECT = threader + +#Uncomment for SourceMM-enabled extensions +#LINK_HL2 = $(HL2LIB)/tier1_i486.a vstdlib_i486.so tier0_i486.so + +OBJECTS = extension.cpp smsdk_ext.cpp thread/BaseWorker.cpp thread/PosixThreads.cpp \ + thread/ThreadWorker.cpp + +############################################## +### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### +############################################## + +C_OPT_FLAGS = -O3 -funroll-loops -s -pipe -fno-strict-aliasing +C_DEBUG_FLAGS = -g -ggdb3 +CPP_GCC4_FLAGS = -fvisibility=hidden -fvisibility-inlines-hidden +CPP = gcc-4.1 + +HL2PUB = $(HL2SDK)/public +HL2LIB = $(HL2SDK)/linux_sdk +HL2SDK = $(SOURCEMM)/hl2sdk +SMM_TRUNK = $(SOURCEMM)/trunk + +LINK = $(LINK_HL2) -lpthread -static-libgcc + +INCLUDE = -I. -I.. -I$(HL2PUB) -I$(HL2PUB)/dlls -I$(HL2PUB)/engine -I$(HL2PUB)/tier0 -I$(HL2PUB)/tier1 \ + -I$(HL2PUB)/vstdlib -I$(HL2SDK)/tier1 -I$(SMM_TRUNK) -I$(SMM_TRUNK)/sourcehook -I$(SMM_TRUNK)/sourcemm \ + -I$(SMSDK)/public -I$(SMSDK)/public/sourcepawn -I$(SMSDK)/public/extensions \ + +CFLAGS = -D_LINUX -DNDEBUG -Dstricmp=strcasecmp -D_stricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -D_snprintf=snprintf -D_vsnprintf=vsnprintf -D_alloca=alloca -Dstrcmpi=strcasecmp -Wall -Werror -fPIC -msse -DSOURCEMOD_BUILD -DSM_DEFAULT_THREADER +CPPFLAGS = -Wno-non-virtual-dtor -fno-exceptions -fno-rtti + +################################################ +### DO NOT EDIT BELOW HERE FOR MOST PROJECTS ### +################################################ + +ifeq "$(DEBUG)" "true" + BIN_DIR = Debug + CFLAGS += $(C_DEBUG_FLAGS) +else + BIN_DIR = Release + CFLAGS += $(C_OPT_FLAGS) +endif + + +GCC_VERSION := $(shell $(CPP) -dumpversion >&1 | cut -b1) +ifeq "$(GCC_VERSION)" "4" + CPPFLAGS += $(CPP_GCC4_FLAGS) +endif + +BINARY = $(PROJECT).ext.so + +OBJ_LINUX := $(OBJECTS:%.cpp=$(BIN_DIR)/%.o) +OBJ_LINUX := $(OBJECTS:%.c=$(BIN_DIR)/%.o) + +$(BIN_DIR)/%.o: %.cpp + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) -o $@ -c $< + +$(BIN_DIR)/%.o: %.c + $(CPP) $(INCLUDE) $(CFLAGS) -o $@ -c $< + +all: + mkdir -p $(BIN_DIR)/thread + ln -sf $(SRCDS)/bin/vstdlib_i486.so vstdlib_i486.so + ln -sf $(SRCDS)/bin/tier0_i486.so tier0_i486.so + $(MAKE) extension + rm -rf $(BINARY) + +extension: $(OBJ_LINUX) + $(CPP) $(INCLUDE) $(CFLAGS) $(CPPFLAGS) $(OBJ_LINUX) $(LINK) -shared -ldl -lm -o$(BIN_DIR)/$(BINARY) + +debug: + $(MAKE) all DEBUG=true + +default: all + +clean: + rm -rf Release/*.o + rm -rf Release/$(BINARY) + rm -rf Debug/*.o + rm -rf Debug/$(BINARY) + diff --git a/extensions/threader/smsdk_ext.cpp b/extensions/threader/smsdk_ext.cpp index 01e3f42c..0dfcd408 100644 --- a/extensions/threader/smsdk_ext.cpp +++ b/extensions/threader/smsdk_ext.cpp @@ -1,10 +1,12 @@ #include +#include #include "smsdk_ext.h" IShareSys *g_pShareSys = NULL; IExtension *myself = NULL; IHandleSys *g_pHandleSys = NULL; ISourceMod *g_pSM = NULL; +IForwardManager *g_pForwards = NULL; PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI() { @@ -40,6 +42,7 @@ bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys); SM_GET_IFACE(SOURCEMOD, g_pSM); + SM_GET_IFACE(FORWARDMANAGER, g_pForwards); if (SDK_OnLoad(error, err_max, late)) { @@ -277,3 +280,31 @@ bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t err } #endif + +/* Overload a few things to prevent libstdc++ linking */ +#if defined __linux__ +extern "C" void __cxa_pure_virtual(void) +{ +} + +void *operator new(size_t size) +{ + return malloc(size); +} + +void *operator new[](size_t size) +{ + return malloc(size); +} + +void operator delete(void *ptr) +{ + free(ptr); +} + +void operator delete[](void * ptr) +{ + free(ptr); +} +#endif + diff --git a/extensions/threader/smsdk_ext.h b/extensions/threader/smsdk_ext.h index 07362c78..16d931bc 100644 --- a/extensions/threader/smsdk_ext.h +++ b/extensions/threader/smsdk_ext.h @@ -7,6 +7,7 @@ #include #include #include +#include #if defined SMEXT_CONF_METAMOD #include @@ -123,6 +124,7 @@ extern IShareSys *g_pShareSys; extern IExtension *myself; extern IHandleSys *g_pHandleSys; extern ISourceMod *g_pSM; +extern IForwardManager *g_pForwards; #if defined SMEXT_CONF_METAMOD PLUGIN_GLOBALVARS(); diff --git a/extensions/threader/thread/PosixThreads.cpp b/extensions/threader/thread/PosixThreads.cpp index f08b9210..5c801e14 100644 --- a/extensions/threader/thread/PosixThreads.cpp +++ b/extensions/threader/thread/PosixThreads.cpp @@ -1,5 +1,21 @@ #include #include "PosixThreads.h" +#include "ThreadWorker.h" + +IThreadWorker *PosixThreader::MakeWorker(bool threaded) +{ + if (threaded) + { + return new ThreadWorker(this, DEFAULT_THINK_TIME_MS); + } else { + return new BaseWorker(); + } +} + +void PosixThreader::DestroyWorker(IThreadWorker *pWorker) +{ + delete pWorker; +} void PosixThreader::ThreadSleep(unsigned int ms) { diff --git a/extensions/threader/thread/PosixThreads.h b/extensions/threader/thread/PosixThreads.h index 30a5ee75..3a8eb9ed 100644 --- a/extensions/threader/thread/PosixThreads.h +++ b/extensions/threader/thread/PosixThreads.h @@ -65,13 +65,15 @@ public: pthread_mutex_t m_mutex; }; public: - virtual IMutex *MakeMutex(); - virtual void MakeThread(IThread *pThread); - virtual IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags); - virtual IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params); - virtual void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min); - virtual void ThreadSleep(unsigned int ms); - virtual IEventSignal *MakeEventSignal(); + IMutex *MakeMutex(); + void MakeThread(IThread *pThread); + IThreadHandle *MakeThread(IThread *pThread, ThreadFlags flags); + IThreadHandle *MakeThread(IThread *pThread, const ThreadParams *params); + void GetPriorityBounds(ThreadPriority &max, ThreadPriority &min); + void ThreadSleep(unsigned int ms); + IEventSignal *MakeEventSignal(); + IThreadWorker *MakeWorker(bool threaded); + void DestroyWorker(IThreadWorker *pWorker); }; #if defined SM_DEFAULT_THREADER && !defined SM_MAIN_THREADER