Compare commits
13
Commits
timestuff
...
threadstuff
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f58772a570 | ||
|
|
f7c065b22e | ||
|
|
55c8546d68 | ||
|
|
1762f18116 | ||
|
|
e4dbf1ce11 | ||
|
|
10b9d96259 | ||
|
|
b23154fd93 | ||
|
|
b0ee972178 | ||
|
|
544e1d3b21 | ||
|
|
0ca6947f99 | ||
|
|
3122c08039 | ||
|
|
7a279a6fd9 | ||
|
|
c4581bd9a6 |
No files matched your search
@@ -191,6 +191,7 @@ set(SRB2_CORE_GAME_SOURCES
|
|||||||
k_kart.c
|
k_kart.c
|
||||||
k_stats.c
|
k_stats.c
|
||||||
i_time.c
|
i_time.c
|
||||||
|
i_threads.c
|
||||||
|
|
||||||
p_local.h
|
p_local.h
|
||||||
p_maputl.h
|
p_maputl.h
|
||||||
|
|||||||
@@ -8,11 +8,6 @@ ifdef MINGW
|
|||||||
libs+=-mconsole
|
libs+=-mconsole
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef NOTHREADS
|
|
||||||
opts+=-DHAVE_THREADS
|
|
||||||
sources+=dedicated/i_threads.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
NOOPENMPT=1
|
NOOPENMPT=1
|
||||||
NOLIBGME=1
|
NOLIBGME=1
|
||||||
NOHW=1
|
NOHW=1
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ endif
|
|||||||
sources+=$(call List,hardware/Sourcefile)
|
sources+=$(call List,hardware/Sourcefile)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifndef NOTHREADS
|
||||||
|
opts+=-DHAVE_THREADS
|
||||||
|
sources+=i_threads.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef NOMD5
|
ifndef NOMD5
|
||||||
sources+=md5.c
|
sources+=md5.c
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -40,11 +40,6 @@ sources+=sdl/mixer_sound.c
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef NOTHREADS
|
|
||||||
opts+=-DHAVE_THREADS
|
|
||||||
sources+=sdl/i_threads.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef SDL_PKGCONFIG
|
ifdef SDL_PKGCONFIG
|
||||||
$(eval $(call Use_pkg_config,SDL))
|
$(eval $(call Use_pkg_config,SDL))
|
||||||
else
|
else
|
||||||
|
|||||||
+3
-3
@@ -44,14 +44,14 @@
|
|||||||
#define MAXHUDLINES 20
|
#define MAXHUDLINES 20
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_mutex con_mutex;
|
I_Mutex con_mutex;
|
||||||
|
|
||||||
// g_in_exiting_signal_handler is an evil hack
|
// g_in_exiting_signal_handler is an evil hack
|
||||||
// to avoid infinite SIGABRT recursion in the signal handler
|
// to avoid infinite SIGABRT recursion in the signal handler
|
||||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||||
// or something like that. idk
|
// or something like that. idk
|
||||||
# define Lock_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&con_mutex); }
|
# define Lock_state() if (!g_in_exiting_signal_handler) { I_LockMutex(&con_mutex); }
|
||||||
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(con_mutex); }
|
# define Unlock_state() if (!g_in_exiting_signal_handler) { I_UnlockMutex(con_mutex); }
|
||||||
#else/*HAVE_THREADS*/
|
#else/*HAVE_THREADS*/
|
||||||
# define Lock_state()
|
# define Lock_state()
|
||||||
# define Unlock_state()
|
# define Unlock_state()
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ void CON_Init(void);
|
|||||||
boolean CON_Responder(event_t *ev);
|
boolean CON_Responder(event_t *ev);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
extern I_mutex con_mutex;
|
extern I_Mutex con_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// set true when screen size has changed, to adapt console
|
// set true when screen size has changed, to adapt console
|
||||||
|
|||||||
+4
-4
@@ -2830,11 +2830,11 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic
|
|||||||
F_TitleScreenDrawer();
|
F_TitleScreenDrawer();
|
||||||
CL_DrawConnectionStatus();
|
CL_DrawConnectionStatus();
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Drawer(); //Needed for drawing messageboxes on the connection screen
|
M_Drawer(); //Needed for drawing messageboxes on the connection screen
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
I_UpdateNoVsync(); // page flip or blit buffer
|
I_UpdateNoVsync(); // page flip or blit buffer
|
||||||
if (moviemode)
|
if (moviemode)
|
||||||
@@ -7187,12 +7187,12 @@ void NetUpdate(void)
|
|||||||
{
|
{
|
||||||
resptime = nowtime;
|
resptime = nowtime;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Ticker();
|
M_Ticker();
|
||||||
refreshdirmenu = 0;
|
refreshdirmenu = 0;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
CON_Ticker();
|
CON_Ticker();
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-6
@@ -223,13 +223,13 @@ void D_ProcessEvents(void)
|
|||||||
|
|
||||||
// Menu input
|
// Menu input
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
eaten = M_Responder(ev);
|
eaten = M_Responder(ev);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (eaten)
|
if (eaten)
|
||||||
@@ -244,13 +244,13 @@ void D_ProcessEvents(void)
|
|||||||
|
|
||||||
// console input
|
// console input
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&con_mutex);
|
I_LockMutex(&con_mutex);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
eaten = CON_Responder(ev);
|
eaten = CON_Responder(ev);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(con_mutex);
|
I_UnlockMutex(con_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (eaten)
|
if (eaten)
|
||||||
@@ -577,11 +577,11 @@ static boolean D_Display(void)
|
|||||||
vid.recalc = false;
|
vid.recalc = false;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Drawer(); // menu is drawn even on top of everything...
|
M_Drawer(); // menu is drawn even on top of everything...
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
// focus lost moved to M_Drawer
|
// focus lost moved to M_Drawer
|
||||||
|
|
||||||
|
|||||||
@@ -1009,6 +1009,9 @@ void D_RegisterClientCommands(void)
|
|||||||
CV_RegisterVar(&cv_gamepadled[i]);
|
CV_RegisterVar(&cv_gamepadled[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_gamepadledifunfocused);
|
||||||
|
CV_RegisterVar(&cv_rumbleifunfocused);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_usemouse);
|
CV_RegisterVar(&cv_usemouse);
|
||||||
CV_RegisterVar(&cv_invertmouse);
|
CV_RegisterVar(&cv_invertmouse);
|
||||||
CV_RegisterVar(&cv_mousexsens);
|
CV_RegisterVar(&cv_mousexsens);
|
||||||
|
|||||||
+6
-6
@@ -112,7 +112,7 @@ static fileused_t transferFiles[UINT8_MAX + 1];
|
|||||||
INT32 fileneedednum = 0; // Number of files needed to join the server
|
INT32 fileneedednum = 0; // Number of files needed to join the server
|
||||||
fileneeded_t fileneeded[MAX_WADFILES] = {}; // List of needed files
|
fileneeded_t fileneeded[MAX_WADFILES] = {}; // List of needed files
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
static I_mutex downloadmutex;
|
static I_Mutex downloadmutex;
|
||||||
#endif
|
#endif
|
||||||
char downloaddir[512] = "DOWNLOAD";
|
char downloaddir[512] = "DOWNLOAD";
|
||||||
|
|
||||||
@@ -1427,7 +1427,7 @@ void CURLPrepareFile(const char* url, int dfilenum)
|
|||||||
filedownload.http_running = true;
|
filedownload.http_running = true;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread("http-download", (I_thread_fn)CURLGetFile, NULL);
|
(void)!I_SpawnThread("http-download", (I_ThreadFn)CURLGetFile, NULL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1440,15 +1440,15 @@ void CURLAbortFile(void)
|
|||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
// lock and unlock to wait for the download thread to exit
|
// lock and unlock to wait for the download thread to exit
|
||||||
I_lock_mutex(&downloadmutex);
|
I_LockMutex(&downloadmutex);
|
||||||
I_unlock_mutex(downloadmutex);
|
I_UnlockMutex(downloadmutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CURLGetFile(void)
|
static void CURLGetFile(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&downloadmutex);
|
I_LockMutex(&downloadmutex);
|
||||||
#endif
|
#endif
|
||||||
CURLMcode mc; /* return code used by curl_multi_wait() */
|
CURLMcode mc; /* return code used by curl_multi_wait() */
|
||||||
CURLcode easyres; /* Return from easy interface */
|
CURLcode easyres; /* Return from easy interface */
|
||||||
@@ -1549,7 +1549,7 @@ static void CURLGetFile(void)
|
|||||||
|
|
||||||
filedownload.http_running = false;
|
filedownload.http_running = false;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(downloadmutex);
|
I_UnlockMutex(downloadmutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,5 @@ i_system.c
|
|||||||
i_main.c
|
i_main.c
|
||||||
i_video.c
|
i_video.c
|
||||||
i_sound.c
|
i_sound.c
|
||||||
i_threads.c
|
|
||||||
dosstr.c
|
dosstr.c
|
||||||
endtxt.c
|
endtxt.c
|
||||||
@@ -1381,8 +1381,8 @@ INT32 I_StartupSystem(void)
|
|||||||
I_Fork();
|
I_Fork();
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_start_threads();
|
I_StartThreads();
|
||||||
I_AddExitFunc(I_stop_threads);
|
I_AddExitFunc(I_StopThreads);
|
||||||
#endif
|
#endif
|
||||||
I_RegisterSignals();
|
I_RegisterSignals();
|
||||||
#ifndef NOMUMBLE
|
#ifndef NOMUMBLE
|
||||||
|
|||||||
@@ -223,6 +223,8 @@ typedef int32_t boolean;
|
|||||||
|
|
||||||
#define FUNCNOINLINE __attribute__((noinline))
|
#define FUNCNOINLINE __attribute__((noinline))
|
||||||
|
|
||||||
|
#define FUNCWARNRV __attribute__((warn_unused_result))
|
||||||
|
|
||||||
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
|
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
|
||||||
#ifdef __i386__ // i386 only
|
#ifdef __i386__ // i386 only
|
||||||
#define FUNCTARGET(X) __attribute__ ((__target__ (X)))
|
#define FUNCTARGET(X) __attribute__ ((__target__ (X)))
|
||||||
@@ -268,6 +270,9 @@ typedef int32_t boolean;
|
|||||||
#ifndef FUNCTARGET
|
#ifndef FUNCTARGET
|
||||||
#define FUNCTARGET(x)
|
#define FUNCTARGET(x)
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef FUNCWARNRV
|
||||||
|
#define FUNCWARNRV
|
||||||
|
#endif
|
||||||
#ifndef ATTRPACK
|
#ifndef ATTRPACK
|
||||||
#define ATTRPACK
|
#define ATTRPACK
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+1
-3
@@ -1172,9 +1172,7 @@ void F_StartWaitingPlayers(void)
|
|||||||
randskin = M_RandomKey(numskins);
|
randskin = M_RandomKey(numskins);
|
||||||
boolean waithires = skins[randskin].flags && SF_HIRES;
|
boolean waithires = skins[randskin].flags && SF_HIRES;
|
||||||
|
|
||||||
if (waitcolormap)
|
Z_Free(waitcolormap);
|
||||||
Z_Free(waitcolormap);
|
|
||||||
|
|
||||||
waitcolormap = R_GetTranslationColormap(randskin, skins[randskin].prefcolor, 0);
|
waitcolormap = R_GetTranslationColormap(randskin, skins[randskin].prefcolor, 0);
|
||||||
|
|
||||||
if (waithires)
|
if (waithires)
|
||||||
|
|||||||
+2
-2
@@ -388,11 +388,11 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
|
|||||||
if (rendermode != render_none && drawMenu)
|
if (rendermode != render_none && drawMenu)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_Drawer(); // menu is drawn even on top of wipes
|
M_Drawer(); // menu is drawn even on top of wipes
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-8
@@ -317,8 +317,7 @@ void closefilemenu(boolean validsize)
|
|||||||
coredirmenu = NULL;
|
coredirmenu = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refreshdirname)
|
Z_Free(refreshdirname);
|
||||||
Z_Free(refreshdirname);
|
|
||||||
refreshdirname = NULL;
|
refreshdirname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,8 +345,7 @@ void searchfilemenu(char *tempname)
|
|||||||
|
|
||||||
if (!menusearch.length)
|
if (!menusearch.length)
|
||||||
{
|
{
|
||||||
if (dirmenu)
|
Z_Free(dirmenu);
|
||||||
Z_Free(dirmenu);
|
|
||||||
dirmenu = coredirmenu;
|
dirmenu = coredirmenu;
|
||||||
sizedirmenu = sizecoredirmenu;
|
sizedirmenu = sizecoredirmenu;
|
||||||
|
|
||||||
@@ -389,8 +387,8 @@ void searchfilemenu(char *tempname)
|
|||||||
I_Error("searchfilemenu(): could not create \"No results...\".");
|
I_Error("searchfilemenu(): could not create \"No results...\".");
|
||||||
sizedirmenu = 1;
|
sizedirmenu = 1;
|
||||||
dir_on[menudepthleft] = 0;
|
dir_on[menudepthleft] = 0;
|
||||||
if (tempname)
|
Z_Free(tempname);
|
||||||
Z_Free(tempname);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,8 +503,8 @@ boolean preparefilemenu(boolean samedepth, boolean replayhut)
|
|||||||
{
|
{
|
||||||
closedir(dirhandle);
|
closedir(dirhandle);
|
||||||
closefilemenu(false);
|
closefilemenu(false);
|
||||||
if (tempname)
|
Z_Free(tempname);
|
||||||
Z_Free(tempname);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-9
@@ -456,10 +456,10 @@ consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS] = {
|
|||||||
|
|
||||||
//static CV_PossibleValue_t autoaccelcons_t[] = {{0, "Off"}, {1, "Manual"}, {2, "Automatic"}, {0, NULL}};
|
//static CV_PossibleValue_t autoaccelcons_t[] = {{0, "Off"}, {1, "Manual"}, {2, "Automatic"}, {0, NULL}};
|
||||||
consvar_t cv_autoaccel[MAXSPLITSCREENPLAYERS] = {
|
consvar_t cv_autoaccel[MAXSPLITSCREENPLAYERS] = {
|
||||||
{"autoaccel", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
{"kartautoaccel", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"autoaccel2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
{"kartautoaccel2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"autoaccel3", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
{"kartautoaccel3", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL},
|
||||||
{"autoaccel4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
{"kartautoaccel4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t driftsparkpulse_t[] = {{0, "MIN"}, {FRACUNIT*3, "MAX"}, {0, NULL}};
|
||||||
@@ -523,11 +523,8 @@ void G_ClearRecords(void)
|
|||||||
INT16 i;
|
INT16 i;
|
||||||
for (i = 0; i < NUMMAPS; ++i)
|
for (i = 0; i < NUMMAPS; ++i)
|
||||||
{
|
{
|
||||||
if (mainrecords[i])
|
Z_Free(mainrecords[i]);
|
||||||
{
|
mainrecords[i] = NULL;
|
||||||
Z_Free(mainrecords[i]);
|
|
||||||
mainrecords[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -81,6 +81,9 @@ consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS] = {
|
|||||||
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
{"gamepadled4", "Skincolor", CV_SAVE|CV_CALL|CV_NOINIT, gamepadled_cons_t, led_off_handle4, 0, NULL, NULL, 0, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
consvar_t cv_gamepadledifunfocused = {"gamepadledunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_rumbleifunfocused = {"rumbleifunfocused", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
static void rumble_off_handle(void)
|
static void rumble_off_handle(void)
|
||||||
{
|
{
|
||||||
if (!cv_rumble[0].value)
|
if (!cv_rumble[0].value)
|
||||||
@@ -930,7 +933,7 @@ void G_SetPlayerGamepadIndicatorColor(INT32 playernum, UINT8 color)
|
|||||||
|
|
||||||
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
|
|
||||||
if (cv_gamepadled[playernum].value == 0
|
if (cv_gamepadled[playernum].value == 0 || (window_notinfocus && cv_gamepadledifunfocused.value == 0)
|
||||||
|| color >= MAXTRANSLATIONS)
|
|| color >= MAXTRANSLATIONS)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -1009,7 +1012,7 @@ void G_PlayerDeviceRumble(INT32 playernum, UINT16 low_strength, UINT16 high_stre
|
|||||||
{
|
{
|
||||||
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
I_Assert(playernum >= 0 && playernum < MAXSPLITSCREENPLAYERS);
|
||||||
|
|
||||||
if (cv_rumble[playernum].value == 0)
|
if (cv_rumble[playernum].value == 0 || (window_notinfocus && cv_rumbleifunfocused.value == 0))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,9 @@ extern consvar_t cv_rumble[MAXSPLITSCREENPLAYERS];
|
|||||||
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
extern consvar_t cv_rumblestrength[MAXSPLITSCREENPLAYERS];
|
||||||
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
extern consvar_t cv_gamepadled[MAXSPLITSCREENPLAYERS];
|
||||||
|
|
||||||
|
extern consvar_t cv_gamepadledifunfocused;
|
||||||
|
extern consvar_t cv_rumbleifunfocused;
|
||||||
|
|
||||||
extern INT32 mousex, mousey;
|
extern INT32 mousex, mousey;
|
||||||
|
|
||||||
extern INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
extern INT32 joyxmove[MAXSPLITSCREENPLAYERS][JOYAXISSET], joyymove[MAXSPLITSCREENPLAYERS][JOYAXISSET];
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ angle_t gld_FrustumAngle(angle_t tiltangle)
|
|||||||
floatangle = 2.0 + (45.0 + ((double)tilt / 1.9)) * clipfov / 90.0;
|
floatangle = 2.0 + (45.0 + ((double)tilt / 1.9)) * clipfov / 90.0;
|
||||||
if (floatangle >= 180.0)
|
if (floatangle >= 180.0)
|
||||||
return 0xffffffff;
|
return 0xffffffff;
|
||||||
a1 = (angle_t)xs_CRoundToInt(ANG1 * floatangle);
|
a1 = (angle_t)lrint(ANG1 * floatangle);
|
||||||
return a1;
|
return a1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -579,7 +579,7 @@ md2found:
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_AddPlayerMD2(int skin, boolean local) // For MD2's that were added after startup
|
void HWR_AddPlayerMD2(INT32 skin, boolean local) // For MD2's that were added after startup
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char name[20], filename[32];
|
char name[20], filename[32];
|
||||||
|
|||||||
+9
-9
@@ -62,7 +62,7 @@ static int hms_started;
|
|||||||
|
|
||||||
static char *hms_api;
|
static char *hms_api;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
static I_mutex hms_api_mutex;
|
static I_Mutex hms_api_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *hms_server_token;
|
static char *hms_server_token;
|
||||||
@@ -90,9 +90,9 @@ Printf_url (const char *url)
|
|||||||
boolean startup;
|
boolean startup;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&con_mutex);
|
I_LockMutex(&con_mutex);
|
||||||
startup = con_startup;
|
startup = con_startup;
|
||||||
I_unlock_mutex(con_mutex);
|
I_UnlockMutex(con_mutex);
|
||||||
#else
|
#else
|
||||||
startup = con_startup;
|
startup = con_startup;
|
||||||
#endif
|
#endif
|
||||||
@@ -183,7 +183,7 @@ HMS_connect (const char *format, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&hms_api_mutex);
|
I_LockMutex(&hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
seek = strlen(hms_api) + 1;/* + '/' */
|
seek = strlen(hms_api) + 1;/* + '/' */
|
||||||
@@ -195,7 +195,7 @@ HMS_connect (const char *format, ...)
|
|||||||
sprintf(url, "%s/", hms_api);
|
sprintf(url, "%s/", hms_api);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(hms_api_mutex);
|
I_UnlockMutex(hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
va_start (ap, format);
|
va_start (ap, format);
|
||||||
@@ -477,12 +477,12 @@ HMS_fetch_servers (msg_server_t *list, int query_id)
|
|||||||
if (address && port)
|
if (address && port)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&ms_QueryId_mutex);
|
I_LockMutex(&ms_QueryId_mutex);
|
||||||
{
|
{
|
||||||
if (query_id != ms_QueryId)
|
if (query_id != ms_QueryId)
|
||||||
doing_shit = 0;
|
doing_shit = 0;
|
||||||
}
|
}
|
||||||
I_unlock_mutex(ms_QueryId_mutex);
|
I_UnlockMutex(ms_QueryId_mutex);
|
||||||
|
|
||||||
if (! doing_shit)
|
if (! doing_shit)
|
||||||
break;
|
break;
|
||||||
@@ -611,14 +611,14 @@ void
|
|||||||
HMS_set_api (char *api)
|
HMS_set_api (char *api)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&hms_api_mutex);
|
I_LockMutex(&hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
free(hms_api);
|
free(hms_api);
|
||||||
hms_api = Strip_trailing_slashes(api);
|
hms_api = Strip_trailing_slashes(api);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(hms_api_mutex);
|
I_UnlockMutex(hms_api_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-12
@@ -1072,8 +1072,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
|
|||||||
|
|
||||||
HU_AddChatText(va(fmt2, prefix, cstart, dispname, textcolor, msg), cv_chatnotifications.value); // add to chat
|
HU_AddChatText(va(fmt2, prefix, cstart, dispname, textcolor, msg), cv_chatnotifications.value); // add to chat
|
||||||
|
|
||||||
if (tempchar)
|
Z_Free(tempchar);
|
||||||
Z_Free(tempchar);
|
|
||||||
}
|
}
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
// I just want to point out while I'm here that because the data is still
|
// I just want to point out while I'm here that because the data is still
|
||||||
@@ -1484,6 +1483,7 @@ static char *CHAT_WordWrap(INT32 x, INT32 w, INT32 option, const char *string)
|
|||||||
x = 0;
|
x = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return newstring;
|
return newstring;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1522,7 +1522,7 @@ static void HU_drawMiniChat(void)
|
|||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
|
|
||||||
while(msg[j]) // iterate through msg
|
while (msg[j]) // iterate through msg
|
||||||
{
|
{
|
||||||
if (msg[j] < HU_FONTSTART) // don't draw
|
if (msg[j] < HU_FONTSTART) // don't draw
|
||||||
{
|
{
|
||||||
@@ -1554,19 +1554,21 @@ static void HU_drawMiniChat(void)
|
|||||||
{
|
{
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_linereturn = false;
|
prev_linereturn = false;
|
||||||
dx += charwidth;
|
dx += charwidth;
|
||||||
|
|
||||||
if (dx >= boxw)
|
if (dx >= boxw)
|
||||||
{
|
{
|
||||||
dx = 0;
|
dx = 0;
|
||||||
linescount += 1;
|
linescount += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dy = 0;
|
dy = 0;
|
||||||
dx = 0;
|
dx = 0;
|
||||||
msglines += linescount+1;
|
msglines += linescount+1;
|
||||||
if (msg)
|
Z_Free(msg);
|
||||||
Z_Free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
y = chaty - charheight*(msglines+1);
|
y = chaty - charheight*(msglines+1);
|
||||||
@@ -1598,7 +1600,7 @@ static void HU_drawMiniChat(void)
|
|||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
|
|
||||||
while(msg[j]) // iterate through msg
|
while (msg[j]) // iterate through msg
|
||||||
{
|
{
|
||||||
if (msg[j] < HU_FONTSTART) // don't draw
|
if (msg[j] < HU_FONTSTART) // don't draw
|
||||||
{
|
{
|
||||||
@@ -1643,16 +1645,17 @@ static void HU_drawMiniChat(void)
|
|||||||
|
|
||||||
dx += charwidth;
|
dx += charwidth;
|
||||||
prev_linereturn = false;
|
prev_linereturn = false;
|
||||||
|
|
||||||
if (dx >= boxw)
|
if (dx >= boxw)
|
||||||
{
|
{
|
||||||
dx = 0;
|
dx = 0;
|
||||||
dy += charheight;
|
dy += charheight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dy += charheight;
|
dy += charheight;
|
||||||
dx = 0;
|
dx = 0;
|
||||||
if (msg)
|
Z_Free(msg);
|
||||||
Z_Free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrement addy and make that shit smooth:
|
// decrement addy and make that shit smooth:
|
||||||
@@ -1704,7 +1707,7 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
|
|
||||||
V_DrawFillConsoleMap(chatx, chat_topy, boxw, boxh*charheight +2, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT); // log box
|
V_DrawFillConsoleMap(chatx, chat_topy, boxw, boxh*charheight +2, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT); // log box
|
||||||
|
|
||||||
for (i=0; i<chat_nummsg_log; i++) // iterate through our chatlog
|
for (i = 0; i < chat_nummsg_log; i++) // iterate through our chatlog
|
||||||
{
|
{
|
||||||
INT32 clrflag = 0;
|
INT32 clrflag = 0;
|
||||||
INT32 j = 0;
|
INT32 j = 0;
|
||||||
@@ -1713,7 +1716,7 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
emote_t *emote = NULL;
|
emote_t *emote = NULL;
|
||||||
int emotelen = 0;
|
int emotelen = 0;
|
||||||
|
|
||||||
while(msg[j]) // iterate through msg
|
while (msg[j]) // iterate through msg
|
||||||
{
|
{
|
||||||
if (msg[j] < HU_FONTSTART) // don't draw
|
if (msg[j] < HU_FONTSTART) // don't draw
|
||||||
{
|
{
|
||||||
@@ -1758,10 +1761,10 @@ static void HU_drawChatLog(INT32 offset)
|
|||||||
dy += charheight;
|
dy += charheight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dy += charheight;
|
dy += charheight;
|
||||||
dx = 0;
|
dx = 0;
|
||||||
if (msg)
|
Z_Free(msg);
|
||||||
Z_Free(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((chat_scroll >= chat_maxscroll) || (chat_scrollmedown)) && !(justscrolleddown || justscrolledup || chat_scrolltime)) // was already at the bottom of the page before new maxscroll calculation and was NOT scrolling.
|
if (((chat_scroll >= chat_maxscroll) || (chat_scrollmedown)) && !(justscrolleddown || justscrolledup || chat_scrolltime)) // was already at the bottom of the page before new maxscroll calculation and was NOT scrolling.
|
||||||
|
|||||||
+4
-10
@@ -1510,11 +1510,8 @@ static boolean SOCK_SetBanUsername(const char *username)
|
|||||||
username = "Direct IP ban";
|
username = "Direct IP ban";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (banned[numbans - 1].username)
|
Z_Free(banned[numbans - 1].username);
|
||||||
{
|
banned[numbans - 1].username = NULL;
|
||||||
Z_Free(banned[numbans - 1].username);
|
|
||||||
banned[numbans - 1].username = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
banned[numbans - 1].username = Z_StrDup(username);
|
banned[numbans - 1].username = Z_StrDup(username);
|
||||||
|
|
||||||
@@ -1528,11 +1525,8 @@ static boolean SOCK_SetBanReason(const char *reason)
|
|||||||
reason = "No reason given";
|
reason = "No reason given";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (banned[numbans - 1].reason)
|
Z_Free(banned[numbans - 1].reason);
|
||||||
{
|
banned[numbans - 1].reason = NULL;
|
||||||
Z_Free(banned[numbans - 1].reason);
|
|
||||||
banned[numbans - 1].reason = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
banned[numbans - 1].reason = Z_StrDup(reason);
|
banned[numbans - 1].reason = Z_StrDup(reason);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SONIC ROBO BLAST 2
|
// SONIC ROBO BLAST 2 KART
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2020-2023 by James R.
|
// Copyright (C) 2020-2023 by James R.
|
||||||
//
|
//
|
||||||
@@ -9,12 +9,14 @@
|
|||||||
/// \file i_threads.c
|
/// \file i_threads.c
|
||||||
/// \brief Multithreading abstraction
|
/// \brief Multithreading abstraction
|
||||||
|
|
||||||
#if defined (__unix__) || (!defined(__APPLE__) && defined (UNIXCOMMON))
|
#ifdef HAVE_THREADS
|
||||||
|
#if defined (__unix__) || defined(UNIXCOMMON)
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#include "../i_threads.h"
|
#include "i_threads.h"
|
||||||
#include "../doomdef.h"
|
#include "doomdef.h"
|
||||||
|
#include "doomtype.h"
|
||||||
|
|
||||||
typedef struct thread_s thread_t;
|
typedef struct thread_s thread_t;
|
||||||
|
|
||||||
@@ -22,7 +24,7 @@ struct thread_s
|
|||||||
{
|
{
|
||||||
thread_t *next;
|
thread_t *next;
|
||||||
void *userdata;
|
void *userdata;
|
||||||
I_thread_fn func;
|
I_ThreadFn func;
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -41,12 +43,8 @@ static void *HandleThread(void *data)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
FUNCWARNRV
|
||||||
I_spawn_thread (
|
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
|
||||||
const char * name,
|
|
||||||
I_thread_fn entry,
|
|
||||||
void * userdata
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
(void)name;
|
(void)name;
|
||||||
@@ -66,17 +64,20 @@ I_spawn_thread (
|
|||||||
if (thread == NULL)
|
if (thread == NULL)
|
||||||
{
|
{
|
||||||
thread = malloc(sizeof(thread_t));
|
thread = malloc(sizeof(thread_t));
|
||||||
|
if (thread == NULL)
|
||||||
|
return false;
|
||||||
thread->next = thread_list;
|
thread->next = thread_list;
|
||||||
thread_list = thread;
|
thread_list = thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->func = entry;
|
thread->func = entry;
|
||||||
thread->userdata = userdata;
|
thread->userdata = userdata;
|
||||||
pthread_create(&thread->thread, NULL, HandleThread, thread);
|
int err = pthread_create(&thread->thread, NULL, HandleThread, thread);
|
||||||
pthread_mutex_unlock(&thread_lock);
|
pthread_mutex_unlock(&thread_lock);
|
||||||
|
return err == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int I_thread_is_stopped(void)
|
int I_ThreadIsStopped(void)
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
@@ -94,11 +95,11 @@ int I_thread_is_stopped(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_start_threads(void)
|
void I_StartThreads(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_stop_threads(void)
|
void I_StopThreads(void)
|
||||||
{
|
{
|
||||||
thread_t *thread = thread_list;
|
thread_t *thread = thread_list;
|
||||||
while (thread != NULL)
|
while (thread != NULL)
|
||||||
@@ -109,7 +110,7 @@ void I_stop_threads(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_lock_mutex(I_mutex *anchor)
|
void I_LockMutex(I_Mutex *anchor)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -127,25 +128,25 @@ void I_lock_mutex(I_mutex *anchor)
|
|||||||
pthread_mutex_lock(*anchor);
|
pthread_mutex_lock(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_unlock_mutex(I_mutex id)
|
void I_UnlockMutex(I_Mutex id)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(id);
|
pthread_mutex_unlock(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id)
|
void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
|
||||||
{
|
{
|
||||||
I_Assert(mutex_id != NULL);
|
I_Assert(mutexId != NULL);
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*cond_anchor == NULL)
|
if (*condAnchor == NULL)
|
||||||
{
|
{
|
||||||
*cond_anchor = malloc(sizeof(pthread_cond_t));
|
*condAnchor = malloc(sizeof(pthread_cond_t));
|
||||||
pthread_cond_init(*cond_anchor, NULL);
|
pthread_cond_init(*condAnchor, NULL);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&thread_lock);
|
pthread_mutex_unlock(&thread_lock);
|
||||||
pthread_cond_wait(*cond_anchor, mutex_id);
|
pthread_cond_wait(*condAnchor, mutexId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_one_cond(I_cond *anchor)
|
void I_WakeOneCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -157,7 +158,7 @@ void I_wake_one_cond(I_cond *anchor)
|
|||||||
pthread_cond_signal(*anchor);
|
pthread_cond_signal(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_all_cond(I_cond *anchor)
|
void I_WakeAllCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&thread_lock);
|
pthread_mutex_lock(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -168,12 +169,17 @@ void I_wake_all_cond(I_cond *anchor)
|
|||||||
pthread_mutex_unlock(&thread_lock);
|
pthread_mutex_unlock(&thread_lock);
|
||||||
pthread_cond_broadcast(*anchor);
|
pthread_cond_broadcast(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
thread_handle_t I_GetCurrentThread(void)
|
||||||
|
{
|
||||||
|
return pthread_self();
|
||||||
|
}
|
||||||
#elif defined (_WIN32)
|
#elif defined (_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "../i_threads.h"
|
#include "i_threads.h"
|
||||||
#include "../doomdef.h"
|
#include "doomdef.h"
|
||||||
#include "../doomtype.h"
|
#include "doomtype.h"
|
||||||
|
|
||||||
typedef struct thread_s thread_t;
|
typedef struct thread_s thread_t;
|
||||||
|
|
||||||
@@ -181,9 +187,9 @@ struct thread_s
|
|||||||
{
|
{
|
||||||
thread_t *next;
|
thread_t *next;
|
||||||
void *userdata;
|
void *userdata;
|
||||||
I_thread_fn func;
|
I_ThreadFn func;
|
||||||
HANDLE thread;
|
HANDLE thread;
|
||||||
DWORD thread_id;
|
DWORD threadId;
|
||||||
};
|
};
|
||||||
|
|
||||||
// we use a linked list to avoid moving memory blocks when allocating new threads.
|
// we use a linked list to avoid moving memory blocks when allocating new threads.
|
||||||
@@ -201,7 +207,8 @@ static DWORD __stdcall HandleThread(void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
|
FUNCWARNRV
|
||||||
|
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
(void)name;
|
(void)name;
|
||||||
@@ -219,17 +226,20 @@ void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
|
|||||||
if (thread == NULL)
|
if (thread == NULL)
|
||||||
{
|
{
|
||||||
thread = malloc(sizeof(thread_t));
|
thread = malloc(sizeof(thread_t));
|
||||||
|
if (thread == NULL)
|
||||||
|
return false;
|
||||||
thread->next = thread_list;
|
thread->next = thread_list;
|
||||||
thread_list = thread;
|
thread_list = thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->func = entry;
|
thread->func = entry;
|
||||||
thread->userdata = userdata;
|
thread->userdata = userdata;
|
||||||
thread->thread = CreateThread(NULL, 0, HandleThread, thread, 0, &thread->thread_id);
|
thread->thread = CreateThread(NULL, 0, HandleThread, thread, 0, &thread->threadId);
|
||||||
LeaveCriticalSection(&thread_lock);
|
LeaveCriticalSection(&thread_lock);
|
||||||
|
return thread->thread != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int I_thread_is_stopped(void)
|
int I_ThreadIsStopped(void)
|
||||||
{
|
{
|
||||||
thread_t *thread;
|
thread_t *thread;
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
@@ -247,12 +257,12 @@ int I_thread_is_stopped(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_start_threads(void)
|
void I_StartThreads(void)
|
||||||
{
|
{
|
||||||
InitializeCriticalSection(&thread_lock);
|
InitializeCriticalSection(&thread_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_stop_threads(void)
|
void I_StopThreads(void)
|
||||||
{
|
{
|
||||||
thread_t *thread = thread_list;
|
thread_t *thread = thread_list;
|
||||||
while (thread != NULL)
|
while (thread != NULL)
|
||||||
@@ -264,7 +274,7 @@ void I_stop_threads(void)
|
|||||||
DeleteCriticalSection(&thread_lock);
|
DeleteCriticalSection(&thread_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_lock_mutex(I_mutex *anchor)
|
void I_LockMutex(I_Mutex *anchor)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -276,25 +286,25 @@ void I_lock_mutex(I_mutex *anchor)
|
|||||||
EnterCriticalSection(*anchor);
|
EnterCriticalSection(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_unlock_mutex(I_mutex id)
|
void I_UnlockMutex(I_Mutex id)
|
||||||
{
|
{
|
||||||
LeaveCriticalSection(id);
|
LeaveCriticalSection(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id)
|
void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
|
||||||
{
|
{
|
||||||
I_Assert(mutex_id != NULL);
|
I_Assert(mutexId != NULL);
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*cond_anchor == NULL)
|
if (*condAnchor == NULL)
|
||||||
{
|
{
|
||||||
*cond_anchor = malloc(sizeof(CONDITION_VARIABLE));
|
*condAnchor = malloc(sizeof(CONDITION_VARIABLE));
|
||||||
InitializeConditionVariable(*cond_anchor);
|
InitializeConditionVariable(*condAnchor);
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&thread_lock);
|
LeaveCriticalSection(&thread_lock);
|
||||||
SleepConditionVariableCS(*cond_anchor, mutex_id, INFINITE);
|
SleepConditionVariableCS(*condAnchor, mutexId, INFINITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_one_cond(I_cond *anchor)
|
void I_WakeOneCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -306,7 +316,7 @@ void I_wake_one_cond(I_cond *anchor)
|
|||||||
WakeConditionVariable(*anchor);
|
WakeConditionVariable(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_all_cond(I_cond *anchor)
|
void I_WakeAllCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
EnterCriticalSection(&thread_lock);
|
EnterCriticalSection(&thread_lock);
|
||||||
if (*anchor == NULL)
|
if (*anchor == NULL)
|
||||||
@@ -317,48 +327,66 @@ void I_wake_all_cond(I_cond *anchor)
|
|||||||
LeaveCriticalSection(&thread_lock);
|
LeaveCriticalSection(&thread_lock);
|
||||||
WakeAllConditionVariable(*anchor);
|
WakeAllConditionVariable(*anchor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *I_GetCurrentThread(void)
|
||||||
|
{
|
||||||
|
return GetCurrentThread();
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
void I_spawn_thread(const char *name, I_thread_fn entry, void *userdata)
|
#include "i_threads.h"
|
||||||
|
|
||||||
|
FUNCWARNRV
|
||||||
|
int I_SpawnThread(const char *name, I_ThreadFn entry, void *userdata)
|
||||||
{
|
{
|
||||||
(void)name;
|
(void)name;
|
||||||
entry(userdata);
|
entry(userdata);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int I_thread_is_stopped(void)
|
int I_ThreadIsStopped(void)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void I_StartThreads(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_start_threads(void)
|
void I_StopThreads(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_stop_threads(void)
|
void I_LockMutex(I_Mutex *anchor)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void I_lock_mutex(I_mutex *anchor)
|
|
||||||
{
|
{
|
||||||
(void)anchor;
|
(void)anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_unlock_mutex(I_mutex id)
|
void I_UnlockMutex(I_Mutex id)
|
||||||
{
|
{
|
||||||
(void)id;
|
(void)id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_hold_cond(I_cond *cond_anchor, I_mutex mutex_id)
|
void I_HoldCond(I_Cond *condAnchor, I_Mutex mutexId)
|
||||||
{
|
{
|
||||||
(void)cond_anchor;
|
(void)condAnchor;
|
||||||
(void)mutex_id;
|
(void)mutexId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_one_cond(I_cond *anchor)
|
void I_WakeOneCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
(void)anchor;
|
(void)anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void I_wake_all_cond(I_cond *anchor)
|
void I_WakeAllCond(I_Cond *anchor)
|
||||||
{
|
{
|
||||||
(void)anchor;
|
(void)anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *I_GetCurrentThread(void)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HAVE_THREADS
|
||||||
+25
-13
@@ -1,6 +1,6 @@
|
|||||||
// SONIC ROBO BLAST 2 KART
|
// SONIC ROBO BLAST 2 KART
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Copyright (C) 2020 by James R.
|
// Copyright (C) 2020-2023 by James R.
|
||||||
//
|
//
|
||||||
// This program is free software distributed under the
|
// This program is free software distributed under the
|
||||||
// terms of the GNU General Public License, version 2.
|
// terms of the GNU General Public License, version 2.
|
||||||
@@ -14,34 +14,46 @@
|
|||||||
#ifndef I_THREADS_H
|
#ifndef I_THREADS_H
|
||||||
#define I_THREADS_H
|
#define I_THREADS_H
|
||||||
|
|
||||||
|
#include "doomtype.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void (*I_thread_fn)(void *userdata);
|
typedef void (*I_ThreadFn)(void *userdata);
|
||||||
|
|
||||||
typedef void * I_mutex;
|
typedef void * I_Mutex;
|
||||||
typedef void * I_cond;
|
typedef void * I_Cond;
|
||||||
|
|
||||||
void I_start_threads (void);
|
#ifdef __linux__
|
||||||
void I_stop_threads (void);
|
typedef long unsigned int thread_handle_t;
|
||||||
|
#else
|
||||||
|
typedef void *thread_handle_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
void I_spawn_thread (const char *name, I_thread_fn, void *userdata);
|
void I_StartThreads (void);
|
||||||
|
void I_StopThreads (void);
|
||||||
|
|
||||||
|
FUNCWARNRV
|
||||||
|
int I_SpawnThread (const char *name, I_ThreadFn, void *userdata);
|
||||||
|
|
||||||
/* check in your thread whether to return early */
|
/* check in your thread whether to return early */
|
||||||
int I_thread_is_stopped (void);
|
int I_ThreadIsStopped (void);
|
||||||
|
|
||||||
void I_lock_mutex (I_mutex *);
|
void I_LockMutex (I_Mutex *);
|
||||||
void I_unlock_mutex (I_mutex);
|
void I_UnlockMutex (I_Mutex);
|
||||||
|
|
||||||
void I_hold_cond (I_cond *, I_mutex);
|
void I_HoldCond (I_Cond *, I_Mutex);
|
||||||
|
|
||||||
void I_wake_one_cond (I_cond *);
|
void I_WakeOneCond (I_Cond *);
|
||||||
void I_wake_all_cond (I_cond *);
|
void I_WakeAllCond (I_Cond *);
|
||||||
|
|
||||||
|
thread_handle_t I_GetCurrentThread(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif/*I_THREADS_H*/
|
#endif/*I_THREADS_H*/
|
||||||
|
|
||||||
#endif/*HAVE_THREADS*/
|
#endif/*HAVE_THREADS*/
|
||||||
+1
-2
@@ -99,8 +99,7 @@ void K_EraseStats(void)
|
|||||||
// The only field we want to remember
|
// The only field we want to remember
|
||||||
boolean vanilla = kartstats.vanilla;
|
boolean vanilla = kartstats.vanilla;
|
||||||
|
|
||||||
if (kartstats.copy)
|
Z_Free(kartstats.copy);
|
||||||
Z_Free(kartstats.copy);
|
|
||||||
|
|
||||||
memset(&kartstats, 0, sizeof(kartstats_t));
|
memset(&kartstats, 0, sizeof(kartstats_t));
|
||||||
|
|
||||||
|
|||||||
@@ -136,18 +136,9 @@ void LUA_HUD_DestroyDrawList(huddrawlist_h list)
|
|||||||
{
|
{
|
||||||
if (list == NULL) return;
|
if (list == NULL) return;
|
||||||
|
|
||||||
if (list->items)
|
Z_Free(list->items);
|
||||||
{
|
Z_Free(list->olditems);
|
||||||
Z_Free(list->items);
|
Z_Free(list->strbuf);
|
||||||
}
|
|
||||||
if (list->olditems)
|
|
||||||
{
|
|
||||||
Z_Free(list->olditems);
|
|
||||||
}
|
|
||||||
if (list->strbuf)
|
|
||||||
{
|
|
||||||
Z_Free(list->strbuf);
|
|
||||||
}
|
|
||||||
Z_Free(list);
|
Z_Free(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-6
@@ -695,16 +695,13 @@ INT32 GIF_close(void)
|
|||||||
fclose(gif_out);
|
fclose(gif_out);
|
||||||
gif_out = NULL;
|
gif_out = NULL;
|
||||||
|
|
||||||
if (gifbwr_buf)
|
Z_Free(gifbwr_buf);
|
||||||
Z_Free(gifbwr_buf);
|
|
||||||
gifbwr_buf = gifbwr_cur = NULL;
|
gifbwr_buf = gifbwr_cur = NULL;
|
||||||
|
|
||||||
if (gifframe_data)
|
Z_Free(gifframe_data);
|
||||||
Z_Free(gifframe_data);
|
|
||||||
gifframe_data = NULL;
|
gifframe_data = NULL;
|
||||||
|
|
||||||
if (giflzw_hashTable)
|
Z_Free(giflzw_hashTable);
|
||||||
Z_Free(giflzw_hashTable);
|
|
||||||
giflzw_hashTable = NULL;
|
giflzw_hashTable = NULL;
|
||||||
|
|
||||||
Z_Free(scrbuf_screens);
|
Z_Free(scrbuf_screens);
|
||||||
|
|||||||
+3
-6
@@ -248,12 +248,9 @@ void M_AddRawCondition(UINT8 set, UINT8 id, conditiontype_t c, INT32 r, INT16 x1
|
|||||||
|
|
||||||
void M_ClearConditionSet(UINT8 set)
|
void M_ClearConditionSet(UINT8 set)
|
||||||
{
|
{
|
||||||
if (conditionSets[set - 1].numconditions)
|
Z_Free(conditionSets[set - 1].condition);
|
||||||
{
|
conditionSets[set - 1].condition = NULL;
|
||||||
Z_Free(conditionSets[set - 1].condition);
|
conditionSets[set - 1].numconditions = 0;
|
||||||
conditionSets[set - 1].condition = NULL;
|
|
||||||
conditionSets[set - 1].numconditions = 0;
|
|
||||||
}
|
|
||||||
conditionSets[set - 1].achieved = false;
|
conditionSets[set - 1].achieved = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -265,35 +265,6 @@ FUNCMATH FUNCINLINE static ATTRINLINE fixed_t FixedRound(fixed_t x)
|
|||||||
return INT32_MAX;
|
return INT32_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief The xs_CRoundToInt function
|
|
||||||
|
|
||||||
\param val double number
|
|
||||||
|
|
||||||
\return Round toward nearest, but ties round toward even
|
|
||||||
*/
|
|
||||||
#if defined(SRB2_BIG_ENDIAN)
|
|
||||||
#define _xs_iexp_ 0
|
|
||||||
#define _xs_iman_ 1
|
|
||||||
#else
|
|
||||||
#define _xs_iexp_ 1 //intel is little endian
|
|
||||||
#define _xs_iman_ 0
|
|
||||||
#endif //BigEndian_
|
|
||||||
|
|
||||||
typedef double real64;
|
|
||||||
|
|
||||||
typedef union _xs_doubleints
|
|
||||||
{
|
|
||||||
real64 val;
|
|
||||||
unsigned ival[2];
|
|
||||||
} _xs_doubleints;
|
|
||||||
|
|
||||||
FUNCMATH FUNCINLINE static ATTRINLINE int xs_CRoundToInt(real64 val)
|
|
||||||
{
|
|
||||||
_xs_doubleints uval;
|
|
||||||
uval.val = val + 6755399441055744.0;
|
|
||||||
return uval.ival[_xs_iman_];
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
fixed_t x;
|
fixed_t x;
|
||||||
|
|||||||
+43
-33
@@ -142,7 +142,7 @@ typedef enum
|
|||||||
} text_enum;
|
} text_enum;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_mutex m_menu_mutex;
|
I_Mutex m_menu_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
M_waiting_mode_t m_waiting_mode = M_NOT_WAITING;
|
M_waiting_mode_t m_waiting_mode = M_NOT_WAITING;
|
||||||
@@ -1967,7 +1967,7 @@ void M_Ticker(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
|
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
|
||||||
I_lock_mutex(&ms_ServerList_mutex);
|
I_LockMutex(&ms_ServerList_mutex);
|
||||||
{
|
{
|
||||||
if (ms_ServerList)
|
if (ms_ServerList)
|
||||||
{
|
{
|
||||||
@@ -1976,7 +1976,7 @@ void M_Ticker(void)
|
|||||||
ms_ServerList = NULL;
|
ms_ServerList = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
I_unlock_mutex(ms_ServerList_mutex);
|
I_UnlockMutex(ms_ServerList_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4014,14 +4014,14 @@ size_t demolist_all_size = 0;
|
|||||||
boolean replaynamesloaded = false;
|
boolean replaynamesloaded = false;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_mutex replayquerymutex;
|
I_Mutex replayquerymutex;
|
||||||
|
|
||||||
// g_in_exiting_signal_handler is an evil hack
|
// g_in_exiting_signal_handler is an evil hack
|
||||||
// to avoid infinite SIGABRT recursion in the signal handler
|
// to avoid infinite SIGABRT recursion in the signal handler
|
||||||
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
// due to poisoned locks or mach-o kernel not supporting locks in signals
|
||||||
// or something like that. idk
|
// or something like that. idk
|
||||||
# define Lock_search_state() if (!g_in_exiting_signal_handler) { I_lock_mutex(&replayquerymutex); }
|
# define Lock_search_state() if (!g_in_exiting_signal_handler) { I_LockMutex(&replayquerymutex); }
|
||||||
# define Unlock_search_state() if (!g_in_exiting_signal_handler) { I_unlock_mutex(replayquerymutex); }
|
# define Unlock_search_state() if (!g_in_exiting_signal_handler) { I_UnlockMutex(replayquerymutex); }
|
||||||
#else/*HAVE_THREADS*/
|
#else/*HAVE_THREADS*/
|
||||||
# define Lock_search_state()
|
# define Lock_search_state()
|
||||||
# define Unlock_search_state()
|
# define Unlock_search_state()
|
||||||
@@ -4088,7 +4088,10 @@ static void LoadReplayNames(void)
|
|||||||
Unlock_search_state();
|
Unlock_search_state();
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread("replay-names-load", ReplayNamesLoadThread, replaydirpath);
|
if (!I_SpawnThread("replay-names-load", ReplayNamesLoadThread, replaydirpath))
|
||||||
|
{
|
||||||
|
free(replaydirpath);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
ReplayNamesLoadThread(replaydirpath);
|
ReplayNamesLoadThread(replaydirpath);
|
||||||
#endif
|
#endif
|
||||||
@@ -4719,7 +4722,7 @@ static void M_DrawReplayHut(void)
|
|||||||
if (y > scaledviewheight-80)
|
if (y > scaledviewheight-80)
|
||||||
{
|
{
|
||||||
V_DrawFill(BASEVIDWIDTH-4, 75, 4, scaledviewheight-80, V_SNAPTOTOP|V_SNAPTORIGHT|239);
|
V_DrawFill(BASEVIDWIDTH-4, 75, 4, scaledviewheight-80, V_SNAPTOTOP|V_SNAPTORIGHT|239);
|
||||||
V_DrawFill(BASEVIDWIDTH-3, 76 + (scaledviewheight-80) * replayhutmenuy / y, 2, (((scaledviewheight-80) * (scaledviewheight-80))-1) / y - 1, V_SNAPTOTOP|V_SNAPTORIGHT|229);
|
V_DrawFill(BASEVIDWIDTH-3, 76 + (scaledviewheight-80) * replayhutmenuy / y, 2, max((((scaledviewheight-80) * (scaledviewheight-80))-1) / y - 1, 1), V_SNAPTOTOP|V_SNAPTORIGHT|229);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the cursor
|
// Draw the cursor
|
||||||
@@ -5356,7 +5359,7 @@ void M_PopupMasterServerRules(void)
|
|||||||
{
|
{
|
||||||
firstDismissedRulesThisBoot = false;
|
firstDismissedRulesThisBoot = false;
|
||||||
M_StartMessage(va("%s\n(press any key)", rules), NULL, MM_NOTHING);
|
M_StartMessage(va("%s\n(press any key)", rules), NULL, MM_NOTHING);
|
||||||
Z_Free(rules);
|
free(rules);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -6560,17 +6563,22 @@ static void M_EraseGuest(INT32 choice)
|
|||||||
|
|
||||||
static void M_OverwriteGuest(const char *which)
|
static void M_OverwriteGuest(const char *which)
|
||||||
{
|
{
|
||||||
char *rguest = Z_StrDup(va("%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-guest.lmp", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value)));
|
char *rguest;
|
||||||
UINT8 *buf;
|
UINT8 *buf;
|
||||||
size_t len;
|
size_t len;
|
||||||
len = FIL_ReadFile(va("%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-%s-%s.lmp", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value), cv_chooseskin.string, which), &buf);
|
len = FIL_ReadFile(va("%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-%s-%s.lmp", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value), cv_chooseskin.string, which), &buf);
|
||||||
if (!len) {
|
|
||||||
|
if (!len)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
if (FIL_FileExists(rguest)) {
|
rguest = Z_StrDup(va("%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-guest.lmp", srb2home, timeattackfolder, G_BuildMapName(cv_nextmap.value)));
|
||||||
|
|
||||||
|
if (FIL_FileExists(rguest))
|
||||||
|
{
|
||||||
M_StopMessage(0);
|
M_StopMessage(0);
|
||||||
remove(rguest);
|
remove(rguest);
|
||||||
}
|
}
|
||||||
|
|
||||||
FIL_WriteFile(rguest, buf, len);
|
FIL_WriteFile(rguest, buf, len);
|
||||||
Z_Free(rguest);
|
Z_Free(rguest);
|
||||||
|
|
||||||
@@ -6679,11 +6687,11 @@ static void M_EndGame(INT32 choice)
|
|||||||
void M_SetWaitingMode(int mode)
|
void M_SetWaitingMode(int mode)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
m_waiting_mode = mode;
|
m_waiting_mode = mode;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6692,11 +6700,11 @@ int M_GetWaitingMode(void)
|
|||||||
int mode;
|
int mode;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
mode = m_waiting_mode;
|
mode = m_waiting_mode;
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return mode;
|
return mode;
|
||||||
@@ -6708,20 +6716,23 @@ static void Spawn_masterserver_thread(const char *name, void (*thread)(int*))
|
|||||||
{
|
{
|
||||||
int *id = malloc(sizeof *id);
|
int *id = malloc(sizeof *id);
|
||||||
|
|
||||||
I_lock_mutex(&ms_QueryId_mutex);
|
I_LockMutex(&ms_QueryId_mutex);
|
||||||
*id = ms_QueryId;
|
*id = ms_QueryId;
|
||||||
I_unlock_mutex(ms_QueryId_mutex);
|
I_UnlockMutex(ms_QueryId_mutex);
|
||||||
|
|
||||||
I_spawn_thread(name, (I_thread_fn)thread, id);
|
if (!I_SpawnThread(name, (I_ThreadFn)thread, id))
|
||||||
|
{
|
||||||
|
free(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int Same_instance(int id)
|
static int Same_instance(int id)
|
||||||
{
|
{
|
||||||
int okay;
|
int okay;
|
||||||
|
|
||||||
I_lock_mutex(&ms_QueryId_mutex);
|
I_LockMutex(&ms_QueryId_mutex);
|
||||||
okay = ( id == ms_QueryId );
|
okay = ( id == ms_QueryId );
|
||||||
I_unlock_mutex(ms_QueryId_mutex);
|
I_UnlockMutex(ms_QueryId_mutex);
|
||||||
|
|
||||||
return okay;
|
return okay;
|
||||||
}
|
}
|
||||||
@@ -6750,9 +6761,9 @@ static void Fetch_servers_thread(int *id)
|
|||||||
M_SetWaitingMode(M_NOT_WAITING);
|
M_SetWaitingMode(M_NOT_WAITING);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&ms_ServerList_mutex);
|
I_LockMutex(&ms_ServerList_mutex);
|
||||||
ms_ServerList = server_list;
|
ms_ServerList = server_list;
|
||||||
I_unlock_mutex(ms_ServerList_mutex);
|
I_UnlockMutex(ms_ServerList_mutex);
|
||||||
#else
|
#else
|
||||||
CL_QueryServerList(server_list);
|
CL_QueryServerList(server_list);
|
||||||
free(server_list);
|
free(server_list);
|
||||||
@@ -6785,7 +6796,7 @@ static void M_SearchServerList(void)
|
|||||||
serverlistsearchedcount = 0;
|
serverlistsearchedcount = 0;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&ms_ServerList_mutex);
|
I_LockMutex(&ms_ServerList_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (UINT32 i = 0; i < serverlistcount; ++i)
|
for (UINT32 i = 0; i < serverlistcount; ++i)
|
||||||
@@ -6796,7 +6807,7 @@ static void M_SearchServerList(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(ms_ServerList_mutex);
|
I_UnlockMutex(ms_ServerList_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (menuinput.length > 0)
|
if (menuinput.length > 0)
|
||||||
@@ -7162,11 +7173,11 @@ static void M_CheckMODVersion(int id)
|
|||||||
{
|
{
|
||||||
sprintf(updatestring, UPDATE_ALERT_STRING, VERSIONSTRING, updatecheck);
|
sprintf(updatestring, UPDATE_ALERT_STRING, VERSIONSTRING, updatecheck);
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_StartMessage(updatestring, NULL, MM_NOTHING);
|
M_StartMessage(updatestring, NULL, MM_NOTHING);
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7212,13 +7223,13 @@ static void M_ConnectMenu(INT32 choice)
|
|||||||
itemOn = 0;
|
itemOn = 0;
|
||||||
|
|
||||||
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
|
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
|
||||||
I_lock_mutex(&ms_QueryId_mutex);
|
I_LockMutex(&ms_QueryId_mutex);
|
||||||
{
|
{
|
||||||
ms_QueryId++;
|
ms_QueryId++;
|
||||||
}
|
}
|
||||||
I_unlock_mutex(ms_QueryId_mutex);
|
I_UnlockMutex(ms_QueryId_mutex);
|
||||||
|
|
||||||
I_lock_mutex(&ms_ServerList_mutex);
|
I_LockMutex(&ms_ServerList_mutex);
|
||||||
{
|
{
|
||||||
if (ms_ServerList)
|
if (ms_ServerList)
|
||||||
{
|
{
|
||||||
@@ -7226,7 +7237,7 @@ static void M_ConnectMenu(INT32 choice)
|
|||||||
ms_ServerList = NULL;
|
ms_ServerList = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
I_unlock_mutex(ms_ServerList_mutex);
|
I_UnlockMutex(ms_ServerList_mutex);
|
||||||
|
|
||||||
#ifdef UPDATE_ALERT
|
#ifdef UPDATE_ALERT
|
||||||
Spawn_masterserver_thread("check-new-version", Check_new_version_thread);
|
Spawn_masterserver_thread("check-new-version", Check_new_version_thread);
|
||||||
@@ -7587,7 +7598,6 @@ static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade)
|
|||||||
|
|
||||||
static void M_DrawServerMenu(void)
|
static void M_DrawServerMenu(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
M_DrawLevelSelectOnly(false, false);
|
M_DrawLevelSelectOnly(false, false);
|
||||||
#ifdef MASTERSERVER
|
#ifdef MASTERSERVER
|
||||||
if (currentMenu == &MP_ServerDef && cv_advertise.value) // Remind players where they're hosting.
|
if (currentMenu == &MP_ServerDef && cv_advertise.value) // Remind players where they're hosting.
|
||||||
|
|||||||
+1
-1
@@ -215,7 +215,7 @@ void M_SetupNextMenu(menu_t *menudef);
|
|||||||
void M_ClearMenus(boolean callexitmenufunc);
|
void M_ClearMenus(boolean callexitmenufunc);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
extern I_mutex m_menu_mutex;
|
extern I_Mutex m_menu_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern menu_t *currentMenu;
|
extern menu_t *currentMenu;
|
||||||
|
|||||||
@@ -1205,6 +1205,10 @@ static menuitem_t OP_FocusOptionsMenu[] =
|
|||||||
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
|
{IT_STRING|IT_CVAR, NULL, "Show \"FOCUS LOST\"", &cv_showfocuslost, 100},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
|
{IT_STRING|IT_CVAR, NULL, "Visible Mouse", &cv_mousevisible, 120},
|
||||||
|
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Gamepad LED Color While Unfocused ", &cv_gamepadledifunfocused, 140},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Gamepad Rumble While Unfocused", &cv_rumbleifunfocused, 150},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char* OP_FocusOptionsTooltips[] =
|
static const char* OP_FocusOptionsTooltips[] =
|
||||||
@@ -1216,6 +1220,8 @@ static const char* OP_FocusOptionsTooltips[] =
|
|||||||
"Set manual framerate cap while the game is unfocused.",
|
"Set manual framerate cap while the game is unfocused.",
|
||||||
"Should the FOCUS LOST window appear\n while the game is unfocused?",
|
"Should the FOCUS LOST window appear\n while the game is unfocused?",
|
||||||
"Displays the mouse cursor while the game is in focus.",
|
"Displays the mouse cursor while the game is in focus.",
|
||||||
|
"Should gamepad LED indicator change color when unfocused?",
|
||||||
|
"Should gamepad rumble apply when unfocused?",
|
||||||
};
|
};
|
||||||
|
|
||||||
static menuitem_t OP_DataOptionsMenu[] =
|
static menuitem_t OP_DataOptionsMenu[] =
|
||||||
|
|||||||
+2
-2
@@ -540,7 +540,7 @@ static boolean M_BackupConfig(const char *filename)
|
|||||||
void M_SaveConfig(const char *filename)
|
void M_SaveConfig(const char *filename)
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char *filepath;
|
CLEANUP(Z_Pfree) char *filepath = NULL;
|
||||||
|
|
||||||
// make sure not to write back the config until it's been correctly loaded
|
// make sure not to write back the config until it's been correctly loaded
|
||||||
if (!loaded_config)
|
if (!loaded_config)
|
||||||
@@ -558,7 +558,7 @@ void M_SaveConfig(const char *filename)
|
|||||||
// append srb2home to beginning of filename
|
// append srb2home to beginning of filename
|
||||||
// but check if srb2home isn't already there, first
|
// but check if srb2home isn't already there, first
|
||||||
if (!strstr(filename, srb2home))
|
if (!strstr(filename, srb2home))
|
||||||
filepath = va(pandf,srb2home, filename);
|
filepath = Z_StrDup(va(pandf, srb2home, filename));
|
||||||
else
|
else
|
||||||
filepath = Z_StrDup(filename);
|
filepath = Z_StrDup(filename);
|
||||||
|
|
||||||
|
|||||||
+37
-32
@@ -41,11 +41,11 @@ static time_t MSLastPing;
|
|||||||
static char *MSRules;
|
static char *MSRules;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
static I_mutex MSMutex;
|
static I_Mutex MSMutex;
|
||||||
static I_cond MSCond;
|
static I_Cond MSCond;
|
||||||
|
|
||||||
# define Lock_state() I_lock_mutex (&MSMutex)
|
# define Lock_state() I_LockMutex (&MSMutex)
|
||||||
# define Unlock_state() I_unlock_mutex (MSMutex)
|
# define Unlock_state() I_UnlockMutex (MSMutex)
|
||||||
#else/*HAVE_THREADS*/
|
#else/*HAVE_THREADS*/
|
||||||
# define Lock_state()
|
# define Lock_state()
|
||||||
# define Unlock_state()
|
# define Unlock_state()
|
||||||
@@ -90,10 +90,10 @@ consvar_t cv_masterserver_nagattempts = {"masterserver_nagattempts", "5", CV_SAV
|
|||||||
|
|
||||||
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
|
#if defined (MASTERSERVER) && defined (HAVE_THREADS)
|
||||||
int ms_QueryId = 0;
|
int ms_QueryId = 0;
|
||||||
I_mutex ms_QueryId_mutex;
|
I_Mutex ms_QueryId_mutex;
|
||||||
|
|
||||||
msg_server_t *ms_ServerList = NULL;
|
msg_server_t *ms_ServerList = NULL;
|
||||||
I_mutex ms_ServerList_mutex;
|
I_Mutex ms_ServerList_mutex;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
UINT16 current_port = 0;
|
UINT16 current_port = 0;
|
||||||
@@ -129,11 +129,11 @@ void AddMServCommands(void)
|
|||||||
static void WarnGUI (void)
|
static void WarnGUI (void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&m_menu_mutex);
|
I_LockMutex(&m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
M_PopupMasterServerConnectError();
|
M_PopupMasterServerConnectError();
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_unlock_mutex(m_menu_mutex);
|
I_UnlockMutex(m_menu_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,12 +168,12 @@ char *GetMODVersion(int id)
|
|||||||
c = HMS_compare_mod_version(buffer, 16);
|
c = HMS_compare_mod_version(buffer, 16);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_lock_mutex(&ms_QueryId_mutex);
|
I_LockMutex(&ms_QueryId_mutex);
|
||||||
{
|
{
|
||||||
if (id != ms_QueryId)
|
if (id != ms_QueryId)
|
||||||
c = -1;
|
c = -1;
|
||||||
}
|
}
|
||||||
I_unlock_mutex(ms_QueryId_mutex);
|
I_UnlockMutex(ms_QueryId_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (c > 0)
|
if (c > 0)
|
||||||
@@ -219,8 +219,9 @@ static void Get_masterserver_rules(boolean checkfirst)
|
|||||||
if (HMS_fetch_rules(rules, sizeof rules))
|
if (HMS_fetch_rules(rules, sizeof rules))
|
||||||
{
|
{
|
||||||
Lock_state();
|
Lock_state();
|
||||||
Z_Free(MSRules);
|
if (MSRules)
|
||||||
MSRules = Z_StrDup(rules);
|
free(MSRules);
|
||||||
|
MSRules = strdup(rules);
|
||||||
|
|
||||||
if (MSRegistered == true)
|
if (MSRegistered == true)
|
||||||
{
|
{
|
||||||
@@ -340,7 +341,7 @@ Finish_unlist (void)
|
|||||||
Unlock_state();
|
Unlock_state();
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_wake_all_cond(&MSCond);
|
I_WakeAllCond(&MSCond);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -376,7 +377,7 @@ New_server_id (void)
|
|||||||
Lock_state();
|
Lock_state();
|
||||||
{
|
{
|
||||||
*id = ++MSId;
|
*id = ++MSId;
|
||||||
I_wake_all_cond(&MSCond);
|
I_WakeAllCond(&MSCond);
|
||||||
}
|
}
|
||||||
Unlock_state();
|
Unlock_state();
|
||||||
return id;
|
return id;
|
||||||
@@ -391,7 +392,7 @@ Register_server_thread (int *id)
|
|||||||
{
|
{
|
||||||
/* wait for previous unlist to finish */
|
/* wait for previous unlist to finish */
|
||||||
while (*id == MSId && MSRegistered)
|
while (*id == MSId && MSRegistered)
|
||||||
I_hold_cond(&MSCond, MSMutex);
|
I_HoldCond(&MSCond, MSMutex);
|
||||||
|
|
||||||
same = ( *id == MSId );/* it could have been a while */
|
same = ( *id == MSId );/* it could have been a while */
|
||||||
}
|
}
|
||||||
@@ -443,7 +444,7 @@ Change_masterserver_thread (char *api)
|
|||||||
Lock_state();
|
Lock_state();
|
||||||
{
|
{
|
||||||
while (MSRegistered)
|
while (MSRegistered)
|
||||||
I_hold_cond(&MSCond, MSMutex);
|
I_HoldCond(&MSCond, MSMutex);
|
||||||
}
|
}
|
||||||
Unlock_state();
|
Unlock_state();
|
||||||
|
|
||||||
@@ -463,9 +464,9 @@ void RegisterServer(void)
|
|||||||
{
|
{
|
||||||
#ifdef MASTERSERVER
|
#ifdef MASTERSERVER
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread(
|
(void)!I_SpawnThread(
|
||||||
"register-server",
|
"register-server",
|
||||||
(I_thread_fn)Register_server_thread,
|
(I_ThreadFn)Register_server_thread,
|
||||||
New_server_id()
|
New_server_id()
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
@@ -477,9 +478,9 @@ void RegisterServer(void)
|
|||||||
static void UpdateServer(void)
|
static void UpdateServer(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread(
|
(void)!I_SpawnThread(
|
||||||
"update-server",
|
"update-server",
|
||||||
(I_thread_fn)Update_server_thread,
|
(I_ThreadFn)Update_server_thread,
|
||||||
Server_id()
|
Server_id()
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
@@ -491,9 +492,9 @@ void UnregisterServer(void)
|
|||||||
{
|
{
|
||||||
#ifdef MASTERSERVER
|
#ifdef MASTERSERVER
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread(
|
(void)!I_SpawnThread(
|
||||||
"unlist-server",
|
"unlist-server",
|
||||||
(I_thread_fn)Unlist_server_thread,
|
(I_ThreadFn)Unlist_server_thread,
|
||||||
Server_id()
|
Server_id()
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
@@ -507,7 +508,7 @@ char *GetMasterServerRules(void)
|
|||||||
char *rules;
|
char *rules;
|
||||||
|
|
||||||
Lock_state();
|
Lock_state();
|
||||||
rules = MSRules ? Z_StrDup(MSRules) : NULL;
|
rules = MSRules ? strdup(MSRules) : NULL;
|
||||||
Unlock_state();
|
Unlock_state();
|
||||||
|
|
||||||
return rules;
|
return rules;
|
||||||
@@ -556,14 +557,18 @@ void MasterClient_Ticker(void)
|
|||||||
static void
|
static void
|
||||||
Set_api (const char *api)
|
Set_api (const char *api)
|
||||||
{
|
{
|
||||||
|
char *dapi = strdup(api);
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread(
|
if (!I_SpawnThread(
|
||||||
"change-masterserver",
|
"change-masterserver",
|
||||||
(I_thread_fn)Change_masterserver_thread,
|
(I_ThreadFn)Change_masterserver_thread,
|
||||||
strdup(api)
|
dapi
|
||||||
);
|
))
|
||||||
|
{
|
||||||
|
free(dapi);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
Finish_masterserver_change(strdup(api));
|
Finish_masterserver_change(dapi);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -571,9 +576,9 @@ void
|
|||||||
Get_rules (void)
|
Get_rules (void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_spawn_thread(
|
(void)!I_SpawnThread(
|
||||||
"get-masterserver-rules",
|
"get-masterserver-rules",
|
||||||
(I_thread_fn)Get_masterserver_rules_thread,
|
(I_ThreadFn)Get_masterserver_rules_thread,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
|
|||||||
+2
-2
@@ -69,10 +69,10 @@ extern consvar_t cv_rendezvousserver;
|
|||||||
|
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
extern int ms_QueryId;
|
extern int ms_QueryId;
|
||||||
extern I_mutex ms_QueryId_mutex;
|
extern I_Mutex ms_QueryId_mutex;
|
||||||
|
|
||||||
extern msg_server_t *ms_ServerList;
|
extern msg_server_t *ms_ServerList;
|
||||||
extern I_mutex ms_ServerList_mutex;
|
extern I_Mutex ms_ServerList_mutex;
|
||||||
#endif
|
#endif
|
||||||
#ifdef MASTERSERVER
|
#ifdef MASTERSERVER
|
||||||
void RegisterServer(void);
|
void RegisterServer(void);
|
||||||
|
|||||||
+1
-3
@@ -320,9 +320,7 @@ void P_AddGradesForMare(INT16 i, UINT8 mare, char *gtext)
|
|||||||
*/
|
*/
|
||||||
void P_DeleteGrades(INT16 i)
|
void P_DeleteGrades(INT16 i)
|
||||||
{
|
{
|
||||||
if (mapheaderinfo[i]->grades)
|
Z_Free(mapheaderinfo[i]->grades);
|
||||||
Z_Free(mapheaderinfo[i]->grades);
|
|
||||||
|
|
||||||
mapheaderinfo[i]->grades = NULL;
|
mapheaderinfo[i]->grades = NULL;
|
||||||
mapheaderinfo[i]->numGradedMares = 0;
|
mapheaderinfo[i]->numGradedMares = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -6221,8 +6221,7 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
|
|||||||
|
|
||||||
// Allocate each list
|
// Allocate each list
|
||||||
for (i = 0; i < numsectors; i++)
|
for (i = 0; i < numsectors; i++)
|
||||||
if(secthinkers[i].thinkers)
|
Z_Free(secthinkers[i].thinkers);
|
||||||
Z_Free(secthinkers[i].thinkers);
|
|
||||||
|
|
||||||
Z_Free(secthinkers);
|
Z_Free(secthinkers);
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -1720,8 +1720,7 @@ void R_InitData(void)
|
|||||||
|
|
||||||
void R_ClearTextureNumCache(boolean btell)
|
void R_ClearTextureNumCache(boolean btell)
|
||||||
{
|
{
|
||||||
if (tidcache)
|
Z_Free(tidcache);
|
||||||
Z_Free(tidcache);
|
|
||||||
tidcache = NULL;
|
tidcache = NULL;
|
||||||
if (btell)
|
if (btell)
|
||||||
CONS_Debug(DBG_SETUP, "Fun Fact: There are %d textures used in this map.\n", tidcachelen);
|
CONS_Debug(DBG_SETUP, "Fun Fact: There are %d textures used in this map.\n", tidcachelen);
|
||||||
|
|||||||
+8
-2
@@ -289,8 +289,14 @@ void R_GenerateBlendTables(void)
|
|||||||
state->LocalPalette = static_cast<RGBA_t *>(memcpy(malloc(palsize), pLocalPalette, palsize));
|
state->LocalPalette = static_cast<RGBA_t *>(memcpy(malloc(palsize), pLocalPalette, palsize));
|
||||||
state->gammaCorrectedPalette = static_cast<RGBA_t *>(memcpy(malloc(palsize), pGammaCorrectedPalette, palsize));
|
state->gammaCorrectedPalette = static_cast<RGBA_t *>(memcpy(malloc(palsize), pGammaCorrectedPalette, palsize));
|
||||||
|
|
||||||
I_spawn_thread("blend-tables",
|
if (!I_SpawnThread("blend-tables",
|
||||||
R_GenerateBlendTables_Thread, state);
|
R_GenerateBlendTables_Thread, state))
|
||||||
|
{
|
||||||
|
free(state->gammaCorrectedPalette);
|
||||||
|
free(state->LocalPalette);
|
||||||
|
free(state);
|
||||||
|
I_Error("R_GenerateBlendTables: Failed to generate BlendTables\n"); // should we just retry on main thread instead?
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
struct GenerateBlendTables_State state = {pLocalPalette, pGammaCorrectedPalette};
|
struct GenerateBlendTables_State state = {pLocalPalette, pGammaCorrectedPalette};
|
||||||
R_GenerateBlendTables_Core(&state);
|
R_GenerateBlendTables_Core(&state);
|
||||||
|
|||||||
+8
-12
@@ -925,11 +925,11 @@ void R_ExecuteSetViewSize(void)
|
|||||||
viewheight = vid.height;
|
viewheight = vid.height;
|
||||||
|
|
||||||
if (splitscreen)
|
if (splitscreen)
|
||||||
|
{
|
||||||
viewheight >>= 1;
|
viewheight >>= 1;
|
||||||
|
|
||||||
if (splitscreen > 1)
|
if (splitscreen > 1)
|
||||||
{
|
viewwidth >>= 1;
|
||||||
viewwidth >>= 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
centerx = viewwidth/2;
|
centerx = viewwidth/2;
|
||||||
@@ -956,13 +956,9 @@ void R_ExecuteSetViewSize(void)
|
|||||||
screenheightarray[i] = (INT16)viewheight;
|
screenheightarray[i] = (INT16)viewheight;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ds_su)
|
Z_Free(ds_su);
|
||||||
Z_Free(ds_su);
|
Z_Free(ds_sv);
|
||||||
if (ds_sv)
|
Z_Free(ds_sz);
|
||||||
Z_Free(ds_sv);
|
|
||||||
if (ds_sz)
|
|
||||||
Z_Free(ds_sz);
|
|
||||||
|
|
||||||
ds_su = ds_sv = ds_sz = NULL;
|
ds_su = ds_sv = ds_sz = NULL;
|
||||||
|
|
||||||
memset(scalelight, 0xFF, sizeof(scalelight));
|
memset(scalelight, 0xFF, sizeof(scalelight));
|
||||||
@@ -1018,8 +1014,8 @@ static void R_InitViewMapping(void)
|
|||||||
|
|
||||||
for (INT32 i = 0; i < j; i++)
|
for (INT32 i = 0; i < j; i++)
|
||||||
{
|
{
|
||||||
fixed_t dy = (i - viewheight*8)<<FRACBITS;
|
fixed_t dy = abs(i - viewheight*8) << FRACBITS;
|
||||||
dy = FixedMul(abs(dy), fovtan);
|
dy = FixedMul(dy, fovtan);
|
||||||
yslopetab[i] = FixedDiv(centerx*FRACUNIT, dy);
|
yslopetab[i] = FixedDiv(centerx*FRACUNIT, dy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-4
@@ -405,10 +405,8 @@ static void Patch_FreeData(patch_t *patch)
|
|||||||
}*/
|
}*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (patch->columnofs)
|
Z_Free(patch->columnofs);
|
||||||
Z_Free(patch->columnofs);
|
Z_Free(patch->columns);
|
||||||
if (patch->columns)
|
|
||||||
Z_Free(patch->columns);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Patch_Free(patch_t *patch)
|
void Patch_Free(patch_t *patch)
|
||||||
|
|||||||
+8
-5
@@ -57,8 +57,11 @@ visffloor_t visffloor[MAXFFLOORS] = {};
|
|||||||
INT32 numffloors = 0;
|
INT32 numffloors = 0;
|
||||||
|
|
||||||
//SoM: 3/23/2000: Boom visplane hashing routine.
|
//SoM: 3/23/2000: Boom visplane hashing routine.
|
||||||
#define visplane_hash(picnum,lightlevel,height) \
|
constexpr unsigned int visplane_hash(const unsigned int picnum, const unsigned int lightlevel,
|
||||||
((unsigned)((picnum)*3+(lightlevel)+(height)*7) & VISPLANEHASHMASK)
|
const unsigned int height)
|
||||||
|
{
|
||||||
|
return ((picnum * 3) + lightlevel + (height * 7)) & VISPLANEHASHMASK;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Clip values are the solid pixel bounding the range.
|
// Clip values are the solid pixel bounding the range.
|
||||||
@@ -136,7 +139,7 @@ void R_AllocPlaneMemory(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
yslopetab = static_cast<fixed_t*>(Z_Realloc(yslopetab, sizeof(*yslopetab) * (viewheight * 16), PU_STATIC, NULL));
|
yslopetab = static_cast<fixed_t*>(Z_Realloc(yslopetab, sizeof(*yslopetab) * (viewheight * 16), PU_STATIC, NULL));
|
||||||
spanstart = static_cast<fixed_t*>(Z_Realloc(spanstart, sizeof(*spanstart) * viewheight, PU_STATIC, NULL));
|
spanstart = static_cast<INT32*>(Z_Realloc(spanstart, sizeof(*spanstart) * viewheight, PU_STATIC, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -451,7 +454,7 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hash = visplane_hash(picnum, lightlevel, height);
|
hash = visplane_hash(picnum, lightlevel, height >> FRACBITS);
|
||||||
|
|
||||||
for (check = visplanes[hash]; check; check = check->next)
|
for (check = visplanes[hash]; check; check = check->next)
|
||||||
{
|
{
|
||||||
@@ -562,7 +565,7 @@ visplane_t *R_CheckPlane(visplane_t *pl, INT32 start, INT32 stop)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned hash = visplane_hash(pl->picnum, pl->lightlevel, pl->height);
|
unsigned hash = visplane_hash(pl->picnum, pl->lightlevel, pl->height >> FRACBITS);
|
||||||
new_pl = new_visplane(hash);
|
new_pl = new_visplane(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -2880,7 +2880,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||||||
if (markceiling)
|
if (markceiling)
|
||||||
{
|
{
|
||||||
if (ceilingplane) //SoM: 3/29/2000: Check for null ceiling planes
|
if (ceilingplane) //SoM: 3/29/2000: Check for null ceiling planes
|
||||||
ceilingplane = R_CheckPlane (ceilingplane, rw_x, rw_stopx-1);
|
ceilingplane = R_CheckPlane(ceilingplane, rw_x, rw_stopx-1);
|
||||||
else
|
else
|
||||||
markceiling = false;
|
markceiling = false;
|
||||||
|
|
||||||
@@ -2894,7 +2894,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||||||
if (markfloor)
|
if (markfloor)
|
||||||
{
|
{
|
||||||
if (floorplane) //SoM: 3/29/2000: Check for null planes
|
if (floorplane) //SoM: 3/29/2000: Check for null planes
|
||||||
floorplane = R_CheckPlane (floorplane, rw_x, rw_stopx-1);
|
floorplane = R_CheckPlane(floorplane, rw_x, rw_stopx-1);
|
||||||
else
|
else
|
||||||
markfloor = false;
|
markfloor = false;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -391,7 +391,7 @@ boolean R_AddSingleSpriteDef(const char *sprname, spritedef_t *spritedef, UINT16
|
|||||||
|
|
||||||
// allocate space for the frames present and copy sprtemp to it
|
// allocate space for the frames present and copy sprtemp to it
|
||||||
if (spritedef->numframes && // has been allocated
|
if (spritedef->numframes && // has been allocated
|
||||||
spritedef->numframes < maxframe) // more frames are defined ?
|
spritedef->numframes < maxframe) // more frames are defined ?
|
||||||
{
|
{
|
||||||
|
|
||||||
Z_Free(spritedef->spriteframes);
|
Z_Free(spritedef->spriteframes);
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ set(SRB2_SDL2_SOURCES
|
|||||||
i_system.cpp
|
i_system.cpp
|
||||||
i_ttf.c
|
i_ttf.c
|
||||||
i_video.c
|
i_video.c
|
||||||
i_threads.c
|
|
||||||
#IMG_xpm.c
|
#IMG_xpm.c
|
||||||
ogl_sdl.c
|
ogl_sdl.c
|
||||||
|
|
||||||
|
|||||||
+23
-3
@@ -726,7 +726,9 @@ static void JoyReset(SDLJoyInfo_t *JoySet)
|
|||||||
|
|
||||||
JoySet->dev = NULL;
|
JoySet->dev = NULL;
|
||||||
JoySet->oldjoy = -1;
|
JoySet->oldjoy = -1;
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
JoySet->id = -1;
|
JoySet->id = -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief SDL info about joystick
|
/** \brief SDL info about joystick
|
||||||
@@ -783,7 +785,11 @@ void I_UpdateJoystickDeviceIndex(UINT8 player)
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
if (JoyInfo[player].dev)
|
if (JoyInfo[player].dev)
|
||||||
{
|
{
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
cv_usejoystick[player].value = JoyInfo[player].id + 1;
|
cv_usejoystick[player].value = JoyInfo[player].id + 1;
|
||||||
|
#else
|
||||||
|
cv_usejoystick[player].value = I_GetJoystickDeviceIndex(JoyInfo[player].dev) + 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -939,7 +945,9 @@ static int joy_open(int playerIndex, int joyIndex)
|
|||||||
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Joystick %d: %s\n", playerIndex+1, SDL_GameControllerName(JoyInfo[playerIndex].dev));
|
CONS_Debug(DBG_GAMELOGIC, "Joystick %d: %s\n", playerIndex+1, SDL_GameControllerName(JoyInfo[playerIndex].dev));
|
||||||
|
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
JoyInfo[playerIndex].id = I_GetJoystickDeviceIndex(JoyInfo[playerIndex].dev);
|
JoyInfo[playerIndex].id = I_GetJoystickDeviceIndex(JoyInfo[playerIndex].dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
return SDL_CONTROLLER_AXIS_MAX;
|
return SDL_CONTROLLER_AXIS_MAX;
|
||||||
}
|
}
|
||||||
@@ -985,7 +993,9 @@ void I_InitJoystick(UINT8 index)
|
|||||||
|
|
||||||
JoyInfo[index].dev = NULL;
|
JoyInfo[index].dev = NULL;
|
||||||
JoyInfo[index].oldjoy = -1;
|
JoyInfo[index].oldjoy = -1;
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
JoyInfo[index].id = -1;
|
JoyInfo[index].id = -1;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (cv_usejoystick[index].value)
|
if (cv_usejoystick[index].value)
|
||||||
newcontroller = SDL_GameControllerOpen(cv_usejoystick[index].value-1);
|
newcontroller = SDL_GameControllerOpen(cv_usejoystick[index].value-1);
|
||||||
@@ -999,17 +1009,27 @@ void I_InitJoystick(UINT8 index)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
JoyInfo[index].id = I_GetJoystickDeviceIndex(JoyInfo[index].dev);
|
JoyInfo[index].id = I_GetJoystickDeviceIndex(JoyInfo[index].dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (newcontroller && i < MAXSPLITSCREENPLAYERS) // don't override an active device
|
if (newcontroller && i < MAXSPLITSCREENPLAYERS) // don't override an active device
|
||||||
{
|
{
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
cv_usejoystick[index].value = JoyInfo[index].id + 1;
|
cv_usejoystick[index].value = JoyInfo[index].id + 1;
|
||||||
|
#else
|
||||||
|
cv_usejoystick[index].value = I_GetJoystickDeviceIndex(JoyInfo[index].dev) + 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (newcontroller && joy_open(index, cv_usejoystick[index].value) != -1)
|
else if (newcontroller && joy_open(index, cv_usejoystick[index].value) != -1)
|
||||||
{
|
{
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
|
JoyInfo[index].oldjoy = JoyInfo[index].id + 1;
|
||||||
|
#else
|
||||||
// SDL's device indexes are unstable, so cv_usejoystick may not match
|
// SDL's device indexes are unstable, so cv_usejoystick may not match
|
||||||
// the actual device index. So let's cheat a bit and find the device's current index.
|
// the actual device index. So let's cheat a bit and find the device's current index.
|
||||||
JoyInfo[index].oldjoy = JoyInfo[index].id + 1;
|
JoyInfo[index].oldjoy = I_GetJoystickDeviceIndex(JoyInfo[index].dev) + 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1876,8 +1896,8 @@ INT32 I_StartupSystem(void)
|
|||||||
I_Fork();
|
I_Fork();
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_THREADS
|
#ifdef HAVE_THREADS
|
||||||
I_start_threads();
|
I_StartThreads();
|
||||||
I_AddExitFunc(I_stop_threads);
|
I_AddExitFunc(I_StopThreads);
|
||||||
I_ThreadPoolInit();
|
I_ThreadPoolInit();
|
||||||
I_AddExitFunc(I_ThreadPoolShutdown);
|
I_AddExitFunc(I_ThreadPoolShutdown);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,360 +0,0 @@
|
|||||||
// SONIC ROBO BLAST 2 KART
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Copyright (C) 2020 by James R.
|
|
||||||
//
|
|
||||||
// This program is free software distributed under the
|
|
||||||
// terms of the GNU General Public License, version 2.
|
|
||||||
// See the 'LICENSE' file for more details.
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
/// \file i_threads.c
|
|
||||||
/// \brief Multithreading abstraction
|
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
|
||||||
|
|
||||||
#include "../doomdef.h"
|
|
||||||
#include "../i_threads.h"
|
|
||||||
|
|
||||||
#include <SDL.h>
|
|
||||||
|
|
||||||
typedef void * (*Create_fn)(void);
|
|
||||||
|
|
||||||
struct Link;
|
|
||||||
struct Thread;
|
|
||||||
|
|
||||||
typedef struct Link * Link;
|
|
||||||
typedef struct Thread * Thread;
|
|
||||||
|
|
||||||
struct Link
|
|
||||||
{
|
|
||||||
void * data;
|
|
||||||
Link next;
|
|
||||||
Link prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Thread
|
|
||||||
{
|
|
||||||
I_thread_fn entry;
|
|
||||||
void * userdata;
|
|
||||||
|
|
||||||
SDL_Thread * thread;
|
|
||||||
};
|
|
||||||
|
|
||||||
static Link i_thread_pool;
|
|
||||||
static Link i_mutex_pool;
|
|
||||||
static Link i_cond_pool;
|
|
||||||
|
|
||||||
static I_mutex i_thread_pool_mutex;
|
|
||||||
static I_mutex i_mutex_pool_mutex;
|
|
||||||
static I_mutex i_cond_pool_mutex;
|
|
||||||
|
|
||||||
static SDL_atomic_t i_threads_running = {1};
|
|
||||||
|
|
||||||
static Link
|
|
||||||
Insert_link (
|
|
||||||
Link * head,
|
|
||||||
Link link
|
|
||||||
){
|
|
||||||
link->prev = NULL;
|
|
||||||
link->next = (*head);
|
|
||||||
if ((*head))
|
|
||||||
(*head)->prev = link;
|
|
||||||
(*head) = link;
|
|
||||||
return link;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
Free_link (
|
|
||||||
Link * head,
|
|
||||||
Link link
|
|
||||||
){
|
|
||||||
if (link->prev)
|
|
||||||
link->prev->next = link->next;
|
|
||||||
else
|
|
||||||
(*head) = link->next;
|
|
||||||
|
|
||||||
if (link->next)
|
|
||||||
link->next->prev = link->prev;
|
|
||||||
|
|
||||||
free(link->data);
|
|
||||||
free(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Link
|
|
||||||
New_link (void *data)
|
|
||||||
{
|
|
||||||
Link link;
|
|
||||||
|
|
||||||
link = malloc(sizeof *link);
|
|
||||||
|
|
||||||
if (! link)
|
|
||||||
abort();
|
|
||||||
|
|
||||||
link->data = data;
|
|
||||||
|
|
||||||
return link;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
Identity (
|
|
||||||
Link * pool_anchor,
|
|
||||||
I_mutex pool_mutex,
|
|
||||||
|
|
||||||
void ** anchor,
|
|
||||||
|
|
||||||
Create_fn create_fn
|
|
||||||
){
|
|
||||||
void * id;
|
|
||||||
|
|
||||||
id = SDL_AtomicGetPtr(anchor);
|
|
||||||
|
|
||||||
if (! id)
|
|
||||||
{
|
|
||||||
I_lock_mutex(&pool_mutex);
|
|
||||||
{
|
|
||||||
id = SDL_AtomicGetPtr(anchor);
|
|
||||||
|
|
||||||
if (! id)
|
|
||||||
{
|
|
||||||
id = (*create_fn)();
|
|
||||||
|
|
||||||
if (! id)
|
|
||||||
abort();
|
|
||||||
|
|
||||||
Insert_link(pool_anchor, New_link(id));
|
|
||||||
|
|
||||||
SDL_AtomicSetPtr(anchor, id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
I_unlock_mutex(pool_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
Worker (
|
|
||||||
Link link
|
|
||||||
){
|
|
||||||
Thread th;
|
|
||||||
|
|
||||||
th = link->data;
|
|
||||||
|
|
||||||
(*th->entry)(th->userdata);
|
|
||||||
|
|
||||||
if (SDL_AtomicGet(&i_threads_running))
|
|
||||||
{
|
|
||||||
I_lock_mutex(&i_thread_pool_mutex);
|
|
||||||
{
|
|
||||||
if (SDL_AtomicGet(&i_threads_running))
|
|
||||||
{
|
|
||||||
SDL_DetachThread(th->thread);
|
|
||||||
Free_link(&i_thread_pool, link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
I_unlock_mutex(i_thread_pool_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_spawn_thread (
|
|
||||||
const char * name,
|
|
||||||
I_thread_fn entry,
|
|
||||||
void * userdata
|
|
||||||
){
|
|
||||||
Link link;
|
|
||||||
Thread th;
|
|
||||||
|
|
||||||
th = malloc(sizeof *th);
|
|
||||||
|
|
||||||
if (! th)
|
|
||||||
abort();/* this is pretty GNU of me */
|
|
||||||
|
|
||||||
th->entry = entry;
|
|
||||||
th->userdata = userdata;
|
|
||||||
|
|
||||||
I_lock_mutex(&i_thread_pool_mutex);
|
|
||||||
{
|
|
||||||
link = Insert_link(&i_thread_pool, New_link(th));
|
|
||||||
|
|
||||||
if (SDL_AtomicGet(&i_threads_running))
|
|
||||||
{
|
|
||||||
th->thread = SDL_CreateThread(
|
|
||||||
(SDL_ThreadFunction)Worker,
|
|
||||||
name,
|
|
||||||
link
|
|
||||||
);
|
|
||||||
|
|
||||||
if (! th->thread)
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
I_unlock_mutex(i_thread_pool_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
I_thread_is_stopped (void)
|
|
||||||
{
|
|
||||||
return ( ! SDL_AtomicGet(&i_threads_running) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_start_threads (void)
|
|
||||||
{
|
|
||||||
i_thread_pool_mutex = SDL_CreateMutex();
|
|
||||||
i_mutex_pool_mutex = SDL_CreateMutex();
|
|
||||||
i_cond_pool_mutex = SDL_CreateMutex();
|
|
||||||
|
|
||||||
if (!(
|
|
||||||
i_thread_pool_mutex &&
|
|
||||||
i_mutex_pool_mutex &&
|
|
||||||
i_cond_pool_mutex
|
|
||||||
)){
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_stop_threads (void)
|
|
||||||
{
|
|
||||||
Link link;
|
|
||||||
Link next;
|
|
||||||
|
|
||||||
Thread th;
|
|
||||||
SDL_mutex * mutex;
|
|
||||||
SDL_cond * cond;
|
|
||||||
|
|
||||||
if (i_threads_running.value)
|
|
||||||
{
|
|
||||||
/* rely on the good will of thread-san */
|
|
||||||
SDL_AtomicSet(&i_threads_running, 0);
|
|
||||||
|
|
||||||
I_lock_mutex(&i_thread_pool_mutex);
|
|
||||||
{
|
|
||||||
for (
|
|
||||||
link = i_thread_pool;
|
|
||||||
link;
|
|
||||||
link = next
|
|
||||||
){
|
|
||||||
next = link->next;
|
|
||||||
th = link->data;
|
|
||||||
|
|
||||||
SDL_WaitThread(th->thread, NULL);
|
|
||||||
|
|
||||||
free(th);
|
|
||||||
free(link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
I_unlock_mutex(i_thread_pool_mutex);
|
|
||||||
|
|
||||||
for (
|
|
||||||
link = i_mutex_pool;
|
|
||||||
link;
|
|
||||||
link = next
|
|
||||||
){
|
|
||||||
next = link->next;
|
|
||||||
mutex = link->data;
|
|
||||||
|
|
||||||
SDL_DestroyMutex(mutex);
|
|
||||||
|
|
||||||
free(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (
|
|
||||||
link = i_cond_pool;
|
|
||||||
link;
|
|
||||||
link = next
|
|
||||||
){
|
|
||||||
next = link->next;
|
|
||||||
cond = link->data;
|
|
||||||
|
|
||||||
SDL_DestroyCond(cond);
|
|
||||||
|
|
||||||
free(link);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_DestroyMutex(i_thread_pool_mutex);
|
|
||||||
SDL_DestroyMutex(i_mutex_pool_mutex);
|
|
||||||
SDL_DestroyMutex(i_cond_pool_mutex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_lock_mutex (
|
|
||||||
I_mutex * anchor
|
|
||||||
){
|
|
||||||
SDL_mutex * mutex;
|
|
||||||
|
|
||||||
mutex = Identity(
|
|
||||||
&i_mutex_pool,
|
|
||||||
i_mutex_pool_mutex,
|
|
||||||
anchor,
|
|
||||||
(Create_fn)SDL_CreateMutex
|
|
||||||
);
|
|
||||||
|
|
||||||
if (SDL_LockMutex(mutex) == -1)
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_unlock_mutex (
|
|
||||||
I_mutex id
|
|
||||||
){
|
|
||||||
if (SDL_UnlockMutex(id) == -1)
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_hold_cond (
|
|
||||||
I_cond * cond_anchor,
|
|
||||||
I_mutex mutex_id
|
|
||||||
){
|
|
||||||
SDL_cond * cond;
|
|
||||||
|
|
||||||
cond = Identity(
|
|
||||||
&i_cond_pool,
|
|
||||||
i_cond_pool_mutex,
|
|
||||||
cond_anchor,
|
|
||||||
(Create_fn)SDL_CreateCond
|
|
||||||
);
|
|
||||||
|
|
||||||
if (SDL_CondWait(cond, mutex_id) == -1)
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_wake_one_cond (
|
|
||||||
I_cond * anchor
|
|
||||||
){
|
|
||||||
SDL_cond * cond;
|
|
||||||
|
|
||||||
cond = Identity(
|
|
||||||
&i_cond_pool,
|
|
||||||
i_cond_pool_mutex,
|
|
||||||
anchor,
|
|
||||||
(Create_fn)SDL_CreateCond
|
|
||||||
);
|
|
||||||
|
|
||||||
if (SDL_CondSignal(cond) == -1)
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
I_wake_all_cond (
|
|
||||||
I_cond * anchor
|
|
||||||
){
|
|
||||||
SDL_cond * cond;
|
|
||||||
|
|
||||||
cond = Identity(
|
|
||||||
&i_cond_pool,
|
|
||||||
i_cond_pool_mutex,
|
|
||||||
anchor,
|
|
||||||
(Create_fn)SDL_CreateCond
|
|
||||||
);
|
|
||||||
|
|
||||||
if (SDL_CondBroadcast(cond) == -1)
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // HAVE_THREADS
|
|
||||||
@@ -784,7 +784,11 @@ static void Impl_HandleControllerAxisEvent(SDL_ControllerAxisEvent evt)
|
|||||||
// Determine the Joystick IDs for each current open joystick
|
// Determine the Joystick IDs for each current open joystick
|
||||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
if (evt.which == JoyInfo[i].id)
|
if (evt.which == JoyInfo[i].id)
|
||||||
|
#else
|
||||||
|
if (evt.which == SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(JoyInfo[i].dev)))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
event.type = ev_joystick + i;
|
event.type = ev_joystick + i;
|
||||||
break;
|
break;
|
||||||
@@ -844,7 +848,11 @@ static void Impl_HandleControllerHatEvent(SDL_ControllerButtonEvent evt, Uint32
|
|||||||
// Determine the Joystick IDs for each current open joystick
|
// Determine the Joystick IDs for each current open joystick
|
||||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
if (evt.which == JoyInfo[i].id)
|
if (evt.which == JoyInfo[i].id)
|
||||||
|
#else
|
||||||
|
if (evt.which == SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(JoyInfo[i].dev)))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
event.data1 = hat_buttons_base[i];
|
event.data1 = hat_buttons_base[i];
|
||||||
break;
|
break;
|
||||||
@@ -906,7 +914,11 @@ static void Impl_HandleControllerButtonEvent(SDL_ControllerButtonEvent evt, Uint
|
|||||||
// Determine the Joystick IDs for each current open joystick
|
// Determine the Joystick IDs for each current open joystick
|
||||||
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
for (i = 0; i < MAXSPLITSCREENPLAYERS; i++)
|
||||||
{
|
{
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
if (evt.which == JoyInfo[i].id)
|
if (evt.which == JoyInfo[i].id)
|
||||||
|
#else
|
||||||
|
if (evt.which == SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(JoyInfo[i].dev)))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
event.data1 = buttons_base[i];
|
event.data1 = buttons_base[i];
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "SDL_version.h"
|
||||||
|
|
||||||
#include "../m_fixed.h"
|
#include "../m_fixed.h"
|
||||||
|
|
||||||
// SDL2 stub macro
|
// SDL2 stub macro
|
||||||
@@ -39,8 +41,10 @@ typedef struct SDLJoyInfo_s
|
|||||||
{
|
{
|
||||||
/// Controller handle
|
/// Controller handle
|
||||||
SDL_GameController *dev;
|
SDL_GameController *dev;
|
||||||
|
#if (SDL_VERSION_ATLEAST(2,32,4))
|
||||||
/// Controller index
|
/// Controller index
|
||||||
INT32 id;
|
INT32 id;
|
||||||
|
#endif
|
||||||
/// number of old joystick
|
/// number of old joystick
|
||||||
int oldjoy;
|
int oldjoy;
|
||||||
/// number of axies
|
/// number of axies
|
||||||
|
|||||||
+1
-3
@@ -3716,9 +3716,7 @@ void V_DoPostProcessor(INT32 view, INT32 param)
|
|||||||
// Make sure table is built
|
// Make sure table is built
|
||||||
if (heatshifter == NULL || lastheight != viewheight)
|
if (heatshifter == NULL || lastheight != viewheight)
|
||||||
{
|
{
|
||||||
if (heatshifter)
|
Z_Free(heatshifter);
|
||||||
Z_Free(heatshifter);
|
|
||||||
|
|
||||||
heatshifter = Z_Calloc(viewheight * sizeof(boolean), PU_STATIC, NULL);
|
heatshifter = Z_Calloc(viewheight * sizeof(boolean), PU_STATIC, NULL);
|
||||||
|
|
||||||
for (y = 0; y < viewheight; y++)
|
for (y = 0; y < viewheight; y++)
|
||||||
|
|||||||
+3
-4
@@ -122,7 +122,9 @@ void W_Shutdown(void)
|
|||||||
|
|
||||||
if (wad->handle)
|
if (wad->handle)
|
||||||
fclose(wad->handle);
|
fclose(wad->handle);
|
||||||
|
|
||||||
Z_Free(wad->filename);
|
Z_Free(wad->filename);
|
||||||
|
|
||||||
while (wad->numlumps--)
|
while (wad->numlumps--)
|
||||||
{
|
{
|
||||||
Z_Free(wad->lumpinfo[wad->numlumps].longname);
|
Z_Free(wad->lumpinfo[wad->numlumps].longname);
|
||||||
@@ -2730,10 +2732,7 @@ void vres_Free(virtres_t* vres)
|
|||||||
|
|
||||||
while (vres->numlumps--)
|
while (vres->numlumps--)
|
||||||
{
|
{
|
||||||
if (vres->vlumps[vres->numlumps].data)
|
Z_Free(vres->vlumps[vres->numlumps].data);
|
||||||
{
|
|
||||||
Z_Free(vres->vlumps[vres->numlumps].data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Free(vres->vlumps);
|
Z_Free(vres->vlumps);
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ typedef struct memblock_s
|
|||||||
#define MEMORY(x) (void *)((uintptr_t)(x) + sizeof(memblock_t) + ALIGNPAD)
|
#define MEMORY(x) (void *)((uintptr_t)(x) + sizeof(memblock_t) + ALIGNPAD)
|
||||||
#define MEMBLOCK(x) (memblock_t *)((uintptr_t)(x) - ALIGNPAD - sizeof(memblock_t))
|
#define MEMBLOCK(x) (memblock_t *)((uintptr_t)(x) - ALIGNPAD - sizeof(memblock_t))
|
||||||
|
|
||||||
|
static thread_handle_t main_thread;
|
||||||
|
|
||||||
// both the head and tail of the zone memory block list
|
// both the head and tail of the zone memory block list
|
||||||
static memblock_t head;
|
static memblock_t head;
|
||||||
|
|
||||||
@@ -108,6 +110,7 @@ static void Command_Memdump_f(void);
|
|||||||
void Z_Init(void)
|
void Z_Init(void)
|
||||||
{
|
{
|
||||||
size_t total, memfree;
|
size_t total, memfree;
|
||||||
|
main_thread = I_GetCurrentThread();
|
||||||
|
|
||||||
memset(&head, 0x00, sizeof(head));
|
memset(&head, 0x00, sizeof(head));
|
||||||
|
|
||||||
@@ -143,6 +146,8 @@ void Z_Free(void *ptr)
|
|||||||
{
|
{
|
||||||
memblock_t *block;
|
memblock_t *block;
|
||||||
|
|
||||||
|
I_Assert(I_GetCurrentThread() == main_thread);
|
||||||
|
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -237,6 +242,8 @@ void *Z_Malloc(size_t size, INT32 tag, void *user)
|
|||||||
memblock_t *block;
|
memblock_t *block;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
|
I_Assert(I_GetCurrentThread() == main_thread);
|
||||||
|
|
||||||
#ifdef ZDEBUG2
|
#ifdef ZDEBUG2
|
||||||
CONS_Debug(DBG_MEMORY, "Z_Malloc %s:%d\n", file, line);
|
CONS_Debug(DBG_MEMORY, "Z_Malloc %s:%d\n", file, line);
|
||||||
#endif
|
#endif
|
||||||
@@ -300,6 +307,8 @@ void *Z_Calloc2(size_t size, INT32 tag, void *user, const char *file, INT32 line
|
|||||||
void *Z_Calloc(size_t size, INT32 tag, void *user)
|
void *Z_Calloc(size_t size, INT32 tag, void *user)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
I_Assert(I_GetCurrentThread() == main_thread);
|
||||||
|
|
||||||
#ifdef VALGRIND_MEMPOOL_ALLOC
|
#ifdef VALGRIND_MEMPOOL_ALLOC
|
||||||
Z_calloc = true;
|
Z_calloc = true;
|
||||||
#endif
|
#endif
|
||||||
@@ -335,6 +344,8 @@ void *Z_Realloc(void *ptr, size_t size, INT32 tag, void *user)
|
|||||||
memblock_t *block;
|
memblock_t *block;
|
||||||
size_t copysize;
|
size_t copysize;
|
||||||
|
|
||||||
|
I_Assert(I_GetCurrentThread() == main_thread);
|
||||||
|
|
||||||
#ifdef ZDEBUG2
|
#ifdef ZDEBUG2
|
||||||
CONS_Debug(DBG_MEMORY, "Z_Realloc %s:%d\n", file, line);
|
CONS_Debug(DBG_MEMORY, "Z_Realloc %s:%d\n", file, line);
|
||||||
#endif
|
#endif
|
||||||
@@ -414,6 +425,8 @@ void Z_FreeTags(INT32 lowtag, INT32 hightag)
|
|||||||
{
|
{
|
||||||
memblock_t *block, *next;
|
memblock_t *block, *next;
|
||||||
|
|
||||||
|
I_Assert(I_GetCurrentThread() == main_thread);
|
||||||
|
|
||||||
#ifdef ZDEBUG
|
#ifdef ZDEBUG
|
||||||
Z_CheckHeap2(file, line);
|
Z_CheckHeap2(file, line);
|
||||||
#else
|
#else
|
||||||
@@ -447,6 +460,8 @@ void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *))
|
|||||||
{
|
{
|
||||||
memblock_t *block, *next;
|
memblock_t *block, *next;
|
||||||
|
|
||||||
|
I_Assert(I_GetCurrentThread() == main_thread);
|
||||||
|
|
||||||
if (!iterfunc)
|
if (!iterfunc)
|
||||||
I_Error("Z_IterateTags: no iterator function was given");
|
I_Error("Z_IterateTags: no iterator function was given");
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -91,7 +91,7 @@ void Z_Init(void);
|
|||||||
|
|
||||||
// Z_Free and alloc with alignment
|
// Z_Free and alloc with alignment
|
||||||
#ifdef ZDEBUG
|
#ifdef ZDEBUG
|
||||||
#define Z_Free(p) Z_Free2(p, __FILE__, __LINE__)
|
#define Z_Free(p) Z_Free2(p, __FILE__, __LINE__)
|
||||||
#define Z_Malloc(s,t,u) Z_Malloc2(s, t, u, __FILE__, __LINE__)
|
#define Z_Malloc(s,t,u) Z_Malloc2(s, t, u, __FILE__, __LINE__)
|
||||||
#define Z_Calloc(s,t,u) Z_Calloc2(s, t, u, __FILE__, __LINE__)
|
#define Z_Calloc(s,t,u) Z_Calloc2(s, t, u, __FILE__, __LINE__)
|
||||||
#define Z_Realloc(p,s,t,u) Z_Realloc2(p,s, t, u, __FILE__, __LINE__)
|
#define Z_Realloc(p,s,t,u) Z_Realloc2(p,s, t, u, __FILE__, __LINE__)
|
||||||
|
|||||||
Reference in new issue
Block a user