Remove the concept of thread priorities from empthread.h. Only LWP

supports priorities.  Update synchronization used to rely on them,
which naturally worked only with LWP (#1504036).  With that fixed, no
uses of priorities remained, but a minor bug did: players could starve
out threads with priorities below PP_PLAYER, i.e. delete_lostitems()
and player_kill_idle().  Closes #1458175:
(empth_create): Remove parameter prio.  Callers changed.  Also gets
rid of misleading comments in pthread.c and ntthread.c.
(PP_MAIN, PP_UPDATE, PP_SHUTDOWN, PP_SCHED, PP_TIMESTAMP, PP_PLAYER)
(PP_ACCEPT, PP_KILLIDLE): Remove.
(empth_init, empth_create) [EMPTH_LWP]: Pass priority 1.
This commit is contained in:
Markus Armbruster 2007-07-24 05:13:31 +00:00
parent 7536a38e95
commit d500a7071c
9 changed files with 13 additions and 38 deletions

View file

@ -51,18 +51,6 @@
#include <time.h> #include <time.h>
/* thread priorities */
enum {
PP_MAIN = 7,
PP_UPDATE = 6,
PP_SHUTDOWN = 5,
PP_SCHED = 4,
PP_TIMESTAMP = 2,
PP_PLAYER = 3,
PP_ACCEPT = 3,
PP_KILLIDLE = 2
};
#ifdef EMPTH_LWP #ifdef EMPTH_LWP
#include "lwp.h" #include "lwp.h"
@ -123,7 +111,6 @@ int empth_init(void **ctx, int flags);
/* /*
* Create a new thread. * Create a new thread.
* PRIO is the scheduling priority.
* ENTRY is the entry point. It will be called with argument UD. * ENTRY is the entry point. It will be called with argument UD.
* Thread stack is at least SIZE bytes. * Thread stack is at least SIZE bytes.
* FLAGS should be the same as were passed to empth_init(), or zero. * FLAGS should be the same as were passed to empth_init(), or zero.
@ -134,7 +121,7 @@ int empth_init(void **ctx, int flags);
* Yield the processor. * Yield the processor.
* Return the thread, or NULL on error. * Return the thread, or NULL on error.
*/ */
empth_t *empth_create(int prio, void (*entry)(void *), empth_t *empth_create(void (*entry)(void *),
int size, int flags, char *name, void *ud); int size, int flags, char *name, void *ud);
/* /*

View file

@ -54,18 +54,18 @@ empth_init(void **ctx, int flags)
sigaddset(&set, SIGHUP); sigaddset(&set, SIGHUP);
sigaddset(&set, SIGINT); sigaddset(&set, SIGINT);
sigaddset(&set, SIGTERM); sigaddset(&set, SIGTERM);
lwpInitSystem(PP_MAIN, ctx, flags, &set); lwpInitSystem(1, ctx, flags, &set);
return 0; return 0;
} }
empth_t * empth_t *
empth_create(int prio, void (*entry)(void *), int size, int flags, empth_create(void (*entry)(void *), int size, int flags,
char *name, void *ud) char *name, void *ud)
{ {
if (!flags) if (!flags)
flags = empth_flags; flags = empth_flags;
return lwpCreate(prio, entry, size, flags, name, 0, 0, ud); return lwpCreate(1, entry, size, flags, name, 0, 0, ud);
} }
empth_t * empth_t *

View file

@ -418,7 +418,6 @@ empth_init(void **ctx_ptr, int flags)
* *
* Create a new thread. * Create a new thread.
* *
* prio - priority, not particularly useful in our context.
* entry - entry point function for thread. * entry - entry point function for thread.
* size - stack size. * size - stack size.
* flags - debug control. * flags - debug control.
@ -429,7 +428,7 @@ empth_init(void **ctx_ptr, int flags)
* It is also passed to the entry function... * It is also passed to the entry function...
*/ */
empth_t * empth_t *
empth_create(int prio, void (*entry)(void *), int size, int flags, empth_create(void (*entry)(void *), int size, int flags,
char *name, void *ud) char *name, void *ud)
{ {
empth_t *pThread = NULL; empth_t *pThread = NULL;

View file

@ -180,14 +180,8 @@ empth_init(void **ctx_ptr, int flags)
} }
/*
* prio can be used for setting scheeduling policy but...
* it seems to be optional in POSIX threads and Solaris
* for example just ignores it.
* More then that priority is not needed even in lwp threads.
*/
empth_t * empth_t *
empth_create(int prio, void (*entry)(void *), int size, int flags, empth_create(void (*entry)(void *), int size, int flags,
char *name, void *ud) char *name, void *ud)
{ {
pthread_t t; pthread_t t;

View file

@ -224,7 +224,6 @@ player_accept(void *unused)
/* budget */ + MAX(WORLD_X * WORLD_Y / 2 * sizeof(int) * 7, /* budget */ + MAX(WORLD_X * WORLD_Y / 2 * sizeof(int) * 7,
/* power */ MAXNOC * sizeof(struct powstr)); /* power */ MAXNOC * sizeof(struct powstr));
sprintf(buf, "Player (fd #%d)", ns); sprintf(buf, "Player (fd #%d)", ns);
empth_create(PP_PLAYER, player_login, stacksize, empth_create(player_login, stacksize, 0, buf, np);
0, buf, np);
} }
} }

