Separate pthread; add mouse move events?

This commit is contained in:
Kevin Lange 2012-04-12 22:42:24 -05:00
parent 3e70898674
commit 0eaf3a99a3
9 changed files with 172 additions and 114 deletions

View File

@ -2,7 +2,7 @@ CC = i686-pc-toaru-gcc
CPP = i686-pc-toaru-g++ CPP = i686-pc-toaru-g++
CFLAGS = -std=c99 -O3 -m32 -Wa,--32 -Xlinker --eh-frame-hdr CFLAGS = -std=c99 -O3 -m32 -Wa,--32 -Xlinker --eh-frame-hdr
CPPFLAGS = -O3 -m32 -Wa,--32 CPPFLAGS = -O3 -m32 -Wa,--32
EXTRAFLAGS = -s EXTRAFLAGS = -g
EXECUTABLES = $(patsubst %.c,%.o,$(wildcard lib/*.c)) $(patsubst %.c,../hdd/bin/%,$(wildcard *.c)) $(patsubst %.cpp,../hdd/bin/%,$(wildcard *.cpp)) EXECUTABLES = $(patsubst %.c,%.o,$(wildcard lib/*.c)) $(patsubst %.c,../hdd/bin/%,$(wildcard *.c)) $(patsubst %.cpp,../hdd/bin/%,$(wildcard *.cpp))
BEG = ../util/mk-beg BEG = ../util/mk-beg
@ -19,7 +19,7 @@ FREETYPE_LIB = ../util/toaru-toolchain/i686-pc-toaru/lib/libfreetype.a
LIBM = ../util/toaru-toolchain/i686-pc-toaru/lib/libm.a LIBM = ../util/toaru-toolchain/i686-pc-toaru/lib/libm.a
TARGETDIR = ../hdd/bin/ TARGETDIR = ../hdd/bin/
ETARGETS = terminal login compositor view game-win drawlines glogin julia-win solver donut wallpaper panel glock clock-win ETARGETS = terminal login compositor view game-win drawlines glogin julia-win solver donut wallpaper panel glock clock-win draw
FTARGETS = $(ETARGETS:%=$(TARGETDIR)%) FTARGETS = $(ETARGETS:%=$(TARGETDIR)%)
.PHONY: all clean .PHONY: all clean
@ -31,9 +31,9 @@ clean:
@-rm -f ${EXECUTABLES} @-rm -f ${EXECUTABLES}
@${ENDRM} "RM" "Cleaned userspace full-toolchain applications." @${ENDRM} "RM" "Cleaned userspace full-toolchain applications."
${FTARGETS}: $(TARGETDIR)% : %.c lib/graphics.o lib/list.o lib/window.o lib/sha2.o lib/decorations.o ${FTARGETS}: $(TARGETDIR)% : %.c lib/graphics.o lib/list.o lib/window.o lib/sha2.o lib/decorations.o lib/pthread.o
@${BEG} "CC" "$@ $< [w/libs]" @${BEG} "CC" "$@ $< [w/libs]"
@${CC} ${CFLAGS} ${EXTRAFLAGS} ${FREETYPE_INC} -o $@ $< lib/graphics.o lib/list.o lib/window.o lib/sha2.o lib/decorations.o ${LIBM} ${FREETYPE_LIB} ${ERRORS} @${CC} ${CFLAGS} ${EXTRAFLAGS} ${FREETYPE_INC} -o $@ $< lib/graphics.o lib/list.o lib/window.o lib/sha2.o lib/decorations.o lib/pthread.o ${LIBM} ${FREETYPE_LIB} ${ERRORS}
@${END} "CC" "$< [w/libs]" @${END} "CC" "$< [w/libs]"
$(TARGETDIR)%: %.cpp $(TARGETDIR)%: %.cpp

View File

@ -19,14 +19,13 @@
#include "lib/list.h" #include "lib/list.h"
#include "lib/graphics.h" #include "lib/graphics.h"
#include "lib/window.h" #include "lib/window.h"
#include "lib/pthread.h"
#include "../kernel/include/signal.h" #include "../kernel/include/signal.h"
#include "../kernel/include/mouse.h" #include "../kernel/include/mouse.h"
DECL_SYSCALL0(mkpipe); DECL_SYSCALL0(mkpipe);
DEFN_SYSCALL0(mousedevice, 33); DEFN_SYSCALL0(mousedevice, 33);
DEFN_SYSCALL3(clone, 30, uintptr_t, uintptr_t, void *);
DEFN_SYSCALL0(gettid, 41);
void spin_lock(int volatile * lock) { void spin_lock(int volatile * lock) {
while(__sync_lock_test_and_set(lock, 0x01)) { while(__sync_lock_test_and_set(lock, 0x01)) {
@ -38,35 +37,6 @@ void spin_unlock(int volatile * lock) {
__sync_lock_release(lock); __sync_lock_release(lock);
} }
int clone(uintptr_t,uintptr_t,void*) __attribute__((alias("syscall_clone")));
int gettid() __attribute__((alias("syscall_gettid")));
typedef struct {
uint32_t id;
char * stack;
void * ret_val;
} pthread_t;
typedef unsigned int pthread_attr_t;
#define PTHREAD_STACK_SIZE 10240
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg) {
char * stack = malloc(PTHREAD_STACK_SIZE);
uintptr_t stack_top = (uintptr_t)stack + PTHREAD_STACK_SIZE;
thread->stack = stack;
thread->id = clone(stack_top, (uintptr_t)start_routine, arg);
return 0;
}
void pthread_exit(void * value) {
/* Perform nice cleanup */
#if 0
/* XXX: LOCK */
free(stack);
/* XXX: Return value!? */
#endif
__asm__ ("jmp 0xFFFFB00F"); /* Force thread exit */
}
sprite_t * sprites[128]; sprite_t * sprites[128];
@ -77,6 +47,7 @@ sprite_t * sprites[128];
list_t * process_list; list_t * process_list;
int32_t mouse_x, mouse_y; int32_t mouse_x, mouse_y;
int32_t click_x, click_y;
#define MOUSE_SCALE 10 #define MOUSE_SCALE 10
#define MOUSE_OFFSET_X 26 #define MOUSE_OFFSET_X 26
#define MOUSE_OFFSET_Y 26 #define MOUSE_OFFSET_Y 26
@ -437,6 +408,22 @@ void send_keyboard_event (process_windows_t * pw, uint8_t event, w_keyboard_t pa
write(pw->event_pipe, &header, sizeof(wins_packet_t)); write(pw->event_pipe, &header, sizeof(wins_packet_t));
write(pw->event_pipe, &packet, sizeof(w_keyboard_t)); write(pw->event_pipe, &packet, sizeof(w_keyboard_t));
syscall_send_signal(pw->pid, SIGWINEVENT); // SIGWINEVENT syscall_send_signal(pw->pid, SIGWINEVENT); // SIGWINEVENT
syscall_yield();
}
void send_mouse_event (process_windows_t * pw, uint8_t event, w_mouse_t * packet) {
/* Construct the header */
wins_packet_t header;
header.magic = WINS_MAGIC;
header.command_type = event;
header.packet_size = sizeof(w_mouse_t);
/* Send them */
// XXX: we have a race condition here
write(pw->event_pipe, &header, sizeof(wins_packet_t));
write(pw->event_pipe, packet, sizeof(w_mouse_t));
//syscall_send_signal(pw->pid, SIGWINEVENT); // SIGWINEVENT
syscall_yield();
} }
void process_window_command (int sig) { void process_window_command (int sig) {
@ -879,6 +866,8 @@ void * process_requests(void * garbage) {
mouse_x = MOUSE_SCALE * graphics_width / 2; mouse_x = MOUSE_SCALE * graphics_width / 2;
mouse_y = MOUSE_SCALE * graphics_height / 2; mouse_y = MOUSE_SCALE * graphics_height / 2;
click_x = 0;
click_y = 0;
uint16_t _mouse_state = 0; uint16_t _mouse_state = 0;
window_t * _mouse_window = NULL; window_t * _mouse_window = NULL;
@ -951,8 +940,8 @@ void * process_requests(void * garbage) {
_mouse_win_x = _mouse_window->x; _mouse_win_x = _mouse_window->x;
_mouse_win_y = _mouse_window->y; _mouse_win_y = _mouse_window->y;
int32_t click_x = mouse_x / MOUSE_SCALE - _mouse_win_x; click_x = mouse_x / MOUSE_SCALE - _mouse_win_x;
int32_t click_y = mouse_y / MOUSE_SCALE - _mouse_win_y; click_y = mouse_y / MOUSE_SCALE - _mouse_win_y;
printf("Mouse down at @ %d,%d = %d,%d\n", mouse_x, mouse_y, click_x, click_y); printf("Mouse down at @ %d,%d = %d,%d\n", mouse_x, mouse_y, click_x, click_y);
} }
@ -997,8 +986,8 @@ void * process_requests(void * garbage) {
_mouse_win_x = _mouse_window->x; _mouse_win_x = _mouse_window->x;
_mouse_win_y = _mouse_window->y; _mouse_win_y = _mouse_window->y;
int32_t click_x = mouse_x / MOUSE_SCALE - _mouse_win_x; click_x = mouse_x / MOUSE_SCALE - _mouse_win_x;
int32_t click_y = mouse_y / MOUSE_SCALE - _mouse_win_y; click_y = mouse_y / MOUSE_SCALE - _mouse_win_y;
printf("Mouse up at @ %d,%d = %d,%d\n", mouse_x, mouse_y, click_x, click_y); printf("Mouse up at @ %d,%d = %d,%d\n", mouse_x, mouse_y, click_x, click_y);
#if 0 /* Resizing */ #if 0 /* Resizing */
@ -1020,13 +1009,25 @@ void * process_requests(void * garbage) {
#endif #endif
} else { } else {
/* Still down */ /* Still down */
w_mouse_t _packet;
_packet.wid = _mouse_window->wid;
_mouse_win_x = _mouse_window->x; _mouse_win_x = _mouse_window->x;
_mouse_win_y = _mouse_window->y; _mouse_win_y = _mouse_window->y;
int32_t click_x = mouse_x / MOUSE_SCALE - _mouse_win_x; _packet.old_x = click_x;
int32_t click_y = mouse_y / MOUSE_SCALE - _mouse_win_y; _packet.old_y = click_y;
printf("Mouse move to @ %d,%d = %d,%d\n", mouse_x, mouse_y, click_x, click_y); click_x = mouse_x / MOUSE_SCALE - _mouse_win_x;
click_y = mouse_y / MOUSE_SCALE - _mouse_win_y;
_packet.new_x = click_x;
_packet.new_y = click_y;
_packet.buttons = packet->buttons;
send_mouse_event(_mouse_window->owner, WE_MOUSEMOVE, &_packet);
#if 0 #if 0
redraw_bounding_box_r(_mouse_window, _mouse_win_x_p, _mouse_win_y_p, 0); redraw_bounding_box_r(_mouse_window, _mouse_win_x_p, _mouse_win_y_p, 0);
_mouse_win_x_p = _mouse_win_x + (mouse_x - _mouse_init_x) / MOUSE_SCALE; _mouse_win_x_p = _mouse_win_x + (mouse_x - _mouse_init_x) / MOUSE_SCALE;

46
userspace/draw.c Normal file
View File

@ -0,0 +1,46 @@
#include <stdlib.h>
#include "lib/window.h"
#include "lib/graphics.h"
int main (int argc, char ** argv) {
int left = 30;
int top = 30;
int width = 450;
int height = 450;
setup_windowing();
/* Do something with a window */
window_t * wina = window_create(left, top, width, height);
window_fill(wina, rgb(255,255,255));
init_graphics_window(wina);
win_use_threaded_handler();
while (1) {
w_keyboard_t * kbd = poll_keyboard();
if (kbd != NULL) {
if (kbd->key == 'q') {
break;
}
free(kbd);
}
w_mouse_t * mouse = poll_mouse();
if (mouse != NULL) {
if (mouse->buttons & MOUSE_BUTTON_LEFT) {
if (mouse->old_x >= 0 && mouse->new_x >= 0 && mouse->old_y >= 0 && mouse->new_y >= 0 &&
mouse->old_x < width && mouse->new_x < width && mouse->old_y < width && mouse->new_y < width) {
draw_line(mouse->old_x, mouse->new_x, mouse->old_y, mouse->new_y, rgb(255,0,0));
}
}
free(mouse);
}
syscall_yield();
}
teardown_windowing();
return 0;
}

View File

@ -8,40 +8,7 @@
#include "lib/window.h" #include "lib/window.h"
#include "lib/graphics.h" #include "lib/graphics.h"
#include "lib/pthread.h"
DEFN_SYSCALL3(clone, 30, uintptr_t, uintptr_t, void *);
DEFN_SYSCALL0(gettid, 41);
int clone(uintptr_t,uintptr_t,void*) __attribute__((alias("syscall_clone")));
int gettid() __attribute__((alias("syscall_gettid")));
typedef struct {
uint32_t id;
char * stack;
void * ret_val;
} pthread_t;
typedef unsigned int pthread_attr_t;
#define PTHREAD_STACK_SIZE 10240
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg) {
char * stack = malloc(PTHREAD_STACK_SIZE);
uintptr_t stack_top = (uintptr_t)stack + PTHREAD_STACK_SIZE;
thread->stack = stack;
thread->id = clone(stack_top, (uintptr_t)start_routine, arg);
return 0;
}
void pthread_exit(void * value) {
/* Perform nice cleanup */
#if 0
/* XXX: LOCK */
free(stack);
/* XXX: Return value!? */
#endif
__asm__ ("jmp 0xFFFFB00F"); /* Force thread exit */
}
sprite_t * sprites[128]; sprite_t * sprites[128];
sprite_t alpha_tmp; sprite_t alpha_tmp;

30
userspace/lib/pthread.c Normal file
View File

@ -0,0 +1,30 @@
#include <stdlib.h>
#include <stdint.h>
#include "pthread.h"
DEFN_SYSCALL3(clone, 30, uintptr_t, uintptr_t, void *);
DEFN_SYSCALL0(gettid, 41);
#define PTHREAD_STACK_SIZE 10240
int clone(uintptr_t,uintptr_t,void*) __attribute__((alias("syscall_clone")));
int gettid() __attribute__((alias("syscall_gettid")));
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg) {
char * stack = malloc(PTHREAD_STACK_SIZE);
uintptr_t stack_top = (uintptr_t)stack + PTHREAD_STACK_SIZE;
thread->stack = stack;
thread->id = clone(stack_top, (uintptr_t)start_routine, arg);
return 0;
}
void pthread_exit(void * value) {
/* Perform nice cleanup */
#if 0
/* XXX: LOCK */
free(stack);
/* XXX: Return value!? */
#endif
__asm__ ("jmp 0xFFFFB00F"); /* Force thread exit */
}

23
userspace/lib/pthread.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef PTHREAD_H
#define PTHREAD_H
#include <stdint.h>
#include <syscall.h>
DECL_SYSCALL3(clone, uintptr_t, uintptr_t, void *);
DECL_SYSCALL0(gettid);
typedef struct {
uint32_t id;
char * stack;
void * ret_val;
} pthread_t;
typedef unsigned int pthread_attr_t;
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg);
void pthread_exit(void * value);
int clone(uintptr_t,uintptr_t,void*);
int gettid();
#endif

View File

@ -14,6 +14,7 @@
#include "../../kernel/include/signal.h" #include "../../kernel/include/signal.h"
#include "window.h" #include "window.h"
#include "pthread.h"
FILE *fdopen(int fildes, const char *mode); FILE *fdopen(int fildes, const char *mode);
@ -368,15 +369,15 @@ uint8_t volatile mouse_evt_buffer_lock;
list_t * mouse_evt_buffer; list_t * mouse_evt_buffer;
w_mouse_t * poll_mouse () { w_mouse_t * poll_mouse () {
w_mouse_t * evt; w_mouse_t * evt = NULL;
LOCK(mouse_evt_buffer_lock); //LOCK(mouse_evt_buffer_lock);
if (mouse_evt_buffer->length > 0) { if (mouse_evt_buffer->length > 0) {
node_t * n = list_dequeue(mouse_evt_buffer); node_t * n = list_dequeue(mouse_evt_buffer);
evt = (w_mouse_t *)n->value; evt = (w_mouse_t *)n->value;
free(n); free(n);
} }
UNLOCK(mouse_evt_buffer_lock); //UNLOCK(mouse_evt_buffer_lock);
return evt; return evt;
} }
@ -384,6 +385,11 @@ w_mouse_t * poll_mouse () {
static void process_mouse_evt (uint8_t command, w_mouse_t * evt) { static void process_mouse_evt (uint8_t command, w_mouse_t * evt) {
/* Push the event onto a buffer for the process to poll */ /* Push the event onto a buffer for the process to poll */
//LOCK(mouse_evt_buffer_lock); //LOCK(mouse_evt_buffer_lock);
if (mouse_evt_buffer->length > 5000) {
node_t * n = list_dequeue(mouse_evt_buffer);
free(n->value);
free(n);
}
list_insert(mouse_evt_buffer, evt); list_insert(mouse_evt_buffer, evt);
//UNLOCK(mouse_evt_buffer_lock); //UNLOCK(mouse_evt_buffer_lock);
} }
@ -430,7 +436,7 @@ static void process_evt (int sig) {
switch (header.command_type & WE_GROUP_MASK) { switch (header.command_type & WE_GROUP_MASK) {
case WE_MOUSE_EVT: { case WE_MOUSE_EVT: {
w_mouse_t * mevt = malloc(sizeof(w_mouse_t)); w_mouse_t * mevt = malloc(sizeof(w_mouse_t));
read(process_windows->event_pipe, &mevt, sizeof(w_mouse_t)); read(process_windows->event_pipe, mevt, sizeof(w_mouse_t));
process_mouse_evt(header.command_type, mevt); process_mouse_evt(header.command_type, mevt);
break; break;
} }
@ -469,6 +475,23 @@ void install_signal_handlers () {
mouse_evt_buffer = list_create(); mouse_evt_buffer = list_create();
} }
static void ignore(int sig) {
return;
}
void * win_threaded_event_processor(void * garbage) {
while (1) {
process_evt (0);
syscall_yield();
}
}
void win_use_threaded_handler() {
syscall_sys_signal(SIGWINEVENT, (uintptr_t)ignore); // SIGWINEVENT
pthread_t event_thread;
pthread_create(&event_thread, NULL, win_threaded_event_processor, NULL);
}
/* Initial Connection */ /* Initial Connection */

View File

@ -181,5 +181,6 @@ void window_fill(window_t *window, uint32_t color);
void init_graphics_window(window_t * window); void init_graphics_window(window_t * window);
void init_graphics_window_double_buffer(window_t * window); void init_graphics_window_double_buffer(window_t * window);
void win_use_threaded_handler();
#endif #endif

View File

@ -22,6 +22,7 @@
#include "lib/graphics.h" #include "lib/graphics.h"
#include "lib/window.h" #include "lib/window.h"
#include "lib/decorations.h" #include "lib/decorations.h"
#include "lib/pthread.h"
#define FONT_SIZE 13 #define FONT_SIZE 13
@ -487,40 +488,6 @@ DEFN_SYSCALL0(mousedevice, 33);
DECL_SYSCALL2(dup2, int, int); DECL_SYSCALL2(dup2, int, int);
DECL_SYSCALL0(mkpipe); DECL_SYSCALL0(mkpipe);
DEFN_SYSCALL3(clone, 30, uintptr_t, uintptr_t, void *);
DEFN_SYSCALL0(gettid, 41);
int clone(uintptr_t,uintptr_t,void*) __attribute__((alias("syscall_clone")));
int gettid() __attribute__((alias("syscall_gettid")));
typedef struct {
uint32_t id;
char * stack;
void * ret_val;
} pthread_t;
typedef unsigned int pthread_attr_t;
#define PTHREAD_STACK_SIZE 10240
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void *(*start_routine)(void *), void * arg) {
char * stack = malloc(PTHREAD_STACK_SIZE);
uintptr_t stack_top = (uintptr_t)stack + PTHREAD_STACK_SIZE;
thread->stack = stack;
thread->id = clone(stack_top, (uintptr_t)start_routine, arg);
return 0;
}
void pthread_exit(void * value) {
/* Perform nice cleanup */
#if 0
/* XXX: LOCK */
free(stack);
/* XXX: Return value!? */
#endif
__asm__ ("jmp 0xFFFFB00F"); /* Force thread exit */
}
uint16_t term_width = 0; uint16_t term_width = 0;
uint16_t term_height = 0; uint16_t term_height = 0;
uint16_t char_width = 8; uint16_t char_width = 8;