mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 22:02:27 +00:00
[WIP] Threading phase 2 (#301)
* Exponential back-off * Removed "native" specifier * Abstract away Futex for cthread * Complete setup for TLS (including main thread)
This commit is contained in:
parent
660ff56d40
commit
45a7435788
11 changed files with 249 additions and 78 deletions
|
@ -7,35 +7,44 @@
|
|||
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||||
╚─────────────────────────────────────────────────────────────────*/
|
||||
#endif
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/thread/create.h"
|
||||
#include "libc/thread/self.h"
|
||||
#include "libc/thread/detach.h"
|
||||
#include "libc/thread/join.h"
|
||||
#include "libc/thread/nativesem.h"
|
||||
#include "libc/thread/sem.h"
|
||||
#include "libc/time/time.h"
|
||||
|
||||
cthread_native_sem_t semaphore;
|
||||
cthread_sem_t semaphore;
|
||||
|
||||
__thread int test_tls = 0x12345678;
|
||||
|
||||
int worker(void* arg) {
|
||||
cthread_native_sem_signal(&semaphore);
|
||||
void* p;
|
||||
arch_prctl(ARCH_GET_FS, &p);
|
||||
cthread_sem_signal(&semaphore);
|
||||
|
||||
cthread_t self = cthread_self();
|
||||
int tid = self->tid;
|
||||
sleep(1);
|
||||
//sleep(10000);
|
||||
//printf("[%p] %d\n", self, tid);
|
||||
printf("[%p] %d -> 0x%x\n", self, tid, test_tls);
|
||||
(void)arg;
|
||||
return 4;
|
||||
}
|
||||
|
||||
int main() {
|
||||
cthread_native_sem_init(&semaphore, 0);
|
||||
cthread_t self = cthread_self();
|
||||
int tid = self->tid;
|
||||
printf("[%p] %d -> 0x%x\n", self, tid, test_tls);
|
||||
cthread_sem_init(&semaphore, 0);
|
||||
|
||||
cthread_t thread;
|
||||
int rc = cthread_create(&thread, NULL, &worker, NULL);
|
||||
if (rc == 0) {
|
||||
cthread_native_sem_wait(&semaphore, 0, 0, NULL);
|
||||
cthread_sem_wait(&semaphore, 0, NULL);
|
||||
//printf("thread created: %p\n", thread);
|
||||
sleep(1);
|
||||
#if 1
|
||||
|
@ -44,8 +53,8 @@ int main() {
|
|||
rc = cthread_detach(thread);
|
||||
sleep(2);
|
||||
#endif
|
||||
cthread_native_sem_signal(&semaphore);
|
||||
cthread_native_sem_wait(&semaphore, 0, 0, NULL);
|
||||
cthread_sem_signal(&semaphore);
|
||||
cthread_sem_wait(&semaphore, 0, NULL);
|
||||
//printf("thread joined: %p -> %d\n", thread, rc);
|
||||
} else {
|
||||
printf("ERROR: thread could not be started: %d\n", rc);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue