Add threads.c
This commit is contained in:
parent
b9f016f82a
commit
a9a78c62c4
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
FILES = *.c */*.c
|
FILES = *.c */*.c
|
||||||
LIBRARIES = -lpthread
|
LIBRARIES = -lpthread
|
||||||
INCLUDES = -I. -I./parser/ -I./compiler/ -I./vm/ -I./tokenizer/ -I./misc/
|
INCLUDES = -I. -I./parser/ -I./compiler/ -I./vm/ -I./tokenizer/ -I./misc/
|
||||||
CFLAGS = -std=c99 -g
|
CFLAGS = -std=c99 -Wall
|
||||||
OUTFILE = jack-compiler
|
OUTFILE = jack-compiler
|
||||||
|
|
||||||
main: ${FILES}
|
main: ${FILES}
|
||||||
|
|
70
main.c
70
main.c
|
@ -2,81 +2,13 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <pthread.h>
|
#include "threads.h"
|
||||||
#include <unistd.h>
|
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
typedef struct unit {
|
|
||||||
FILELIST* file;
|
|
||||||
TOKEN* tokens;
|
|
||||||
CLASS* parsed;
|
|
||||||
COMPILER* compiler;
|
|
||||||
LINEBLOCK* compiled;
|
|
||||||
struct unit* next;
|
|
||||||
} COMPILEUNIT;
|
|
||||||
|
|
||||||
void* parseunit(void* input) {
|
|
||||||
COMPILEUNIT* unit = (COMPILEUNIT*)input;
|
|
||||||
|
|
||||||
unit->parsed = parse(unit->tokens, unit->file->name);
|
|
||||||
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* compileunit(void* input) {
|
|
||||||
COMPILEUNIT* unit = (COMPILEUNIT*)input;
|
|
||||||
|
|
||||||
unit->compiled = compileclass(unit->compiler, unit->parsed);
|
|
||||||
|
|
||||||
pthread_exit(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void waitthreads(pthread_t* threads, int amount) {
|
|
||||||
void* status;
|
|
||||||
int code;
|
|
||||||
for(int i = 0; i < amount; i++) {
|
|
||||||
code = pthread_join(threads[i], &status);
|
|
||||||
if(code) {
|
|
||||||
eprintf("Error while joining thread %i: %s\n", i, strerror(code));
|
|
||||||
exit(code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void actonunits(COMPILEUNIT* units, void*(*fun)(void*)) {
|
|
||||||
pthread_t mythreads[_SC_THREAD_THREADS_MAX];
|
|
||||||
pthread_attr_t attr;
|
|
||||||
pthread_attr_init(&attr);
|
|
||||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
|
|
||||||
|
|
||||||
COMPILEUNIT* curr = units;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
int code;
|
|
||||||
do {
|
|
||||||
i = 0;
|
|
||||||
while(curr != NULL && i < _SC_THREAD_THREADS_MAX) {
|
|
||||||
code = pthread_create(&mythreads[i], &attr, fun, curr);
|
|
||||||
|
|
||||||
if(code) {
|
|
||||||
eprintf("Error while creating thread %i: %s\n", i, strerror(code));
|
|
||||||
exit(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
curr = curr->next;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
waitthreads(mythreads, i);
|
|
||||||
} while(i == _SC_THREAD_THREADS_MAX);
|
|
||||||
|
|
||||||
pthread_attr_destroy(&attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
if(argc < 2) {
|
if(argc < 2) {
|
||||||
eprintf("Usage: %s {input file(s)}\n", argv[0]);
|
eprintf("Usage: %s {input file(s)}\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "threads.h"
|
||||||
|
|
||||||
|
void* parseunit(void* input) {
|
||||||
|
COMPILEUNIT* unit = (COMPILEUNIT*)input;
|
||||||
|
|
||||||
|
unit->parsed = parse(unit->tokens, unit->file->name);
|
||||||
|
|
||||||
|
pthread_exit(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* compileunit(void* input) {
|
||||||
|
COMPILEUNIT* unit = (COMPILEUNIT*)input;
|
||||||
|
|
||||||
|
unit->compiled = compileclass(unit->compiler, unit->parsed);
|
||||||
|
|
||||||
|
pthread_exit(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void waitthreads(pthread_t* threads, int amount) {
|
||||||
|
void* status;
|
||||||
|
int code;
|
||||||
|
for(int i = 0; i < amount; i++) {
|
||||||
|
code = pthread_join(threads[i], &status);
|
||||||
|
if(code) {
|
||||||
|
eprintf("Error while joining thread %i: %s\n", i, strerror(code));
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void actonunits(COMPILEUNIT* units, void*(*fun)(void*)) {
|
||||||
|
pthread_t mythreads[_SC_THREAD_THREADS_MAX];
|
||||||
|
pthread_attr_t attr;
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
|
COMPILEUNIT* curr = units;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int code;
|
||||||
|
do {
|
||||||
|
i = 0;
|
||||||
|
while(curr != NULL && i < _SC_THREAD_THREADS_MAX) {
|
||||||
|
code = pthread_create(&mythreads[i], &attr, fun, curr);
|
||||||
|
|
||||||
|
if(code) {
|
||||||
|
eprintf("Error while creating thread %i: %s\n", i, strerror(code));
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
curr = curr->next;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
waitthreads(mythreads, i);
|
||||||
|
} while(i == _SC_THREAD_THREADS_MAX);
|
||||||
|
|
||||||
|
pthread_attr_destroy(&attr);
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef THREADS_H
|
||||||
|
#define THREADS_H
|
||||||
|
#include <pthread.h>
|
||||||
|
#include "parser.h"
|
||||||
|
#include "compiler.h"
|
||||||
|
#include "io.h"
|
||||||
|
|
||||||
|
/* threads
|
||||||
|
* Tools for dealing with the compiling pipeline in a parallel way */
|
||||||
|
|
||||||
|
typedef struct unit {
|
||||||
|
FILELIST* file;
|
||||||
|
TOKEN* tokens;
|
||||||
|
CLASS* parsed;
|
||||||
|
COMPILER* compiler;
|
||||||
|
LINEBLOCK* compiled;
|
||||||
|
struct unit* next;
|
||||||
|
} COMPILEUNIT;
|
||||||
|
|
||||||
|
void* parseunit(void* input);
|
||||||
|
void* compileunit(void* input);
|
||||||
|
void waitthreads(pthread_t* threads, int amount);
|
||||||
|
void actonunits(COMPILEUNIT* units, void*(*fun)(void*));
|
||||||
|
#endif
|
Loading…
Reference in New Issue