summaryrefslogtreecommitdiff
path: root/amiga
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2014-11-21 23:46:22 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2014-11-22 16:27:39 +0000
commitf8d8d218d8d5f7fdeb2edc0c5fa3f0a22e6d5a1b (patch)
tree5b4ccabe8e5fc2bf128f89509fe000da45a56e6a /amiga
parentfe567952057e820b040371be639842fcb2317bf2 (diff)
downloadnetsurf-f8d8d218d8d5f7fdeb2edc0c5fa3f0a22e6d5a1b.tar.gz
netsurf-f8d8d218d8d5f7fdeb2edc0c5fa3f0a22e6d5a1b.tar.bz2
Initial steps for a scheduler process
Diffstat (limited to 'amiga')
-rw-r--r--amiga/gui.c7
-rwxr-xr-xamiga/schedule.c133
-rwxr-xr-xamiga/schedule.h27
3 files changed, 129 insertions, 38 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index e76a01e66..0f5210179 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -2689,12 +2689,11 @@ void ami_get_msg(void)
{
ULONG winsignal = 1L << sport->mp_SigBit;
ULONG appsig = 1L << appport->mp_SigBit;
- ULONG schedulesig = 1L << msgport->mp_SigBit;
+ ULONG schedulesig = 1L << schedulermsgport->mp_SigBit; /* \todo create schedulermsgport */
ULONG ctrlcsig = SIGBREAKF_CTRL_C;
uint32 signal = 0;
fd_set read_fd_set, write_fd_set, except_fd_set;
int max_fd = -1;
- struct TimerRequest *timermsg = NULL;
struct MsgPort *printmsgport = ami_print_get_msgport();
ULONG printsig = 0;
ULONG helpsignal = ami_help_signal();
@@ -2742,8 +2741,8 @@ void ami_get_msg(void)
ami_print_cont();
}
- if(signal & schedulesig) {
- if((timermsg = (struct TimerRequest *)GetMsg(msgport))) {
+ if(signal & schedulesig) { /* \todo rewrite */
+ while((timermsg = (struct TimerRequest *)GetMsg(msgport))) {
ReplyMsg((struct Message *)timermsg);
schedule_run();
}
diff --git a/amiga/schedule.c b/amiga/schedule.c
index 6f2037d7e..fa6de688d 100755
--- a/amiga/schedule.c
+++ b/amiga/schedule.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008, 2011 Chris Young <chris@unsatisfactorysoftware.co.uk>
+ * Copyright 2008 - 2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -29,6 +29,10 @@
#include "amiga/schedule.h"
+static struct TimeRequest *tioreq;
+struct Device *TimerBase;
+struct TimerIFace *ITimer;
+
struct nscallback
{
struct TimeVal tv;
@@ -37,6 +41,18 @@ struct nscallback
struct TimeRequest *treq;
};
+struct ami_schedule_message {
+ struct Message msg;
+ int type;
+ struct nscallback *nscb;
+}
+
+enum {
+ AMI_S_SCHEDULE = 0,
+ AMI_S_STARTUP,
+ AMI_S_EXIT
+};
+
static PblHeap *schedule_list;
/**
@@ -219,9 +235,9 @@ void schedule_run(void)
callback(p);
}
-static void ami_schedule_open_timer(void)
+static struct MsgPort *ami_schedule_open_timer(void)
{
- msgport = AllocSysObjectTags(ASOT_PORT,
+ struct MsgPort *msgport = AllocSysObjectTags(ASOT_PORT,
ASO_NoTrack,FALSE,
TAG_DONE);
@@ -235,36 +251,45 @@ static void ami_schedule_open_timer(void)
TimerBase = (struct Device *)tioreq->Request.io_Device;
ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase,"main",1,NULL);
+
+ return msgport;
}
-static void ami_schedule_close_timer(void)
+static void ami_schedule_close_timer(struct MsgPort *msgport)
{
if(ITimer) DropInterface((struct Interface *)ITimer);
CloseDevice((struct IORequest *) tioreq);
- FreeSysObject(ASOT_IOREQUEST,tioreq);
- FreeSysObject(ASOT_PORT,msgport);
+ FreeSysObject(ASOT_IOREQUEST, tioreq);
+ FreeSysObject(ASOT_PORT, msgport);
}
-/* exported function documented in amiga/schedule.h */
-bool ami_schedule_create(void)
+/**
+ * Initialise amiga scheduler
+ *
+ * /return true if initialised ok or false on error.
+ */
+struct MsgPort *ami_schedule_create(void)
{
- ami_schedule_open_timer();
+ struct MsgPort *msgport = ami_schedule_open_timer();
schedule_list = pblHeapNew();
- if(schedule_list == PBL_ERROR_OUT_OF_MEMORY) return false;
+ if(schedule_list == PBL_ERROR_OUT_OF_MEMORY) return NULL;
pblHeapSetCompareFunction(schedule_list, ami_schedule_compare);
- return true;
+ return msgport;
}
-/* exported function documented in amiga/schedule.h */
-void ami_schedule_free(void)
+/**
+ * Finalise amiga scheduler
+ *
+ */
+void ami_schedule_free(struct MsgPort *msgport)
{
schedule_remove_all();
pblHeapFree(schedule_list); // this should be empty at this point
schedule_list = NULL;
- ami_schedule_close_timer();
+ ami_schedule_close_timer(msgport);
}
/* exported function documented in amiga/schedule.h */
@@ -293,3 +318,83 @@ nserror ami_schedule(int t, void (*callback)(void *p), void *p)
return NSERROR_OK;
}
+
+
+static int32 ami_scheduler_process(STRPTR args, int32 length, APTR execbase)
+{
+ struct Process *proc = (struct Process *)FindTask(NULL);
+ struct MsgPort *nsmsgport = proc->pr_Task.tc_UserData;
+ struct MsgPort *schedulermsgport = IExec->AllocSysObjectTags(ASOT_PORT, TAG_END);
+ struct MsgPort *timermsgport = ami_schedule_create();
+ bool running = true;
+ struct TimerRequest *timermsg = NULL;
+ struct ami_schedule_message *schedulemsg = NULL;
+ ULONG schedulesig = 1L << schedulermsgport->mp_SigBit;
+ ULONG timersig = 1L << timermsgport->mp_SigBit;
+ uint32 signalmask = schedulesig | timersig;
+ uint32 signal = 0;
+
+ /* Send a startup message to the message port we were given when we were created.
+ * This tells NetSurf where to send scheduler events to. */
+
+ struct ami_schedule_message *asmsg = IExec->AllocSysObjectTags(ASOT_MESSAGE,
+ ASOMSG_Size, sizeof(struct ami_schedule_message),
+ ASOMSG_ReplyPort, schedulermsgport,
+ TAG_END);
+
+ asmsg.type = AMI_S_STARTUP;
+ PutMsg(nsmsgport, asmsg);
+
+ /* Main loop for this process */
+
+ while(running) {
+ signal = Wait(signalmask);
+
+ if(signal & timersig) {
+ while((timermsg = (struct TimerRequest *)GetMsg(timermsgport))) {
+ schedule_run(); /* \todo get top scheduled event and signal nsmsgport to run the callback */
+ ReplyMsg((struct Message *)timermsg);
+ }
+ }
+
+ if(signal & schedulesig) {
+ while((asmsg = (struct ami_schedule_message *)GetMsg(schedulermsgport))) {
+ /* \todo if it's a reply, free stuff
+ if(asmsg->nscb) FreeVec(asmg->nscb);
+ FreeSysObject(ASOT_Message, asmsg);
+ */
+ //ReplyMsg((struct Message *)asmsg);
+ }
+ }
+ }
+
+ ami_schedule_free(timermsgport);
+
+ return RETURN_OK;
+}
+
+
+/**
+ * Create a new process for the scheduler.
+ *
+ * \param nsmsgport Message port to send scheduler events to.
+ * \return NSERROR_OK on success or error code on faliure.
+ */
+nserror ami_scheduler_process_create(struct MsgPort *nsmsgport)
+{
+ struct Process *proc = CreateNewProcTags(
+ NP_Name, "NetSurf scheduler",
+ NP_Entry, ami_schedule_process,
+ NP_Child, TRUE,
+ NP_StackSize, 16384,
+ NP_Priority, 1,
+ NP_UserData, nsmsgport,
+ TAG_DONE);
+
+ if(proc == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ return NSERROR_OK;
+}
+
diff --git a/amiga/schedule.h b/amiga/schedule.h
index 9fcec9a82..70255a96e 100755
--- a/amiga/schedule.h
+++ b/amiga/schedule.h
@@ -18,15 +18,8 @@
#ifndef AMIGA_SCHEDULE_H
#define AMIGA_SCHEDULE_H
-#include <proto/timer.h>
#include "amiga/os3support.h"
-struct Device *TimerBase;
-struct TimerIFace *ITimer;
-
-struct TimeRequest *tioreq;
-struct MsgPort *msgport;
-
/**
* Schedule a callback.
*
@@ -41,19 +34,6 @@ struct MsgPort *msgport;
nserror ami_schedule(int t, void (*callback)(void *p), void *p);
/**
- * Initialise amiga scheduler
- *
- * /return true if initialised ok or false on error.
- */
-bool ami_schedule_create(void);
-
-/**
- * Finalise amiga scheduler
- *
- */
-void ami_schedule_free(void);
-
-/**
* Process events up to current time.
*
* This implementation only takes the top entry off the heap, it does not
@@ -62,5 +42,12 @@ void ami_schedule_free(void);
*/
void schedule_run(void);
+/**
+ * Create a new process for the scheduler.
+ *
+ * \param nsmsgport Message port to send timer events to.
+ * \return NSERROR_OK on success or error code on faliure.
+ */
+nserror ami_scheduler_process_create(struct MsgPort *nsmsgport);
#endif