pthreads wip

This commit is contained in:
2018-01-21 09:59:02 +01:00
parent 4093f9857a
commit 291f1cd8c3
5 changed files with 74 additions and 44 deletions

View File

@@ -46,7 +46,7 @@
* back-end implementations, which may not be reentrant.
*/
extern mutex_t __grmutex;
#endif /* defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
/*
* files methods

View File

@@ -294,10 +294,10 @@ vsyslogp_r(int pri, struct syslog_data *data, const char *msgid,
#endif
}
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_lock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
if (data->log_hostname[0] == '\0' && gethostname(data->log_hostname,
sizeof(data->log_hostname)) == -1) {
@@ -316,10 +316,10 @@ vsyslogp_r(int pri, struct syslog_data *data, const char *msgid,
prlen = snprintf_ss(p, tbuf_left, "%s ",
data->log_tag ? data->log_tag : "-");
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_unlock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
if (data->log_stat & (LOG_PERROR|LOG_CONS)) {
iovcnt = 0;
@@ -430,10 +430,10 @@ vsyslogp_r(int pri, struct syslog_data *data, const char *msgid,
}
/* Get connected, output the message to the local logger. */
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_lock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
opened = !data->log_opened;
if (opened)
openlog_unlocked_r(data->log_tag, data->log_stat, 0, data);
@@ -471,10 +471,10 @@ vsyslogp_r(int pri, struct syslog_data *data, const char *msgid,
(void)close(fd);
}
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_unlock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
if (data != &sdata && opened) {
/* preserve log tag */
@@ -518,8 +518,7 @@ connectlog_r(struct syslog_data *data)
if (!data->log_connected) {
if (connect(data->log_file,
(const struct sockaddr *)(const void *)&sun,
(socklen_t)sizeof(sun)) == -1)
{
(socklen_t)sizeof(sun)) == -1) {
(void)close(data->log_file);
data->log_file = -1;
} else
@@ -546,32 +545,32 @@ openlog_unlocked_r(const char *ident, int logstat, int logfac,
void
openlog_r(const char *ident, int logstat, int logfac, struct syslog_data *data)
{
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_lock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
openlog_unlocked_r(ident, logstat, logfac, data);
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_unlock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
}
void
closelog_r(struct syslog_data *data)
{
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_lock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
(void)close(data->log_file);
data->log_file = -1;
data->log_connected = 0;
data->log_tag = NULL;
#if !defined(__minix)
#if defined(__minix) && defined(_REENTRANT)
if (data == &sdata)
mutex_unlock(&syslog_mutex);
#endif /* !defined(__minix) */
#endif /* defined(__minix) && defined(_REENTRANT) */
}
int

View File

@@ -161,6 +161,8 @@ static union hashlock {
* to work properly (thread-specific data is an application-visible example;
* spinlock counts for mutexes is an internal example).
*/
void __pthread_init_userspace(void);
void
pthread__init(void)
{
@@ -169,6 +171,10 @@ pthread__init(void)
int i;
extern int __isthreaded;
#if defined(__minix)
__pthread_init_userspace();
#endif /* defined(__minix) */
/*
* Allocate pthread_keys descriptors before
* reseting __uselibcstub because otherwise

View File

@@ -41,29 +41,35 @@ int pthread__cancel_stub_binder;
extern void
__minix_schedule(int signal __unused);
void __pthread_init_minix(void) __attribute__((__constructor__, __used__));
void __pthread_init_userspace(void);
void
__pthread_init_minix(void)
__pthread_init_userspace(void)
{
int r;
static struct sigaction old_action;
static struct sigaction new_action;
static struct tls_tcb main_tls;
static struct sigaction old_action;
static struct sigaction new_action;
struct itimerval nit;
struct itimerval oit;
struct itimerval nit;
struct itimerval oit;
print("__pthread_init_minix\n");
_lwp_setprivate(&main_tls);
__minix_setup_main();
memset(&old_action, 0, sizeof(old_action));
memset(&new_action, 0, sizeof(new_action));
new_action.sa_handler = __minix_schedule;
new_action.sa_flags = 0;
r = sigaction(SIGVTALRM, &new_action, &old_action);
new_action.sa_handler = __minix_schedule;
new_action.sa_flags = 0;
r = sigaction(SIGVTALRM, &new_action, &old_action);
nit.it_value.tv_sec = 0;
nit.it_value.tv_usec = 1;
nit.it_interval.tv_sec = 0;
nit.it_interval.tv_usec = 10;
r = setitimer(ITIMER_VIRTUAL, &nit, &oit);
nit.it_value.tv_sec = 0;
nit.it_value.tv_usec = 1;
nit.it_interval.tv_sec = 0;
nit.it_interval.tv_usec = 10;
r = setitimer(ITIMER_VIRTUAL, &nit, &oit);
}
int

View File

@@ -28,18 +28,20 @@ struct lwp {
static struct lwp lwp_threads[MAX_THREAD_POOL];
static volatile lwpid_t current_thread = 0;
static int initialized = 0;
void
__minix_schedule(int signal __unused);
void __minix_setup_main(void);
void __minix_schedule(int signal __unused);
#if 0
#define print(msg) \
{ \
const char m[] = msg; \
write(2, m, sizeof(m)); \
}
#define print(args...) \
{ \
char buffer[200]; \
snprintf(buffer, 200, args); \
write(2, buffer, strlen(buffer)); \
}
#else
#define print(m) /**/
#define print(m...) /**/
#endif
static int
@@ -55,13 +57,28 @@ __minix_runnable(struct lwp* thread)
return 0; /* Not runnable */
}
void
__minix_setup_main(void)
{
lwp_threads[0].flags = SLOT_IN_USE | LW_UNPARKED;
}
void
__minix_schedule(int signal __unused)
{
extern int __isthreaded;
static int last_pos = 0;
struct lwp* old = &lwp_threads[current_thread];
int pos;
/* This will be set to 1 in pthread.c, when the main thread is ready. */
if (0 == __isthreaded)
{
return;
}
//FIXME: LSC ADD A BARRIER TO PREVENT TWO EXECUTIONS OF THE SCHEDULE AT THE SAME TIME
/* Select Next thread to run.
* Simply scan the array looking for a schedulable thread, and
* loopback to the start if we reach the end. */
@@ -115,8 +132,9 @@ _lwp_makecontext(ucontext_t *context, void (*start_routine)(void *),
int
_lwp_create(const ucontext_t *context, unsigned long flags, lwpid_t *new_lwp)
{
size_t i = 0;
size_t i = 1; // Skip slot 0 which is main thread
print("_lwp_create\n");
while ((i < MAX_THREAD_POOL) &&
(SLOT_IN_USE == (lwp_threads[i].flags & SLOT_IN_USE))) {
i++;
@@ -236,15 +254,16 @@ _lwp_getname(lwpid_t target, char * name, size_t len)
void *
_lwp_getprivate(void)
{
// print("_lwp_getprivate\n");
// print("_lwp_getprivate %08x %08x %08x\n", lwp_threads, &lwp_threads[current_thread], lwp_threads[current_thread].tls);
return lwp_threads[current_thread].tls;
}
void
_lwp_setprivate(void *cookie)
{
print("_lwp_setprivate\n");
// print("_lwp_setprivate %08x\n", cookie);
lwp_threads[current_thread].tls = cookie;
// print("_lwp_setprivate %08x %08x %08x %08x\n", lwp_threads, &lwp_threads[current_thread], lwp_threads[current_thread].tls, cookie);
}
int