View file

@ -331,12 +331,9 @@ start_server(int flags)
if (journal_startup() < 0) if (journal_startup() < 0)
exit(1); exit(1);
empth_create(PP_ACCEPT, player_accept, (50 * 1024), flags, empth_create(player_accept, 50 * 1024, flags, "AcceptPlayers", 0);
"AcceptPlayers", 0); empth_create(player_kill_idle, 50 * 1024, flags, "KillIdle", 0);
empth_create(PP_KILLIDLE, player_kill_idle, (50 * 1024), flags, empth_create(delete_lostitems, 50 * 1024, flags, "DeleteItems", 0);
"KillIdle", 0);
empth_create(PP_TIMESTAMP, delete_lostitems, (50 * 1024), flags,
"DeleteItems", 0);
market_init(); market_init();
update_init(); update_init();

View file

@ -71,7 +71,6 @@ market_init(void)
dp = player_new(-1); dp = player_new(-1);
if (!dp) if (!dp)
exit_nomem(); exit_nomem();
if (!empth_create(PP_UPDATE, market_update, 50 * 1024, 0, if (!empth_create(market_update, 50 * 1024, 0, "MarketUpdate", dp))
"MarketUpdate", dp))
exit_nomem(); exit_nomem();
} }

View file

@ -65,7 +65,7 @@ shutdown_initiate(int mins_from_now)
mins_from_now); mins_from_now);
/* FIXME wake up shutdown_sequence() */ /* FIXME wake up shutdown_sequence() */
} else { } else {
if (!empth_create(PP_SHUTDOWN, shutdown_sequence, 50 * 1024, 0, if (!empth_create(shutdown_sequence, 50 * 1024, 0,
"shutdownSeq", NULL)) "shutdownSeq", NULL))
return -1; return -1;
} }

View file

@ -85,7 +85,7 @@ update_init(void)
stacksize = 100000 + stacksize = 100000 +
/* finish_sects */ WORLD_X * WORLD_Y * (2 * sizeof(double) + /* finish_sects */ WORLD_X * WORLD_Y * (2 * sizeof(double) +
sizeof(char *)); sizeof(char *));
update_thread = empth_create(PP_UPDATE, update_sched, stacksize, 0, update_thread = empth_create(update_sched, stacksize, 0,
"Update", dp); "Update", dp);
if (!update_thread) if (!update_thread)
exit_nomem(); exit_nomem();