netsurf: branch master updated. release/3.3-614-g0cc19b1
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/0cc19b10fcd9f43bb4c9d...
...commit http://git.netsurf-browser.org/netsurf.git/commit/0cc19b10fcd9f43bb4c9d83...
...tree http://git.netsurf-browser.org/netsurf.git/tree/0cc19b10fcd9f43bb4c9d8365...
The branch, master has been updated
via 0cc19b10fcd9f43bb4c9d83654d2d07cad139b12 (commit)
from 7efd9a2c676605aacdf58f7a8a531f0032502b51 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=0cc19b10fcd9f43bb4c...
commit 0cc19b10fcd9f43bb4c9d83654d2d07cad139b12
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
alloc bitmap structures using itempools
diff --git a/amiga/bitmap.c b/amiga/bitmap.c
index 6984d3e..5ba7402 100644
--- a/amiga/bitmap.c
+++ b/amiga/bitmap.c
@@ -44,21 +44,28 @@
#include "amiga/misc.h"
#include "amiga/rtg.h"
+static APTR pool_bitmap = NULL;
+
/* exported function documented in amiga/bitmap.h */
void *amiga_bitmap_create(int width, int height, unsigned int state)
{
struct bitmap *bitmap;
-
- bitmap = ami_misc_allocvec_clear(sizeof(struct bitmap), 0);
- if(bitmap)
- {
- bitmap->pixdata = ami_misc_allocvec_clear(width*height*4, 0xff);
- bitmap->width = width;
- bitmap->height = height;
- if(state & BITMAP_OPAQUE) bitmap->opaque = true;
- else bitmap->opaque = false;
- }
+ bitmap = ami_misc_itempool_alloc(pool_bitmap, sizeof(struct bitmap));
+ if(bitmap == NULL) return NULL;
+
+ bitmap->pixdata = ami_misc_allocvec_clear(width*height*4, 0xff);
+ bitmap->width = width;
+ bitmap->height = height;
+
+ if(state & BITMAP_OPAQUE) bitmap->opaque = true;
+ else bitmap->opaque = false;
+
+ bitmap->nativebm = NULL;
+ bitmap->nativebmwidth = 0;
+ bitmap->nativebmheight = 0;
+ bitmap->native_mask = NULL;
+ bitmap->dto = NULL;
return bitmap;
}
@@ -109,7 +116,7 @@ void amiga_bitmap_destroy(void *bitmap)
bm->native_mask = NULL;
bm->dto = NULL;
- FreeVec(bm);
+ ami_misc_itempool_free(pool_bitmap, bm, sizeof(struct bitmap));
bm = NULL;
}
}
@@ -582,6 +589,20 @@ static nserror bitmap_render(struct bitmap *bitmap, hlcache_handle *content)
return NSERROR_OK;
}
+void amiga_bitmap_fini(void)
+{
+ if(pool_bitmap) ami_misc_itempool_delete(pool_bitmap);
+}
+
+bool amiga_bitmap_init(void)
+{
+ if((pool_bitmap = ami_misc_itempool_create(sizeof(struct bitmap)))) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
static struct gui_bitmap_table bitmap_table = {
.create = amiga_bitmap_create,
.destroy = amiga_bitmap_destroy,
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index ff1b01c..4607d9f 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -53,6 +53,9 @@ PLANEPTR ami_bitmap_get_mask(struct bitmap *bitmap, int width,
Object *ami_datatype_object_from_bitmap(struct bitmap *bitmap);
struct bitmap *ami_bitmap_from_datatype(char *filename);
+void amiga_bitmap_fini(void);
+bool amiga_bitmap_init(void);
+
#ifndef __amigaos4__
void ami_bitmap_argb_to_rgba(struct bitmap *bm);
#endif
diff --git a/amiga/gui.c b/amiga/gui.c
index 58e7938..9aedad8 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -405,8 +405,21 @@ bool ami_locate_resource(char *fullpath, const char *file)
return found;
}
+/* Frees stuff opened by ami_open_resources() */
+static void ami_resources_free(void)
+{
+ FreeSysObject(ASOT_PORT, appport);
+ FreeSysObject(ASOT_PORT, sport);
+ FreeSysObject(ASOT_PORT, schedulermsgport);
+
+ FreeStringClass(urlStringClass);
+ amiga_bitmap_fini();
+}
+
static bool ami_open_resources(void)
{
+ if(!amiga_bitmap_init()) return false;
+
urlStringClass = MakeStringClass();
if(!(appport = AllocSysObjectTags(ASOT_PORT,
@@ -3034,13 +3047,10 @@ static void gui_quit(void)
LOG("Freeing scheduler resources");
ami_schedule_free();
- FreeSysObject(ASOT_PORT, appport);
- FreeSysObject(ASOT_PORT, sport);
- FreeSysObject(ASOT_PORT, schedulermsgport);
+ ami_resources_free();
ami_file_req_free();
ami_openurl_close();
- FreeStringClass(urlStringClass);
FreeObjList(window_list);
-----------------------------------------------------------------------
Summary of changes:
amiga/bitmap.c | 43 ++++++++++++++++++++++++++++++++-----------
amiga/bitmap.h | 3 +++
amiga/gui.c | 18 ++++++++++++++----
3 files changed, 49 insertions(+), 15 deletions(-)
diff --git a/amiga/bitmap.c b/amiga/bitmap.c
index 6984d3e..5ba7402 100644
--- a/amiga/bitmap.c
+++ b/amiga/bitmap.c
@@ -44,21 +44,28 @@
#include "amiga/misc.h"
#include "amiga/rtg.h"
+static APTR pool_bitmap = NULL;
+
/* exported function documented in amiga/bitmap.h */
void *amiga_bitmap_create(int width, int height, unsigned int state)
{
struct bitmap *bitmap;
-
- bitmap = ami_misc_allocvec_clear(sizeof(struct bitmap), 0);
- if(bitmap)
- {
- bitmap->pixdata = ami_misc_allocvec_clear(width*height*4, 0xff);
- bitmap->width = width;
- bitmap->height = height;
- if(state & BITMAP_OPAQUE) bitmap->opaque = true;
- else bitmap->opaque = false;
- }
+ bitmap = ami_misc_itempool_alloc(pool_bitmap, sizeof(struct bitmap));
+ if(bitmap == NULL) return NULL;
+
+ bitmap->pixdata = ami_misc_allocvec_clear(width*height*4, 0xff);
+ bitmap->width = width;
+ bitmap->height = height;
+
+ if(state & BITMAP_OPAQUE) bitmap->opaque = true;
+ else bitmap->opaque = false;
+
+ bitmap->nativebm = NULL;
+ bitmap->nativebmwidth = 0;
+ bitmap->nativebmheight = 0;
+ bitmap->native_mask = NULL;
+ bitmap->dto = NULL;
return bitmap;
}
@@ -109,7 +116,7 @@ void amiga_bitmap_destroy(void *bitmap)
bm->native_mask = NULL;
bm->dto = NULL;
- FreeVec(bm);
+ ami_misc_itempool_free(pool_bitmap, bm, sizeof(struct bitmap));
bm = NULL;
}
}
@@ -582,6 +589,20 @@ static nserror bitmap_render(struct bitmap *bitmap, hlcache_handle *content)
return NSERROR_OK;
}
+void amiga_bitmap_fini(void)
+{
+ if(pool_bitmap) ami_misc_itempool_delete(pool_bitmap);
+}
+
+bool amiga_bitmap_init(void)
+{
+ if((pool_bitmap = ami_misc_itempool_create(sizeof(struct bitmap)))) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
static struct gui_bitmap_table bitmap_table = {
.create = amiga_bitmap_create,
.destroy = amiga_bitmap_destroy,
diff --git a/amiga/bitmap.h b/amiga/bitmap.h
index ff1b01c..4607d9f 100755
--- a/amiga/bitmap.h
+++ b/amiga/bitmap.h
@@ -53,6 +53,9 @@ PLANEPTR ami_bitmap_get_mask(struct bitmap *bitmap, int width,
Object *ami_datatype_object_from_bitmap(struct bitmap *bitmap);
struct bitmap *ami_bitmap_from_datatype(char *filename);
+void amiga_bitmap_fini(void);
+bool amiga_bitmap_init(void);
+
#ifndef __amigaos4__
void ami_bitmap_argb_to_rgba(struct bitmap *bm);
#endif
diff --git a/amiga/gui.c b/amiga/gui.c
index 58e7938..9aedad8 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -405,8 +405,21 @@ bool ami_locate_resource(char *fullpath, const char *file)
return found;
}
+/* Frees stuff opened by ami_open_resources() */
+static void ami_resources_free(void)
+{
+ FreeSysObject(ASOT_PORT, appport);
+ FreeSysObject(ASOT_PORT, sport);
+ FreeSysObject(ASOT_PORT, schedulermsgport);
+
+ FreeStringClass(urlStringClass);
+ amiga_bitmap_fini();
+}
+
static bool ami_open_resources(void)
{
+ if(!amiga_bitmap_init()) return false;
+
urlStringClass = MakeStringClass();
if(!(appport = AllocSysObjectTags(ASOT_PORT,
@@ -3034,13 +3047,10 @@ static void gui_quit(void)
LOG("Freeing scheduler resources");
ami_schedule_free();
- FreeSysObject(ASOT_PORT, appport);
- FreeSysObject(ASOT_PORT, sport);
- FreeSysObject(ASOT_PORT, schedulermsgport);
+ ami_resources_free();
ami_file_req_free();
ami_openurl_close();
- FreeStringClass(urlStringClass);
FreeObjList(window_list);
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-613-g7efd9a2
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/7efd9a2c676605aacdf58...
...commit http://git.netsurf-browser.org/netsurf.git/commit/7efd9a2c676605aacdf58f7...
...tree http://git.netsurf-browser.org/netsurf.git/tree/7efd9a2c676605aacdf58f7a8...
The branch, master has been updated
via 7efd9a2c676605aacdf58f7a8a531f0032502b51 (commit)
via 7da516067d29117ed74a102db43bb8ab4fd8316d (commit)
from d9e92d2032f2b24abe665ca02499277f540a8021 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=7efd9a2c676605aacdf...
commit 7efd9a2c676605aacdf58f7a8a531f0032502b51
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Remove unused Amiga async scheduler
diff --git a/amiga/fs_backing_store.c b/amiga/fs_backing_store.c
deleted file mode 100644
index 9e7672e..0000000
--- a/amiga/fs_backing_store.c
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright 2014 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <proto/dos.h>
-#include <proto/exec.h>
-
-#include "content/fs_backing_store.c"
-
-#ifdef AMIGA_NS_ASYNC
-struct ami_bsm_store {
- nsurl *url;
- enum backing_store_flags flags;
- uint8_t *data;
- size_t datalen;
-};
-
-struct ami_bsm_fetch {
- nsurl *url;
- enum backing_store_flags bsflags;
- uint8_t **data_out;
- size_t *datalen_out;
-};
-
-struct ami_bsm_invalidate {
- nsurl *url;
-};
-
-struct ami_bsm_release {
- nsurl *url;
- enum backing_store_flags bsflags;
-};
-
-struct ami_backing_store {
- struct MsgPort *msgport;
- struct llcache_store_parameters *parameters;
-};
-
-struct ami_backing_store_msg {
- struct Message msg;
- int type;
- nserror error;
- void *data;
-};
-
-enum {
- AMI_BSM_STARTUP = 0,
- AMI_BSM_STORE,
- AMI_BSM_FETCH,
- AMI_BSM_INVALIDATE,
- AMI_BSM_RELEASE,
- AMI_BSM_FINALISE
-};
-
-struct MsgPort *cachemsgport = NULL;
-
-static int32 ami_backing_store_process(STRPTR args, int32 length, APTR execbase)
-{
- struct Process *proc = (struct Process *)FindTask(NULL);
- struct ami_backing_store *abs = proc->pr_Task.tc_UserData;
- struct MsgPort *nsmsgport = abs->msgport;
- struct MsgPort *backingstoremsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- bool running = true;
-
- nserror error = filesystem_llcache_table->initialise(abs->parameters);
-
- /* Send a startup message to the message port we were given when we were created.
- * This tells NetSurf where to send disk cache messages to, as well as informing
- * that we are running.
- */
-
- struct ami_backing_store_msg *absmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_backing_store_msg),
- ASOMSG_ReplyPort, backingstoremsgport,
- TAG_END);
-
- absmsg->type = AMI_BSM_STARTUP;
- absmsg->error = error;
-
- PutMsg(nsmsgport, (struct Message *)absmsg);
-
- /* Main loop for this process */
-
- while(running) {
- WaitPort(backingstoremsgport);
-
- while((absmsg = (struct ami_backing_store_msg *)GetMsg(backingstoremsgport))) {
- if(absmsg->msg.mn_Node.ln_Type == NT_REPLYMSG) {
- /* if it's a reply, free stuff */
- FreeSysObject(ASOT_MESSAGE, absmsg);
- } else {
- if(running) {
- switch(absmsg->type) {
- case AMI_BSM_STORE:
- {
- struct ami_bsm_store *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->store(absm->url, absm->flags, absm->data, absm->datalen);
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- }
- break;
-
- case AMI_BSM_FETCH:
- {
- struct ami_bsm_fetch *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->fetch(absm->url, absm->bsflags, absm->data_out, absm->datalen_out);
- ReplyMsg((struct Message *)absmsg); /* need to reply to this one */
- }
- break;
-
- case AMI_BSM_INVALIDATE:
- {
- struct ami_bsm_invalidate *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->invalidate(absm->url);
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- }
- break;
-
- case AMI_BSM_RELEASE:
- {
- struct ami_bsm_release *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->release(absm->url, absm->bsflags);
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- }
- break;
-
- case AMI_BSM_FINALISE:
- running = false;
- absmsg->error = filesystem_llcache_table->finalise();
- ReplyMsg((struct Message *)absmsg); /* need to reply to this one */
- break;
-
- default:
- // unknown message
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- break;
- }
- }
- }
- }
- }
-
- FreeSysObject(ASOT_PORT, backingstoremsgport);
-
- return RETURN_OK;
-}
-
-static nserror ami_backing_store_send_reply(int type, void *data, struct MsgPort *msgport)
-{
- if(cachemsgport == NULL) return NSERROR_INIT_FAILED;
-
- struct ami_backing_store_msg *absmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_backing_store_msg),
- ASOMSG_ReplyPort, msgport,
- TAG_END);
-
- absmsg->type = type;
- absmsg->data = data;
-
- PutMsg(cachemsgport, (struct Message *)absmsg);
-
- return NSERROR_OK;
-}
-
-static nserror ami_backing_store_send(int type, void *data)
-{
- return ami_backing_store_send_reply(type, data, NULL);
-}
-
-/**
- * Place an object in the backing store.
- *
- * @param url The url is used as the unique primary key for the data.
- * @param flags The flags to control how the object is stored.
- * @param data The objects source data.
- * @param datalen The length of the \a data.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror
-ami_backing_store_store(nsurl *url,
- enum backing_store_flags flags,
- uint8_t *data,
- const size_t datalen)
-{
- struct ami_bsm_store *absm =
- AllocVecTagList(sizeof(struct ami_bsm_store), NULL);
-
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
- absm->flags = flags;
- absm->data = data;
- absm->datalen = datalen;
-
- return ami_backing_store_send(AMI_BSM_STORE, absm);
-}
-
-/**
- * Retrive an object from the backing store.
- *
- * @param[in] url The url is used as the unique primary key for the data.
- * @param[in] bsflags The flags to control how the object is retrieved.
- * @param[out] data_out The objects data.
- * @param[out] datalen_out The length of the \a data retrieved.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror ami_backing_store_fetch(nsurl *url,
- enum backing_store_flags bsflags,
- uint8_t **data_out,
- size_t *datalen_out)
-{
- struct MsgPort *tempmsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- if(tempmsgport == NULL) return NSERROR_NOMEM;
-
- struct ami_bsm_fetch *absm =
- AllocVecTagList(sizeof(struct ami_bsm_fetch), NULL);
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
- absm->bsflags = bsflags;
- absm->data_out = data_out;
- absm->datalen_out = datalen_out;
-
- nserror error = ami_backing_store_send_reply(AMI_BSM_FETCH, absm, tempmsgport);
- if(error != NSERROR_OK) return error;
-
- WaitPort(tempmsgport);
-
- struct ami_backing_store_msg *absmsg = (struct ami_backing_store_msg *)GetMsg(tempmsgport);
- error = absmsg->error;
-
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg);
- FreeSysObject(ASOT_PORT, tempmsgport);
-
- return error;
-}
-
-
-/**
- * release a previously fetched or stored memory object.
- *
- * @param[in] url The url is used as the unique primary key to invalidate.
- * @param[in] bsflags The flags to control how the object data is released.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror ami_backing_store_release(nsurl *url, enum backing_store_flags bsflags)
-{
- struct ami_bsm_release *absm =
- AllocVecTagList(sizeof(struct ami_bsm_release), NULL);
-
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
- absm->bsflags = bsflags;
-
- return ami_backing_store_send(AMI_BSM_RELEASE, absm);
-}
-
-/**
- * Invalidate a source object from the backing store.
- *
- * The entry (if present in the backing store) must no longer
- * be returned as a result to the fetch or meta operations.
- *
- * @param url The url is used as the unique primary key to invalidate.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror ami_backing_store_invalidate(nsurl *url)
-{
- struct ami_bsm_store *absm =
- AllocVecTagList(sizeof(struct ami_bsm_invalidate), NULL);
-
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
-
- return ami_backing_store_send(AMI_BSM_INVALIDATE, absm);
-}
-
-/**
- * Finalise the backing store.
- *
- * \todo This will cause the backing store to leak any outstanding memory
- * allocations. This will probably best be done by a global use count.
- *
- * @return NSERROR_OK on success.
- */
-static nserror ami_backing_store_finalise(void)
-{
- struct MsgPort *tempmsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- if(tempmsgport == NULL) return NSERROR_NOMEM;
-
- nserror error = ami_backing_store_send_reply(AMI_BSM_FINALISE, NULL, tempmsgport);
- if(error != NSERROR_OK) return error;
-
- LOG("Waiting for backing store process to exit...");
-
- WaitPort(tempmsgport);
-
- struct ami_backing_store_msg *absmsg = (struct ami_backing_store_msg *)GetMsg(tempmsgport);
- error = absmsg->error;
-
- FreeSysObject(ASOT_MESSAGE, absmsg);
- FreeSysObject(ASOT_PORT, tempmsgport);
- cachemsgport = NULL;
-
- return error;
-}
-
-
-/**
- * Initialise the backing store.
- *
- * @param parameters to configure backing store.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror
-ami_backing_store_initialise(const struct llcache_store_parameters *parameters)
-{
- struct MsgPort *tempmsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- struct ami_backing_store *abs =
- AllocVecTagList(sizeof(struct ami_backing_store), NULL);
- if(abs == NULL) return NSERROR_NOMEM;
-
- abs->msgport = tempmsgport;
- abs->parameters = (struct llcache_store_parameters *)parameters;
-
- struct Process *proc = CreateNewProcTags(
- NP_Name, "NetSurf backing store",
- NP_Entry, ami_backing_store_process,
- NP_Child, TRUE,
- NP_StackSize, 16384,
- NP_Priority, -1,
- NP_UserData, abs,
- TAG_DONE);
-
- if(proc == NULL) {
- return NSERROR_NOMEM;
- }
-
- LOG("Waiting for backing store process to start up...");
-
- WaitPort(tempmsgport);
-
- struct ami_backing_store_msg *msg = (struct ami_backing_store_msg *)GetMsg(tempmsgport);
- cachemsgport = msg->msg.mn_ReplyPort;
- nserror error = msg->error;
- ReplyMsg((struct Message *)msg);
- FreeSysObject(ASOT_PORT, tempmsgport);
-
- LOG("Backing store process started. Error code: %d", error);
-
- return error;
-}
-#endif
-
-static struct gui_llcache_table amiga_llcache_table = {
-#ifndef AMIGA_NS_ASYNC
- .initialise = initialise,
- .finalise = finalise,
- .store = store,
- .fetch = fetch,
- .invalidate = invalidate,
- .release = release,
-#else
- .initialise = ami_backing_store_initialise,
- .finalise = ami_backing_store_finalise,
- .store = ami_backing_store_store,
- .fetch = ami_backing_store_fetch,
- .invalidate = ami_backing_store_invalidate,
- .release = ami_backing_store_release,
-#endif
-};
-
-struct gui_llcache_table *amiga_filesystem_llcache_table = &amiga_llcache_table;
-
diff --git a/amiga/fs_backing_store.h b/amiga/fs_backing_store.h
deleted file mode 100644
index 45aa395..0000000
--- a/amiga/fs_backing_store.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef AMIGA_FS_BACKING_STORE_H
-#define AMIGA_FS_BACKING_STORE_H
-extern struct gui_llcache_table *amiga_filesystem_llcache_table;
-extern struct gui_llcache_table *filesystem_llcache_table;
-#endif
-
diff --git a/amiga/gui.c b/amiga/gui.c
index 09fc36b..58e7938 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -95,6 +95,7 @@
#include "utils/utils.h"
#include "utils/nsurl.h"
#include "utils/file.h"
+#include "content/backing_store.h"
#include "content/fetchers.h"
#include "content/fetchers/resource.h"
#include "content/urldb.h"
@@ -127,7 +128,6 @@
#include "amiga/file.h"
#include "amiga/filetype.h"
#include "amiga/font.h"
-#include "amiga/fs_backing_store.h"
#include "amiga/gui_options.h"
#include "amiga/help.h"
#include "amiga/history.h"
@@ -3031,8 +3031,8 @@ static void gui_quit(void)
ami_mouse_pointers_free();
LOG("Freeing clipboard");
ami_clipboard_free();
- LOG("Removing scheduler process");
- ami_scheduler_process_delete();
+ LOG("Freeing scheduler resources");
+ ami_schedule_free();
FreeSysObject(ASOT_PORT, appport);
FreeSysObject(ASOT_PORT, sport);
@@ -5504,7 +5504,7 @@ int main(int argc, char** argv)
return RETURN_FAIL;
}
- if(ami_scheduler_process_create(schedulermsgport) != NSERROR_OK) {
+ if(ami_schedule_create(schedulermsgport) != NSERROR_OK) {
ami_misc_fatal_error("Failed to initialise scheduler");
ami_gui_splash_close(splash_window);
ami_libs_close();
@@ -5524,7 +5524,7 @@ int main(int argc, char** argv)
users_dir = ASPrintf("%s", USERS_DIR);
if(users_dir == NULL) {
ami_misc_fatal_error("Failed to allocate memory");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5536,7 +5536,7 @@ int main(int argc, char** argv)
struct InfoData *infodata = AllocDosObject(DOS_INFODATA, 0);
if(infodata == NULL) {
ami_misc_fatal_error("Failed to allocate memory");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5547,7 +5547,7 @@ int main(int argc, char** argv)
if(infodata->id_DiskState == ID_DISKSTATE_WRITE_PROTECTED) {
FreeDosObject(DOS_INFODATA, infodata);
ami_misc_fatal_error("User directory MUST be on a writeable volume");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5567,7 +5567,7 @@ int main(int argc, char** argv)
current_user_dir = AllocVecTagList(len, NULL);
if(current_user_dir == NULL) {
ami_misc_fatal_error("Failed to allocate memory");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5605,7 +5605,7 @@ int main(int argc, char** argv)
ret = nsoption_init(ami_set_options, &nsoptions, &nsoptions_default);
if (ret != NSERROR_OK) {
ami_misc_fatal_error("Options failed to initialise");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5618,7 +5618,7 @@ int main(int argc, char** argv)
if (ami_locate_resource(messages, "Messages") == false) {
ami_misc_fatal_error("Cannot open Messages file");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5629,7 +5629,7 @@ int main(int argc, char** argv)
ret = netsurf_init(current_user_cache);
if (ret != NSERROR_OK) {
ami_misc_fatal_error("NetSurf failed to initialise");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
diff --git a/amiga/schedule.c b/amiga/schedule.c
index 39c3a3b..a8061a7 100755
--- a/amiga/schedule.c
+++ b/amiga/schedule.c
@@ -27,14 +27,10 @@
#include <pbl.h>
#include "utils/errors.h"
-#include "utils/log.h"
#include "amiga/misc.h"
#include "amiga/schedule.h"
-#ifdef AMIGA_NS_ASYNC
-static struct MsgPort *smsgport = NULL; /* to send messages for the scheduler to */
-#endif
static struct TimeRequest *tioreq;
struct Device *TimerBase;
#ifdef __amigaos4__
@@ -52,21 +48,6 @@ struct nscallback
struct TimeRequest *treq;
};
-struct ami_schedule_message {
- struct Message msg;
- int type;
- int t;
- void *callback;
- void *p;
-};
-
-enum {
- AMI_S_SCHEDULE = 0,
- AMI_S_RUN,
- AMI_S_STARTUP,
- AMI_S_EXIT
-};
-
static PblHeap *schedule_list;
/**
@@ -233,38 +214,18 @@ static int ami_schedule_compare(const void *prev, const void *next)
/**
* Process events up to current time.
- * NetSurf entry point after being signalled by the scheduler process.
- */
-static void schedule_run(struct ami_schedule_message *asmsg)
-{
- void (*callback)(void *p) = asmsg->callback;
- void *p = asmsg->p;
-
- callback(p);
-}
-
-/**
- * Process events up to current time.
*
* This implementation only takes the top entry off the heap, it does not
* venture to later scheduled events until the next time it is called -
* immediately afterwards, if we're in a timer signalled loop.
*/
-static void ami_scheduler_run(struct MsgPort *nsmsgport)
+static void ami_scheduler_run(void)
{
struct nscallback *nscb;
+ struct TimeVal tv;
void (*callback)(void *p);
void *p;
- struct TimeVal tv;
- struct ami_schedule_message *asmsg;
-#ifndef AMIGA_NS_ASYNC
- asmsg = AllocVecTagList(sizeof(struct ami_schedule_message), NULL);
-#else
- asmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- TAG_END);
-#endif
nscb = pblHeapGetFirst(schedule_list);
if(nscb == -1) return;
@@ -277,30 +238,18 @@ static void ami_scheduler_run(struct MsgPort *nsmsgport)
callback = nscb->callback;
p = nscb->p;
+
ami_schedule_remove_timer_event(nscb);
pblHeapRemoveFirst(schedule_list);
ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
- asmsg->type = AMI_S_RUN;
- asmsg->callback = callback;
- asmsg->p = p;
+ callback(p);
-#ifndef AMIGA_NS_ASYNC
- schedule_run(asmsg);
- FreeVec(asmsg);
-#else
- PutMsg(nsmsgport, (struct Message *)asmsg);
-#endif
return;
}
-static struct MsgPort *ami_schedule_open_timer(struct MsgPort *msgport)
+static void ami_schedule_open_timer(struct MsgPort *msgport)
{
- if(msgport == NULL) {
- msgport = AllocSysObjectTags(ASOT_PORT,
- ASO_NoTrack, FALSE,
- TAG_DONE);
- }
#ifdef __amigaos4__
tioreq = (struct TimeRequest *)AllocSysObjectTags(ASOT_IOREQUEST,
ASOIOR_Size,sizeof(struct TimeRequest),
@@ -317,104 +266,70 @@ static struct MsgPort *ami_schedule_open_timer(struct MsgPort *msgport)
#ifdef __amigaos4__
ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase, "main", 1, NULL);
#endif
- return msgport;
}
-static void ami_schedule_close_timer(struct MsgPort *msgport)
+static void ami_schedule_close_timer(void)
{
#ifdef __amigaos4__
if(ITimer) DropInterface((struct Interface *)ITimer);
#endif
CloseDevice((struct IORequest *) tioreq);
FreeSysObject(ASOT_IOREQUEST, tioreq);
-
- /* Will be NULL if the GUI code is allocating/deallocating (no async mode) */
- if(msgport != NULL) FreeSysObject(ASOT_PORT, msgport);
}
-/**
- * Initialise amiga scheduler
- *
- * \param msgport optional already opened message port
- *
- * \return true if initialised ok or false on error.
- */
-static struct MsgPort *ami_schedule_create(struct MsgPort *msgport)
+/* exported interface documented in amiga/schedule.h */
+nserror ami_schedule_create(struct MsgPort *msgport)
{
- msgport = ami_schedule_open_timer(msgport);
+ pool_nscb = ami_misc_itempool_create(sizeof(struct nscallback));
+ pool_timereq = ami_misc_itempool_create(sizeof(struct TimeRequest));
+
+ ami_schedule_open_timer(msgport);
schedule_list = pblHeapNew();
- if(schedule_list == PBL_ERROR_OUT_OF_MEMORY) return NULL;
+ if(schedule_list == PBL_ERROR_OUT_OF_MEMORY) return NSERROR_NOMEM;
pblHeapSetCompareFunction(schedule_list, ami_schedule_compare);
- return msgport;
+ return NSERROR_OK;
}
-/**
- * Finalise amiga scheduler
- *
- * \param msgport optional message port to free
- */
-static void ami_schedule_free(struct MsgPort *msgport)
+/* exported interface documented in amiga/schedule.h */
+void ami_schedule_free(void)
{
schedule_remove_all();
pblHeapFree(schedule_list); // this should be empty at this point
schedule_list = NULL;
- ami_schedule_close_timer(msgport);
+ ami_schedule_close_timer();
+
+ ami_misc_itempool_delete(pool_timereq);
+ ami_misc_itempool_delete(pool_nscb);
}
-static nserror ami_scheduler_schedule(struct ami_schedule_message *asmsg)
+/* exported function documented in amiga/schedule.h */
+nserror ami_schedule(int t, void (*callback)(void *p), void *p)
{
struct nscallback *nscb;
if(schedule_list == NULL) return NSERROR_INIT_FAILED;
- if (asmsg->t < 0) return schedule_remove(asmsg->callback, asmsg->p);
+ if(t < 0) return schedule_remove(callback, p);
- if ((nscb = ami_schedule_locate(asmsg->callback, asmsg->p, false))) {
- return ami_schedule_reschedule(nscb, asmsg->t);
+ if ((nscb = ami_schedule_locate(callback, p, false))) {
+ return ami_schedule_reschedule(nscb, t);
}
nscb = ami_misc_itempool_alloc(pool_nscb, sizeof(struct nscallback));
if(!nscb) return NSERROR_NOMEM;
- if (ami_schedule_add_timer_event(nscb, asmsg->t) != NSERROR_OK)
+ if (ami_schedule_add_timer_event(nscb, t) != NSERROR_OK)
return NSERROR_NOMEM;
- nscb->callback = asmsg->callback;
- nscb->p = asmsg->p;
+ nscb->callback = callback;
+ nscb->p = p;
pblHeapInsert(schedule_list, nscb);
return NSERROR_OK;
-}
-
-/* exported function documented in amiga/schedule.h */
-nserror ami_schedule(int t, void (*callback)(void *p), void *p)
-{
- struct ami_schedule_message *asmsg;
-#ifndef AMIGA_NS_ASYNC
- asmsg = AllocVecTagList(sizeof(struct ami_schedule_message), NULL);
-#else
- if(smsgport == NULL) return NSERROR_INIT_FAILED;
- asmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- TAG_END);
-#endif
-
- asmsg->type = AMI_S_SCHEDULE;
- asmsg->t = t;
- asmsg->callback = callback;
- asmsg->p = p;
-
-#ifndef AMIGA_NS_ASYNC
- ami_scheduler_schedule(asmsg);
- FreeVec(asmsg);
-#else
- PutMsg(smsgport, (struct Message *)asmsg);
-#endif
- return NSERROR_OK;
}
/* exported interface documented in amiga/schedule.h */
@@ -423,7 +338,6 @@ void ami_schedule_handle(struct MsgPort *nsmsgport)
/* nsmsgport is the NetSurf message port that the scheduler task
* (or timer.device in no-async mode) is sending messages to. */
-#ifndef AMIGA_NS_ASYNC
struct TimerRequest *timermsg;
while((timermsg = (struct TimerRequest *)GetMsg(nsmsgport))) {
@@ -431,169 +345,7 @@ void ami_schedule_handle(struct MsgPort *nsmsgport)
* it crashes if we reply after schedule_run has executed.
*/
ReplyMsg((struct Message *)timermsg);
- ami_scheduler_run(NULL);
- }
-#else
- struct ami_schedule_message *asmsg;
-
- while((asmsg = (struct ami_schedule_message *)GetMsg(nsmsgport))) {
- if(asmsg->msg.mn_Node.ln_Type == NT_REPLYMSG) {
- /* if it's a reply, free stuff */
- FreeSysObject(ASOT_MESSAGE, asmsg);
- } else {
- switch(asmsg->type) {
- case AMI_S_STARTUP:
- smsgport = asmsg->msg.mn_ReplyPort;
- break;
-
- case AMI_S_RUN:
- schedule_run(asmsg);
- break;
-
- default:
- // unknown message
- break;
- }
- FreeSysObject(ASOT_MESSAGE, asmsg); /* don't reply, just free */
- }
- }
-#endif
-}
-
-#ifdef AMIGA_NS_ASYNC
-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 = AllocSysObjectTags(ASOT_PORT, TAG_END);
- struct MsgPort *timermsgport = ami_schedule_create();
- bool running = true;
- struct TimerRequest *timermsg = 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 = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- ASOMSG_ReplyPort, schedulermsgport,
- TAG_END);
-
- asmsg->type = AMI_S_STARTUP;
- PutMsg(nsmsgport, (struct Message *)asmsg);
-
- /* Main loop for this process */
-
- while(running) {
- signal = Wait(signalmask);
-
- if(signal & schedulesig) {
- while((asmsg = (struct ami_schedule_message *)GetMsg(schedulermsgport))) {
- if(asmsg->msg.mn_Node.ln_Type == NT_REPLYMSG) {
- /* if it's a reply, free stuff */
- FreeSysObject(ASOT_MESSAGE, asmsg);
- } else {
- switch(asmsg->type) {
- case AMI_S_SCHEDULE:
- ami_scheduler_schedule(asmsg);
- break;
-
- case AMI_S_EXIT:
- running = false;
- break;
-
- default:
- // unknown message
- break;
- }
- FreeSysObject(ASOT_MESSAGE, asmsg); /* don't reply, just free */
- }
- }
- }
-
- if(signal & timersig) {
- while((timermsg = (struct TimerRequest *)GetMsg(timermsgport))) {
- /* reply first, as we don't need the message contents and
- * it crashes if we reply after schedule_run has executed.
- */
- ReplyMsg((struct Message *)timermsg);
- ami_scheduler_run(nsmsgport);
- }
- }
- }
-
- ami_schedule_free(timermsgport);
- FreeSysObject(ASOT_PORT, schedulermsgport);
-
- return RETURN_OK;
-}
-#endif
-
-/**
- * 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)
-{
- pool_nscb = ami_misc_itempool_create(sizeof(struct nscallback));
- pool_timereq = ami_misc_itempool_create(sizeof(struct TimeRequest));
-
-#ifndef AMIGA_NS_ASYNC
- ami_schedule_create(nsmsgport);
-#else
- if(nsmsgport == NULL) return NSERROR_INIT_FAILED;
-
- struct Process *proc = CreateNewProcTags(
- NP_Name, "NetSurf scheduler",
- NP_Entry, ami_scheduler_process,
- NP_Child, TRUE,
- NP_StackSize, 2048,
- NP_Priority, 1,
- NP_UserData, nsmsgport,
- TAG_DONE);
-
- if(proc == NULL) {
- return NSERROR_NOMEM;
+ ami_scheduler_run();
}
-
- LOG("Waiting for scheduler process to start up...");
-
- WaitPort(nsmsgport);
- struct ami_schedule_message *asmsg = (struct ami_schedule_message *)GetMsg(nsmsgport);
-
- if(asmsg->type == AMI_S_STARTUP) { /* We shouldn't get any other messages at this stage */
- smsgport = asmsg->msg.mn_ReplyPort;
- ReplyMsg((struct Message *)asmsg);
- }
-#endif
- LOG("Scheduler started");
-
- return NSERROR_OK;
-}
-
-/* exported function documented in amiga/schedule.h */
-void ami_scheduler_process_delete(void)
-{
-#ifndef AMIGA_NS_ASYNC
- ami_schedule_free(NULL);
-#else
- if(smsgport == NULL) return;
-
- struct ami_schedule_message *asmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- TAG_END);
-
- asmsg->type = AMI_S_EXIT;
- PutMsg(smsgport, (struct Message *)asmsg);
- smsgport = NULL; /* this is freed via another copy of this pointer */
-#endif
-
- ami_misc_itempool_delete(pool_timereq);
- ami_misc_itempool_delete(pool_nscb);
}
diff --git a/amiga/schedule.h b/amiga/schedule.h
index cfea4d9..fb648ea 100755
--- a/amiga/schedule.h
+++ b/amiga/schedule.h
@@ -41,16 +41,17 @@ nserror ami_schedule(int t, void (*callback)(void *p), void *p);
void ami_schedule_handle(struct MsgPort *nsmsgport);
/**
- * Create a new process for the scheduler.
+ * Initialise amiga scheduler
*
- * \param nsmsgport Message port for the scheduler to send events to.
- * \return NSERROR_OK on success or error code on failure.
+ * \param msgport opened message port
+ *
+ * \return error.
*/
-nserror ami_scheduler_process_create(struct MsgPort *nsmsgport);
+nserror ami_schedule_create(struct MsgPort *msgport);
/**
- * Signal the scheduler process to exit.
+ * Finalise amiga scheduler
*/
-void ami_scheduler_process_delete(void);
+void ami_schedule_free(void);
#endif
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=7da516067d29117ed74...
commit 7da516067d29117ed74a102db43bb8ab4fd8316d
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Use itempools for the scheduler
diff --git a/amiga/schedule.c b/amiga/schedule.c
index cb53d2f..39c3a3b 100755
--- a/amiga/schedule.c
+++ b/amiga/schedule.c
@@ -29,6 +29,7 @@
#include "utils/errors.h"
#include "utils/log.h"
+#include "amiga/misc.h"
#include "amiga/schedule.h"
#ifdef AMIGA_NS_ASYNC
@@ -40,6 +41,9 @@ struct Device *TimerBase;
struct TimerIFace *ITimer;
#endif
+static APTR pool_nscb = NULL;
+static APTR pool_timereq = NULL;
+
struct nscallback
{
struct TimeVal tv;
@@ -83,7 +87,7 @@ static void ami_schedule_remove_timer_event(struct nscallback *nscb)
AbortIO((struct IORequest *)nscb->treq);
WaitIO((struct IORequest *)nscb->treq);
- FreeVec(nscb->treq);
+ ami_misc_itempool_free(pool_timereq, nscb->treq, sizeof(struct TimeRequest));
}
}
@@ -107,7 +111,7 @@ static nserror ami_schedule_add_timer_event(struct nscallback *nscb, int t)
GetSysTime(&tv);
AddTime(&nscb->tv,&tv); // now contains time when event occurs
- if((nscb->treq = AllocVecTagList(sizeof(struct TimeRequest), NULL))) {
+ if((nscb->treq = ami_misc_itempool_alloc(pool_timereq, sizeof(struct TimeRequest)))) {
*nscb->treq = *tioreq;
nscb->treq->Request.io_Command=TR_ADDREQUEST;
nscb->treq->Time.Seconds=nscb->tv.Seconds; // secs
@@ -137,7 +141,7 @@ static struct nscallback *ami_schedule_locate(void (*callback)(void *p), void *p
bool found_cb = false;
/* check there is something on the list */
- if (schedule_list == NULL) return NULL;
+ if (schedule_list == NULL) return NULL;
if(pblHeapIsEmpty(schedule_list)) return NULL;
iterator = pblHeapIterator(schedule_list);
@@ -192,7 +196,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
if(nscb != NULL) {
ami_schedule_remove_timer_event(nscb);
- FreeVec(nscb);
+ ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
pblHeapConstruct(schedule_list);
}
@@ -212,7 +216,7 @@ static void schedule_remove_all(void)
{
ami_schedule_remove_timer_event(nscb);
pblIteratorRemove(iterator);
- FreeVec(nscb);
+ ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
};
pblIteratorFree(iterator);
@@ -275,7 +279,7 @@ static void ami_scheduler_run(struct MsgPort *nsmsgport)
p = nscb->p;
ami_schedule_remove_timer_event(nscb);
pblHeapRemoveFirst(schedule_list);
- FreeVec(nscb);
+ ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
asmsg->type = AMI_S_RUN;
asmsg->callback = callback;
@@ -371,7 +375,7 @@ static nserror ami_scheduler_schedule(struct ami_schedule_message *asmsg)
return ami_schedule_reschedule(nscb, asmsg->t);
}
- nscb = AllocVecTagList(sizeof(struct nscallback), NULL);
+ nscb = ami_misc_itempool_alloc(pool_nscb, sizeof(struct nscallback));
if(!nscb) return NSERROR_NOMEM;
if (ami_schedule_add_timer_event(nscb, asmsg->t) != NSERROR_OK)
@@ -536,6 +540,9 @@ static int32 ami_scheduler_process(STRPTR args, int32 length, APTR execbase)
*/
nserror ami_scheduler_process_create(struct MsgPort *nsmsgport)
{
+ pool_nscb = ami_misc_itempool_create(sizeof(struct nscallback));
+ pool_timereq = ami_misc_itempool_create(sizeof(struct TimeRequest));
+
#ifndef AMIGA_NS_ASYNC
ami_schedule_create(nsmsgport);
#else
@@ -585,5 +592,8 @@ void ami_scheduler_process_delete(void)
PutMsg(smsgport, (struct Message *)asmsg);
smsgport = NULL; /* this is freed via another copy of this pointer */
#endif
+
+ ami_misc_itempool_delete(pool_timereq);
+ ami_misc_itempool_delete(pool_nscb);
}
-----------------------------------------------------------------------
Summary of changes:
amiga/fs_backing_store.c | 393 ----------------------------------------------
amiga/fs_backing_store.h | 24 ---
amiga/gui.c | 22 +--
amiga/schedule.c | 318 +++++--------------------------------
amiga/schedule.h | 13 +-
5 files changed, 58 insertions(+), 712 deletions(-)
delete mode 100644 amiga/fs_backing_store.c
delete mode 100644 amiga/fs_backing_store.h
diff --git a/amiga/fs_backing_store.c b/amiga/fs_backing_store.c
deleted file mode 100644
index 9e7672e..0000000
--- a/amiga/fs_backing_store.c
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright 2014 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <proto/dos.h>
-#include <proto/exec.h>
-
-#include "content/fs_backing_store.c"
-
-#ifdef AMIGA_NS_ASYNC
-struct ami_bsm_store {
- nsurl *url;
- enum backing_store_flags flags;
- uint8_t *data;
- size_t datalen;
-};
-
-struct ami_bsm_fetch {
- nsurl *url;
- enum backing_store_flags bsflags;
- uint8_t **data_out;
- size_t *datalen_out;
-};
-
-struct ami_bsm_invalidate {
- nsurl *url;
-};
-
-struct ami_bsm_release {
- nsurl *url;
- enum backing_store_flags bsflags;
-};
-
-struct ami_backing_store {
- struct MsgPort *msgport;
- struct llcache_store_parameters *parameters;
-};
-
-struct ami_backing_store_msg {
- struct Message msg;
- int type;
- nserror error;
- void *data;
-};
-
-enum {
- AMI_BSM_STARTUP = 0,
- AMI_BSM_STORE,
- AMI_BSM_FETCH,
- AMI_BSM_INVALIDATE,
- AMI_BSM_RELEASE,
- AMI_BSM_FINALISE
-};
-
-struct MsgPort *cachemsgport = NULL;
-
-static int32 ami_backing_store_process(STRPTR args, int32 length, APTR execbase)
-{
- struct Process *proc = (struct Process *)FindTask(NULL);
- struct ami_backing_store *abs = proc->pr_Task.tc_UserData;
- struct MsgPort *nsmsgport = abs->msgport;
- struct MsgPort *backingstoremsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- bool running = true;
-
- nserror error = filesystem_llcache_table->initialise(abs->parameters);
-
- /* Send a startup message to the message port we were given when we were created.
- * This tells NetSurf where to send disk cache messages to, as well as informing
- * that we are running.
- */
-
- struct ami_backing_store_msg *absmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_backing_store_msg),
- ASOMSG_ReplyPort, backingstoremsgport,
- TAG_END);
-
- absmsg->type = AMI_BSM_STARTUP;
- absmsg->error = error;
-
- PutMsg(nsmsgport, (struct Message *)absmsg);
-
- /* Main loop for this process */
-
- while(running) {
- WaitPort(backingstoremsgport);
-
- while((absmsg = (struct ami_backing_store_msg *)GetMsg(backingstoremsgport))) {
- if(absmsg->msg.mn_Node.ln_Type == NT_REPLYMSG) {
- /* if it's a reply, free stuff */
- FreeSysObject(ASOT_MESSAGE, absmsg);
- } else {
- if(running) {
- switch(absmsg->type) {
- case AMI_BSM_STORE:
- {
- struct ami_bsm_store *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->store(absm->url, absm->flags, absm->data, absm->datalen);
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- }
- break;
-
- case AMI_BSM_FETCH:
- {
- struct ami_bsm_fetch *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->fetch(absm->url, absm->bsflags, absm->data_out, absm->datalen_out);
- ReplyMsg((struct Message *)absmsg); /* need to reply to this one */
- }
- break;
-
- case AMI_BSM_INVALIDATE:
- {
- struct ami_bsm_invalidate *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->invalidate(absm->url);
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- }
- break;
-
- case AMI_BSM_RELEASE:
- {
- struct ami_bsm_release *absm = absmsg->data;
- absmsg->error = filesystem_llcache_table->release(absm->url, absm->bsflags);
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- }
- break;
-
- case AMI_BSM_FINALISE:
- running = false;
- absmsg->error = filesystem_llcache_table->finalise();
- ReplyMsg((struct Message *)absmsg); /* need to reply to this one */
- break;
-
- default:
- // unknown message
- FreeSysObject(ASOT_MESSAGE, absmsg); /* don't reply, just free */
- break;
- }
- }
- }
- }
- }
-
- FreeSysObject(ASOT_PORT, backingstoremsgport);
-
- return RETURN_OK;
-}
-
-static nserror ami_backing_store_send_reply(int type, void *data, struct MsgPort *msgport)
-{
- if(cachemsgport == NULL) return NSERROR_INIT_FAILED;
-
- struct ami_backing_store_msg *absmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_backing_store_msg),
- ASOMSG_ReplyPort, msgport,
- TAG_END);
-
- absmsg->type = type;
- absmsg->data = data;
-
- PutMsg(cachemsgport, (struct Message *)absmsg);
-
- return NSERROR_OK;
-}
-
-static nserror ami_backing_store_send(int type, void *data)
-{
- return ami_backing_store_send_reply(type, data, NULL);
-}
-
-/**
- * Place an object in the backing store.
- *
- * @param url The url is used as the unique primary key for the data.
- * @param flags The flags to control how the object is stored.
- * @param data The objects source data.
- * @param datalen The length of the \a data.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror
-ami_backing_store_store(nsurl *url,
- enum backing_store_flags flags,
- uint8_t *data,
- const size_t datalen)
-{
- struct ami_bsm_store *absm =
- AllocVecTagList(sizeof(struct ami_bsm_store), NULL);
-
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
- absm->flags = flags;
- absm->data = data;
- absm->datalen = datalen;
-
- return ami_backing_store_send(AMI_BSM_STORE, absm);
-}
-
-/**
- * Retrive an object from the backing store.
- *
- * @param[in] url The url is used as the unique primary key for the data.
- * @param[in] bsflags The flags to control how the object is retrieved.
- * @param[out] data_out The objects data.
- * @param[out] datalen_out The length of the \a data retrieved.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror ami_backing_store_fetch(nsurl *url,
- enum backing_store_flags bsflags,
- uint8_t **data_out,
- size_t *datalen_out)
-{
- struct MsgPort *tempmsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- if(tempmsgport == NULL) return NSERROR_NOMEM;
-
- struct ami_bsm_fetch *absm =
- AllocVecTagList(sizeof(struct ami_bsm_fetch), NULL);
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
- absm->bsflags = bsflags;
- absm->data_out = data_out;
- absm->datalen_out = datalen_out;
-
- nserror error = ami_backing_store_send_reply(AMI_BSM_FETCH, absm, tempmsgport);
- if(error != NSERROR_OK) return error;
-
- WaitPort(tempmsgport);
-
- struct ami_backing_store_msg *absmsg = (struct ami_backing_store_msg *)GetMsg(tempmsgport);
- error = absmsg->error;
-
- FreeVec(absm);
- FreeSysObject(ASOT_MESSAGE, absmsg);
- FreeSysObject(ASOT_PORT, tempmsgport);
-
- return error;
-}
-
-
-/**
- * release a previously fetched or stored memory object.
- *
- * @param[in] url The url is used as the unique primary key to invalidate.
- * @param[in] bsflags The flags to control how the object data is released.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror ami_backing_store_release(nsurl *url, enum backing_store_flags bsflags)
-{
- struct ami_bsm_release *absm =
- AllocVecTagList(sizeof(struct ami_bsm_release), NULL);
-
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
- absm->bsflags = bsflags;
-
- return ami_backing_store_send(AMI_BSM_RELEASE, absm);
-}
-
-/**
- * Invalidate a source object from the backing store.
- *
- * The entry (if present in the backing store) must no longer
- * be returned as a result to the fetch or meta operations.
- *
- * @param url The url is used as the unique primary key to invalidate.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror ami_backing_store_invalidate(nsurl *url)
-{
- struct ami_bsm_store *absm =
- AllocVecTagList(sizeof(struct ami_bsm_invalidate), NULL);
-
- if(absm == NULL) return NSERROR_NOMEM;
-
- absm->url = url;
-
- return ami_backing_store_send(AMI_BSM_INVALIDATE, absm);
-}
-
-/**
- * Finalise the backing store.
- *
- * \todo This will cause the backing store to leak any outstanding memory
- * allocations. This will probably best be done by a global use count.
- *
- * @return NSERROR_OK on success.
- */
-static nserror ami_backing_store_finalise(void)
-{
- struct MsgPort *tempmsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- if(tempmsgport == NULL) return NSERROR_NOMEM;
-
- nserror error = ami_backing_store_send_reply(AMI_BSM_FINALISE, NULL, tempmsgport);
- if(error != NSERROR_OK) return error;
-
- LOG("Waiting for backing store process to exit...");
-
- WaitPort(tempmsgport);
-
- struct ami_backing_store_msg *absmsg = (struct ami_backing_store_msg *)GetMsg(tempmsgport);
- error = absmsg->error;
-
- FreeSysObject(ASOT_MESSAGE, absmsg);
- FreeSysObject(ASOT_PORT, tempmsgport);
- cachemsgport = NULL;
-
- return error;
-}
-
-
-/**
- * Initialise the backing store.
- *
- * @param parameters to configure backing store.
- * @return NSERROR_OK on success or error code on faliure.
- */
-static nserror
-ami_backing_store_initialise(const struct llcache_store_parameters *parameters)
-{
- struct MsgPort *tempmsgport = AllocSysObjectTags(ASOT_PORT, TAG_END);
- struct ami_backing_store *abs =
- AllocVecTagList(sizeof(struct ami_backing_store), NULL);
- if(abs == NULL) return NSERROR_NOMEM;
-
- abs->msgport = tempmsgport;
- abs->parameters = (struct llcache_store_parameters *)parameters;
-
- struct Process *proc = CreateNewProcTags(
- NP_Name, "NetSurf backing store",
- NP_Entry, ami_backing_store_process,
- NP_Child, TRUE,
- NP_StackSize, 16384,
- NP_Priority, -1,
- NP_UserData, abs,
- TAG_DONE);
-
- if(proc == NULL) {
- return NSERROR_NOMEM;
- }
-
- LOG("Waiting for backing store process to start up...");
-
- WaitPort(tempmsgport);
-
- struct ami_backing_store_msg *msg = (struct ami_backing_store_msg *)GetMsg(tempmsgport);
- cachemsgport = msg->msg.mn_ReplyPort;
- nserror error = msg->error;
- ReplyMsg((struct Message *)msg);
- FreeSysObject(ASOT_PORT, tempmsgport);
-
- LOG("Backing store process started. Error code: %d", error);
-
- return error;
-}
-#endif
-
-static struct gui_llcache_table amiga_llcache_table = {
-#ifndef AMIGA_NS_ASYNC
- .initialise = initialise,
- .finalise = finalise,
- .store = store,
- .fetch = fetch,
- .invalidate = invalidate,
- .release = release,
-#else
- .initialise = ami_backing_store_initialise,
- .finalise = ami_backing_store_finalise,
- .store = ami_backing_store_store,
- .fetch = ami_backing_store_fetch,
- .invalidate = ami_backing_store_invalidate,
- .release = ami_backing_store_release,
-#endif
-};
-
-struct gui_llcache_table *amiga_filesystem_llcache_table = &amiga_llcache_table;
-
diff --git a/amiga/fs_backing_store.h b/amiga/fs_backing_store.h
deleted file mode 100644
index 45aa395..0000000
--- a/amiga/fs_backing_store.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2014 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef AMIGA_FS_BACKING_STORE_H
-#define AMIGA_FS_BACKING_STORE_H
-extern struct gui_llcache_table *amiga_filesystem_llcache_table;
-extern struct gui_llcache_table *filesystem_llcache_table;
-#endif
-
diff --git a/amiga/gui.c b/amiga/gui.c
index 09fc36b..58e7938 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -95,6 +95,7 @@
#include "utils/utils.h"
#include "utils/nsurl.h"
#include "utils/file.h"
+#include "content/backing_store.h"
#include "content/fetchers.h"
#include "content/fetchers/resource.h"
#include "content/urldb.h"
@@ -127,7 +128,6 @@
#include "amiga/file.h"
#include "amiga/filetype.h"
#include "amiga/font.h"
-#include "amiga/fs_backing_store.h"
#include "amiga/gui_options.h"
#include "amiga/help.h"
#include "amiga/history.h"
@@ -3031,8 +3031,8 @@ static void gui_quit(void)
ami_mouse_pointers_free();
LOG("Freeing clipboard");
ami_clipboard_free();
- LOG("Removing scheduler process");
- ami_scheduler_process_delete();
+ LOG("Freeing scheduler resources");
+ ami_schedule_free();
FreeSysObject(ASOT_PORT, appport);
FreeSysObject(ASOT_PORT, sport);
@@ -5504,7 +5504,7 @@ int main(int argc, char** argv)
return RETURN_FAIL;
}
- if(ami_scheduler_process_create(schedulermsgport) != NSERROR_OK) {
+ if(ami_schedule_create(schedulermsgport) != NSERROR_OK) {
ami_misc_fatal_error("Failed to initialise scheduler");
ami_gui_splash_close(splash_window);
ami_libs_close();
@@ -5524,7 +5524,7 @@ int main(int argc, char** argv)
users_dir = ASPrintf("%s", USERS_DIR);
if(users_dir == NULL) {
ami_misc_fatal_error("Failed to allocate memory");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5536,7 +5536,7 @@ int main(int argc, char** argv)
struct InfoData *infodata = AllocDosObject(DOS_INFODATA, 0);
if(infodata == NULL) {
ami_misc_fatal_error("Failed to allocate memory");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5547,7 +5547,7 @@ int main(int argc, char** argv)
if(infodata->id_DiskState == ID_DISKSTATE_WRITE_PROTECTED) {
FreeDosObject(DOS_INFODATA, infodata);
ami_misc_fatal_error("User directory MUST be on a writeable volume");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5567,7 +5567,7 @@ int main(int argc, char** argv)
current_user_dir = AllocVecTagList(len, NULL);
if(current_user_dir == NULL) {
ami_misc_fatal_error("Failed to allocate memory");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5605,7 +5605,7 @@ int main(int argc, char** argv)
ret = nsoption_init(ami_set_options, &nsoptions, &nsoptions_default);
if (ret != NSERROR_OK) {
ami_misc_fatal_error("Options failed to initialise");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5618,7 +5618,7 @@ int main(int argc, char** argv)
if (ami_locate_resource(messages, "Messages") == false) {
ami_misc_fatal_error("Cannot open Messages file");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
@@ -5629,7 +5629,7 @@ int main(int argc, char** argv)
ret = netsurf_init(current_user_cache);
if (ret != NSERROR_OK) {
ami_misc_fatal_error("NetSurf failed to initialise");
- ami_scheduler_process_delete();
+ ami_schedule_free();
ami_gui_splash_close(splash_window);
ami_libs_close();
return RETURN_FAIL;
diff --git a/amiga/schedule.c b/amiga/schedule.c
index cb53d2f..a8061a7 100755
--- a/amiga/schedule.c
+++ b/amiga/schedule.c
@@ -27,19 +27,19 @@
#include <pbl.h>
#include "utils/errors.h"
-#include "utils/log.h"
+#include "amiga/misc.h"
#include "amiga/schedule.h"
-#ifdef AMIGA_NS_ASYNC
-static struct MsgPort *smsgport = NULL; /* to send messages for the scheduler to */
-#endif
static struct TimeRequest *tioreq;
struct Device *TimerBase;
#ifdef __amigaos4__
struct TimerIFace *ITimer;
#endif
+static APTR pool_nscb = NULL;
+static APTR pool_timereq = NULL;
+
struct nscallback
{
struct TimeVal tv;
@@ -48,21 +48,6 @@ struct nscallback
struct TimeRequest *treq;
};
-struct ami_schedule_message {
- struct Message msg;
- int type;
- int t;
- void *callback;
- void *p;
-};
-
-enum {
- AMI_S_SCHEDULE = 0,
- AMI_S_RUN,
- AMI_S_STARTUP,
- AMI_S_EXIT
-};
-
static PblHeap *schedule_list;
/**
@@ -83,7 +68,7 @@ static void ami_schedule_remove_timer_event(struct nscallback *nscb)
AbortIO((struct IORequest *)nscb->treq);
WaitIO((struct IORequest *)nscb->treq);
- FreeVec(nscb->treq);
+ ami_misc_itempool_free(pool_timereq, nscb->treq, sizeof(struct TimeRequest));
}
}
@@ -107,7 +92,7 @@ static nserror ami_schedule_add_timer_event(struct nscallback *nscb, int t)
GetSysTime(&tv);
AddTime(&nscb->tv,&tv); // now contains time when event occurs
- if((nscb->treq = AllocVecTagList(sizeof(struct TimeRequest), NULL))) {
+ if((nscb->treq = ami_misc_itempool_alloc(pool_timereq, sizeof(struct TimeRequest)))) {
*nscb->treq = *tioreq;
nscb->treq->Request.io_Command=TR_ADDREQUEST;
nscb->treq->Time.Seconds=nscb->tv.Seconds; // secs
@@ -137,7 +122,7 @@ static struct nscallback *ami_schedule_locate(void (*callback)(void *p), void *p
bool found_cb = false;
/* check there is something on the list */
- if (schedule_list == NULL) return NULL;
+ if (schedule_list == NULL) return NULL;
if(pblHeapIsEmpty(schedule_list)) return NULL;
iterator = pblHeapIterator(schedule_list);
@@ -192,7 +177,7 @@ static nserror schedule_remove(void (*callback)(void *p), void *p)
if(nscb != NULL) {
ami_schedule_remove_timer_event(nscb);
- FreeVec(nscb);
+ ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
pblHeapConstruct(schedule_list);
}
@@ -212,7 +197,7 @@ static void schedule_remove_all(void)
{
ami_schedule_remove_timer_event(nscb);
pblIteratorRemove(iterator);
- FreeVec(nscb);
+ ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
};
pblIteratorFree(iterator);
@@ -229,38 +214,18 @@ static int ami_schedule_compare(const void *prev, const void *next)
/**
* Process events up to current time.
- * NetSurf entry point after being signalled by the scheduler process.
- */
-static void schedule_run(struct ami_schedule_message *asmsg)
-{
- void (*callback)(void *p) = asmsg->callback;
- void *p = asmsg->p;
-
- callback(p);
-}
-
-/**
- * Process events up to current time.
*
* This implementation only takes the top entry off the heap, it does not
* venture to later scheduled events until the next time it is called -
* immediately afterwards, if we're in a timer signalled loop.
*/
-static void ami_scheduler_run(struct MsgPort *nsmsgport)
+static void ami_scheduler_run(void)
{
struct nscallback *nscb;
+ struct TimeVal tv;
void (*callback)(void *p);
void *p;
- struct TimeVal tv;
- struct ami_schedule_message *asmsg;
-#ifndef AMIGA_NS_ASYNC
- asmsg = AllocVecTagList(sizeof(struct ami_schedule_message), NULL);
-#else
- asmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- TAG_END);
-#endif
nscb = pblHeapGetFirst(schedule_list);
if(nscb == -1) return;
@@ -273,30 +238,18 @@ static void ami_scheduler_run(struct MsgPort *nsmsgport)
callback = nscb->callback;
p = nscb->p;
+
ami_schedule_remove_timer_event(nscb);
pblHeapRemoveFirst(schedule_list);
- FreeVec(nscb);
+ ami_misc_itempool_free(pool_nscb, nscb, sizeof(struct nscallback));
- asmsg->type = AMI_S_RUN;
- asmsg->callback = callback;
- asmsg->p = p;
+ callback(p);
-#ifndef AMIGA_NS_ASYNC
- schedule_run(asmsg);
- FreeVec(asmsg);
-#else
- PutMsg(nsmsgport, (struct Message *)asmsg);
-#endif
return;
}
-static struct MsgPort *ami_schedule_open_timer(struct MsgPort *msgport)
+static void ami_schedule_open_timer(struct MsgPort *msgport)
{
- if(msgport == NULL) {
- msgport = AllocSysObjectTags(ASOT_PORT,
- ASO_NoTrack, FALSE,
- TAG_DONE);
- }
#ifdef __amigaos4__
tioreq = (struct TimeRequest *)AllocSysObjectTags(ASOT_IOREQUEST,
ASOIOR_Size,sizeof(struct TimeRequest),
@@ -313,104 +266,70 @@ static struct MsgPort *ami_schedule_open_timer(struct MsgPort *msgport)
#ifdef __amigaos4__
ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase, "main", 1, NULL);
#endif
- return msgport;
}
-static void ami_schedule_close_timer(struct MsgPort *msgport)
+static void ami_schedule_close_timer(void)
{
#ifdef __amigaos4__
if(ITimer) DropInterface((struct Interface *)ITimer);
#endif
CloseDevice((struct IORequest *) tioreq);
FreeSysObject(ASOT_IOREQUEST, tioreq);
-
- /* Will be NULL if the GUI code is allocating/deallocating (no async mode) */
- if(msgport != NULL) FreeSysObject(ASOT_PORT, msgport);
}
-/**
- * Initialise amiga scheduler
- *
- * \param msgport optional already opened message port
- *
- * \return true if initialised ok or false on error.
- */
-static struct MsgPort *ami_schedule_create(struct MsgPort *msgport)
+/* exported interface documented in amiga/schedule.h */
+nserror ami_schedule_create(struct MsgPort *msgport)
{
- msgport = ami_schedule_open_timer(msgport);
+ pool_nscb = ami_misc_itempool_create(sizeof(struct nscallback));
+ pool_timereq = ami_misc_itempool_create(sizeof(struct TimeRequest));
+
+ ami_schedule_open_timer(msgport);
schedule_list = pblHeapNew();
- if(schedule_list == PBL_ERROR_OUT_OF_MEMORY) return NULL;
+ if(schedule_list == PBL_ERROR_OUT_OF_MEMORY) return NSERROR_NOMEM;
pblHeapSetCompareFunction(schedule_list, ami_schedule_compare);
- return msgport;
+ return NSERROR_OK;
}
-/**
- * Finalise amiga scheduler
- *
- * \param msgport optional message port to free
- */
-static void ami_schedule_free(struct MsgPort *msgport)
+/* exported interface documented in amiga/schedule.h */
+void ami_schedule_free(void)
{
schedule_remove_all();
pblHeapFree(schedule_list); // this should be empty at this point
schedule_list = NULL;
- ami_schedule_close_timer(msgport);
+ ami_schedule_close_timer();
+
+ ami_misc_itempool_delete(pool_timereq);
+ ami_misc_itempool_delete(pool_nscb);
}
-static nserror ami_scheduler_schedule(struct ami_schedule_message *asmsg)
+/* exported function documented in amiga/schedule.h */
+nserror ami_schedule(int t, void (*callback)(void *p), void *p)
{
struct nscallback *nscb;
if(schedule_list == NULL) return NSERROR_INIT_FAILED;
- if (asmsg->t < 0) return schedule_remove(asmsg->callback, asmsg->p);
+ if(t < 0) return schedule_remove(callback, p);
- if ((nscb = ami_schedule_locate(asmsg->callback, asmsg->p, false))) {
- return ami_schedule_reschedule(nscb, asmsg->t);
+ if ((nscb = ami_schedule_locate(callback, p, false))) {
+ return ami_schedule_reschedule(nscb, t);
}
- nscb = AllocVecTagList(sizeof(struct nscallback), NULL);
+ nscb = ami_misc_itempool_alloc(pool_nscb, sizeof(struct nscallback));
if(!nscb) return NSERROR_NOMEM;
- if (ami_schedule_add_timer_event(nscb, asmsg->t) != NSERROR_OK)
+ if (ami_schedule_add_timer_event(nscb, t) != NSERROR_OK)
return NSERROR_NOMEM;
- nscb->callback = asmsg->callback;
- nscb->p = asmsg->p;
+ nscb->callback = callback;
+ nscb->p = p;
pblHeapInsert(schedule_list, nscb);
return NSERROR_OK;
-}
-
-/* exported function documented in amiga/schedule.h */
-nserror ami_schedule(int t, void (*callback)(void *p), void *p)
-{
- struct ami_schedule_message *asmsg;
-
-#ifndef AMIGA_NS_ASYNC
- asmsg = AllocVecTagList(sizeof(struct ami_schedule_message), NULL);
-#else
- if(smsgport == NULL) return NSERROR_INIT_FAILED;
- asmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- TAG_END);
-#endif
-
- asmsg->type = AMI_S_SCHEDULE;
- asmsg->t = t;
- asmsg->callback = callback;
- asmsg->p = p;
-#ifndef AMIGA_NS_ASYNC
- ami_scheduler_schedule(asmsg);
- FreeVec(asmsg);
-#else
- PutMsg(smsgport, (struct Message *)asmsg);
-#endif
- return NSERROR_OK;
}
/* exported interface documented in amiga/schedule.h */
@@ -419,7 +338,6 @@ void ami_schedule_handle(struct MsgPort *nsmsgport)
/* nsmsgport is the NetSurf message port that the scheduler task
* (or timer.device in no-async mode) is sending messages to. */
-#ifndef AMIGA_NS_ASYNC
struct TimerRequest *timermsg;
while((timermsg = (struct TimerRequest *)GetMsg(nsmsgport))) {
@@ -427,163 +345,7 @@ void ami_schedule_handle(struct MsgPort *nsmsgport)
* it crashes if we reply after schedule_run has executed.
*/
ReplyMsg((struct Message *)timermsg);
- ami_scheduler_run(NULL);
- }
-#else
- struct ami_schedule_message *asmsg;
-
- while((asmsg = (struct ami_schedule_message *)GetMsg(nsmsgport))) {
- if(asmsg->msg.mn_Node.ln_Type == NT_REPLYMSG) {
- /* if it's a reply, free stuff */
- FreeSysObject(ASOT_MESSAGE, asmsg);
- } else {
- switch(asmsg->type) {
- case AMI_S_STARTUP:
- smsgport = asmsg->msg.mn_ReplyPort;
- break;
-
- case AMI_S_RUN:
- schedule_run(asmsg);
- break;
-
- default:
- // unknown message
- break;
- }
- FreeSysObject(ASOT_MESSAGE, asmsg); /* don't reply, just free */
- }
- }
-#endif
-}
-
-#ifdef AMIGA_NS_ASYNC
-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 = AllocSysObjectTags(ASOT_PORT, TAG_END);
- struct MsgPort *timermsgport = ami_schedule_create();
- bool running = true;
- struct TimerRequest *timermsg = 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 = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- ASOMSG_ReplyPort, schedulermsgport,
- TAG_END);
-
- asmsg->type = AMI_S_STARTUP;
- PutMsg(nsmsgport, (struct Message *)asmsg);
-
- /* Main loop for this process */
-
- while(running) {
- signal = Wait(signalmask);
-
- if(signal & schedulesig) {
- while((asmsg = (struct ami_schedule_message *)GetMsg(schedulermsgport))) {
- if(asmsg->msg.mn_Node.ln_Type == NT_REPLYMSG) {
- /* if it's a reply, free stuff */
- FreeSysObject(ASOT_MESSAGE, asmsg);
- } else {
- switch(asmsg->type) {
- case AMI_S_SCHEDULE:
- ami_scheduler_schedule(asmsg);
- break;
-
- case AMI_S_EXIT:
- running = false;
- break;
-
- default:
- // unknown message
- break;
- }
- FreeSysObject(ASOT_MESSAGE, asmsg); /* don't reply, just free */
- }
- }
- }
-
- if(signal & timersig) {
- while((timermsg = (struct TimerRequest *)GetMsg(timermsgport))) {
- /* reply first, as we don't need the message contents and
- * it crashes if we reply after schedule_run has executed.
- */
- ReplyMsg((struct Message *)timermsg);
- ami_scheduler_run(nsmsgport);
- }
- }
- }
-
- ami_schedule_free(timermsgport);
- FreeSysObject(ASOT_PORT, schedulermsgport);
-
- return RETURN_OK;
-}
-#endif
-
-/**
- * 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)
-{
-#ifndef AMIGA_NS_ASYNC
- ami_schedule_create(nsmsgport);
-#else
- if(nsmsgport == NULL) return NSERROR_INIT_FAILED;
-
- struct Process *proc = CreateNewProcTags(
- NP_Name, "NetSurf scheduler",
- NP_Entry, ami_scheduler_process,
- NP_Child, TRUE,
- NP_StackSize, 2048,
- NP_Priority, 1,
- NP_UserData, nsmsgport,
- TAG_DONE);
-
- if(proc == NULL) {
- return NSERROR_NOMEM;
- }
-
- LOG("Waiting for scheduler process to start up...");
-
- WaitPort(nsmsgport);
- struct ami_schedule_message *asmsg = (struct ami_schedule_message *)GetMsg(nsmsgport);
-
- if(asmsg->type == AMI_S_STARTUP) { /* We shouldn't get any other messages at this stage */
- smsgport = asmsg->msg.mn_ReplyPort;
- ReplyMsg((struct Message *)asmsg);
+ ami_scheduler_run();
}
-#endif
- LOG("Scheduler started");
-
- return NSERROR_OK;
-}
-
-/* exported function documented in amiga/schedule.h */
-void ami_scheduler_process_delete(void)
-{
-#ifndef AMIGA_NS_ASYNC
- ami_schedule_free(NULL);
-#else
- if(smsgport == NULL) return;
-
- struct ami_schedule_message *asmsg = AllocSysObjectTags(ASOT_MESSAGE,
- ASOMSG_Size, sizeof(struct ami_schedule_message),
- TAG_END);
-
- asmsg->type = AMI_S_EXIT;
- PutMsg(smsgport, (struct Message *)asmsg);
- smsgport = NULL; /* this is freed via another copy of this pointer */
-#endif
}
diff --git a/amiga/schedule.h b/amiga/schedule.h
index cfea4d9..fb648ea 100755
--- a/amiga/schedule.h
+++ b/amiga/schedule.h
@@ -41,16 +41,17 @@ nserror ami_schedule(int t, void (*callback)(void *p), void *p);
void ami_schedule_handle(struct MsgPort *nsmsgport);
/**
- * Create a new process for the scheduler.
+ * Initialise amiga scheduler
*
- * \param nsmsgport Message port for the scheduler to send events to.
- * \return NSERROR_OK on success or error code on failure.
+ * \param msgport opened message port
+ *
+ * \return error.
*/
-nserror ami_scheduler_process_create(struct MsgPort *nsmsgport);
+nserror ami_schedule_create(struct MsgPort *msgport);
/**
- * Signal the scheduler process to exit.
+ * Finalise amiga scheduler
*/
-void ami_scheduler_process_delete(void);
+void ami_schedule_free(void);
#endif
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-611-gd9e92d2
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/d9e92d2032f2b24abe665...
...commit http://git.netsurf-browser.org/netsurf.git/commit/d9e92d2032f2b24abe665ca...
...tree http://git.netsurf-browser.org/netsurf.git/tree/d9e92d2032f2b24abe665ca02...
The branch, master has been updated
via d9e92d2032f2b24abe665ca02499277f540a8021 (commit)
via 82b298ac2c28dcaf7510e97b8a1379b34c8ab15c (commit)
via 669448d7b6ae420dfce6e8b25eda143ca2b31109 (commit)
via 594012ef52a6237995d1100d1a3315470b191cbe (commit)
via 3dcf7d80a140d5c02a56423dbc3575bbdf51ff82 (commit)
from ad273a41e894adea3dfb5e66ecb40574be2d7485 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=d9e92d2032f2b24abe6...
commit d9e92d2032f2b24abe665ca02499277f540a8021
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Add comment on on-demand JS context creation safety
Checking for enable_scripting isn't needed here.
diff --git a/render/html_script.c b/render/html_script.c
index c9fed64..fe3455d 100644
--- a/render/html_script.c
+++ b/render/html_script.c
@@ -517,6 +517,9 @@ html_process_script(void *ctx, dom_node *node)
dom_hubbub_error err = DOM_HUBBUB_OK;
/* ensure javascript context is available */
+ /* We should only ever be here if scripting was enabled for this
+ * content so it's correct to make a javascript context if there
+ * isn't one already. */
if (c->jscontext == NULL) {
union content_msg_data msg_data;
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=82b298ac2c28dcaf751...
commit 82b298ac2c28dcaf7510e97b8a1379b34c8ab15c
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Ensure we do on-demand JS context creation only when JS is enabled.
An alternative approach which may be better would be to create the
JavaScript context when the html_content is created, rather than
on demand.
This code checks for the JS context and creates one every time we
add a node to the DOM. So when JS is on, every doc with a single
node in it has a JS context. This seems to make on-demand creation
a redundant overhead.
diff --git a/render/html.c b/render/html.c
index 6d2421f..0c278a7 100644
--- a/render/html.c
+++ b/render/html.c
@@ -671,19 +671,22 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
dom_string_unref(name);
}
- /* ensure javascript context is available */
- if (htmlc->jscontext == NULL) {
- union content_msg_data msg_data;
-
- msg_data.jscontext = &htmlc->jscontext;
- content_broadcast(&htmlc->base,
- CONTENT_MSG_GETCTX,
- msg_data);
- LOG("javascript context %p ", htmlc->jscontext);
- }
- if (htmlc->jscontext != NULL) {
- js_handle_new_element(htmlc->jscontext,
- (dom_element *) node);
+ if (htmlc->enable_scripting) {
+ /* ensure javascript context is available */
+ if (htmlc->jscontext == NULL) {
+ union content_msg_data msg_data;
+
+ msg_data.jscontext = &htmlc->jscontext;
+ content_broadcast(&htmlc->base,
+ CONTENT_MSG_GETCTX,
+ msg_data);
+ LOG("javascript context: %p",
+ htmlc->jscontext);
+ }
+ if (htmlc->jscontext != NULL) {
+ js_handle_new_element(htmlc->jscontext,
+ (dom_element *) node);
+ }
}
}
dom_node_unref(node);
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=669448d7b6ae420dfce...
commit 669448d7b6ae420dfce6e8b25eda143ca2b31109
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Fix place where we're calling a js_* fn without checking for context.
diff --git a/render/html.c b/render/html.c
index 06e2e06..6d2421f 100644
--- a/render/html.c
+++ b/render/html.c
@@ -592,7 +592,9 @@ void html_finish_conversion(html_content *htmlc)
* object, but with its target set to the Document object (and
* the currentTarget set to the Window object)
*/
- js_fire_event(htmlc->jscontext, "load", htmlc->document, NULL);
+ if (htmlc->jscontext != NULL) {
+ js_fire_event(htmlc->jscontext, "load", htmlc->document, NULL);
+ }
/* convert dom tree to box tree */
LOG("DOM to box (%p)", htmlc);
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=594012ef52a6237995d...
commit 594012ef52a6237995d1100d1a3315470b191cbe
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Ensure constant javascript_enabled for HTML contents.
Now we take the value of the javascript_enabled option when the
content is created. We then use the content's script_enabled
boolean everywhere else.
This prevents us getting inconsistent values for javascript_enabled
if a user toggles the setting while a page is loading.
It was read frequently during box construction, and also the
parser's script enabled setting could change where we handled
a change of encoding.
Now we only care about the setting of the javascript_enabled
option at time of html_content creation.
diff --git a/render/box_construct.c b/render/box_construct.c
index ad39684..6a36316 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -1627,7 +1627,7 @@ bool box_image(BOX_SPECIAL_PARAMS)
bool box_noscript(BOX_SPECIAL_PARAMS)
{
/* If scripting is enabled, do not display the contents of noscript */
- if (nsoption_bool(enable_javascript))
+ if (content->enable_scripting)
*convert_children = false;
return true;
@@ -3025,7 +3025,7 @@ bool box_extract_link(const html_content *content,
}
s[j] = 0;
- if (nsoption_bool(enable_javascript) == false) {
+ if (content->enable_scripting == false) {
/* extract first quoted string out of "javascript:" link */
if (strncmp(s, "javascript:", 11) == 0) {
apos0 = strchr(s, '\'');
diff --git a/render/html.c b/render/html.c
index a219017..06e2e06 100644
--- a/render/html.c
+++ b/render/html.c
@@ -850,6 +850,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
c->scripts = NULL;
c->jscontext = NULL;
+ c->enable_scripting = nsoption_bool(enable_javascript);
c->base.active = 1; /* The html content itself is active */
if (lwc_intern_string("*", SLEN("*"), &c->universal) != lwc_error_ok) {
@@ -876,7 +877,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
/* Create the parser binding */
parse_params.enc = c->encoding;
parse_params.fix_enc = true;
- parse_params.enable_script = nsoption_bool(enable_javascript);
+ parse_params.enable_script = c->enable_scripting;
parse_params.msg = NULL;
parse_params.script = html_process_script;
parse_params.ctx = c;
@@ -1019,7 +1020,7 @@ html_process_encoding_change(struct content *c,
parse_params.enc = html->encoding;
parse_params.fix_enc = true;
- parse_params.enable_script = nsoption_bool(enable_javascript);
+ parse_params.enable_script = html->enable_scripting;
parse_params.msg = NULL;
parse_params.script = html_process_script;
parse_params.ctx = html;
diff --git a/render/html_internal.h b/render/html_internal.h
index e5740db..aaecb78 100644
--- a/render/html_internal.h
+++ b/render/html_internal.h
@@ -97,6 +97,9 @@ typedef struct html_content {
/** Whether a layout (reflow) is in progress */
bool reflowing;
+ /** Whether scripts are enabled for this content */
+ bool enable_scripting;
+
/* Title element node */
dom_node *title;
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=3dcf7d80a140d5c02a5...
commit 3dcf7d80a140d5c02a56423dbc3575bbdf51ff82
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Pass html_content to box_extract_link.
diff --git a/render/box.h b/render/box.h
index 5501f88..1f35ada 100644
--- a/render/box.h
+++ b/render/box.h
@@ -334,7 +334,8 @@ struct box *box_pick_text_box(struct html_content *html,
struct box *box_find_by_id(struct box *box, lwc_string *id);
bool box_visible(struct box *box);
void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style);
-bool box_extract_link(const char *rel, struct nsurl *base, struct nsurl **result);
+bool box_extract_link(const struct html_content *content,
+ const char *rel, struct nsurl *base, struct nsurl **result);
bool box_handle_scrollbars(struct content *c, struct box *box,
bool bottom, bool right);
diff --git a/render/box_construct.c b/render/box_construct.c
index 2ad5eb2..ad39684 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -1476,7 +1476,7 @@ bool box_a(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_href, &s);
if (err == DOM_NO_ERR && s != NULL) {
- ok = box_extract_link(dom_string_data(s),
+ ok = box_extract_link(content, dom_string_data(s),
content->base_url, &url);
dom_string_unref(s);
if (!ok)
@@ -1590,7 +1590,7 @@ bool box_image(BOX_SPECIAL_PARAMS)
if (err != DOM_NO_ERR || s == NULL)
return true;
- if (box_extract_link(dom_string_data(s), content->base_url,
+ if (box_extract_link(content, dom_string_data(s), content->base_url,
&url) == false) {
dom_string_unref(s);
return false;
@@ -1691,7 +1691,7 @@ bool box_object(BOX_SPECIAL_PARAMS)
* (codebase is the base for the other two) */
err = dom_element_get_attribute(n, corestring_dom_codebase, &codebase);
if (err == DOM_NO_ERR && codebase != NULL) {
- if (box_extract_link(dom_string_data(codebase),
+ if (box_extract_link(content, dom_string_data(codebase),
content->base_url,
¶ms->codebase) == false) {
dom_string_unref(codebase);
@@ -1704,8 +1704,8 @@ bool box_object(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_classid, &classid);
if (err == DOM_NO_ERR && classid != NULL) {
- if (box_extract_link(dom_string_data(classid), params->codebase,
- ¶ms->classid) == false) {
+ if (box_extract_link(content, dom_string_data(classid),
+ params->codebase, ¶ms->classid) == false) {
dom_string_unref(classid);
return false;
}
@@ -1714,8 +1714,8 @@ bool box_object(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_data, &data);
if (err == DOM_NO_ERR && data != NULL) {
- if (box_extract_link(dom_string_data(data), params->codebase,
- ¶ms->data) == false) {
+ if (box_extract_link(content, dom_string_data(data),
+ params->codebase, ¶ms->data) == false) {
dom_string_unref(data);
return false;
}
@@ -2134,7 +2134,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
url = NULL;
err = dom_element_get_attribute(c, corestring_dom_src, &s);
if (err == DOM_NO_ERR && s != NULL) {
- box_extract_link(dom_string_data(s),
+ box_extract_link(content, dom_string_data(s),
content->base_url, &url);
dom_string_unref(s);
}
@@ -2270,7 +2270,7 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_src, &s);
if (err != DOM_NO_ERR || s == NULL)
return true;
- if (box_extract_link(dom_string_data(s), content->base_url,
+ if (box_extract_link(content, dom_string_data(s), content->base_url,
&url) == false) {
dom_string_unref(s);
return false;
@@ -2843,7 +2843,7 @@ bool box_embed(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_src, &src);
if (err != DOM_NO_ERR || src == NULL)
return true;
- if (box_extract_link(dom_string_data(src), content->base_url,
+ if (box_extract_link(content, dom_string_data(src), content->base_url,
¶ms->data) == false) {
dom_string_unref(src);
return false;
@@ -2996,7 +2996,8 @@ bool box_get_attribute(dom_node *n, const char *attribute,
* \return true on success, false on memory exhaustion
*/
-bool box_extract_link(const char *rel, nsurl *base, nsurl **result)
+bool box_extract_link(const html_content *content,
+ const char *rel, nsurl *base, nsurl **result)
{
char *s, *s1, *apos0 = 0, *apos1 = 0, *quot0 = 0, *quot1 = 0;
unsigned int i, j, end;
diff --git a/render/imagemap.c b/render/imagemap.c
index 2e84bd0..b1cb824 100644
--- a/render/imagemap.c
+++ b/render/imagemap.c
@@ -274,6 +274,7 @@ void imagemap_dump(html_content *c)
/**
* Adds an imagemap entry to the list
*
+ * \param c The html content that the imagemap belongs to
* \param n The xmlNode representing the entry to add
* \param base_url Base URL for resolving relative URLs
* \param entry Pointer to list of entries
@@ -281,7 +282,7 @@ void imagemap_dump(html_content *c)
* \return false on memory exhaustion, true otherwise
*/
static bool
-imagemap_addtolist(dom_node *n, nsurl *base_url,
+imagemap_addtolist(const struct html_content *c, dom_node *n, nsurl *base_url,
struct mapentry **entry, dom_string *tagtype)
{
dom_exception exc;
@@ -346,7 +347,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
else
goto bad_out;
- if (box_extract_link(dom_string_data(href),
+ if (box_extract_link(c, dom_string_data(href),
base_url, &new_map->url) == false)
goto bad_out;
@@ -537,7 +538,7 @@ imagemap_extract_map_entries(dom_node *node, html_content *c,
dom_nodelist_unref(nlist);
return false;
}
- if (imagemap_addtolist(subnode, c->base_url,
+ if (imagemap_addtolist(c, subnode, c->base_url,
entry, tname) == false) {
dom_node_unref(subnode);
dom_nodelist_unref(nlist);
-----------------------------------------------------------------------
Summary of changes:
render/box.h | 3 ++-
render/box_construct.c | 27 ++++++++++++++-------------
render/html.c | 38 ++++++++++++++++++++++----------------
render/html_internal.h | 3 +++
render/html_script.c | 3 +++
render/imagemap.c | 7 ++++---
6 files changed, 48 insertions(+), 33 deletions(-)
diff --git a/render/box.h b/render/box.h
index 5501f88..1f35ada 100644
--- a/render/box.h
+++ b/render/box.h
@@ -334,7 +334,8 @@ struct box *box_pick_text_box(struct html_content *html,
struct box *box_find_by_id(struct box *box, lwc_string *id);
bool box_visible(struct box *box);
void box_dump(FILE *stream, struct box *box, unsigned int depth, bool style);
-bool box_extract_link(const char *rel, struct nsurl *base, struct nsurl **result);
+bool box_extract_link(const struct html_content *content,
+ const char *rel, struct nsurl *base, struct nsurl **result);
bool box_handle_scrollbars(struct content *c, struct box *box,
bool bottom, bool right);
diff --git a/render/box_construct.c b/render/box_construct.c
index 2ad5eb2..6a36316 100644
--- a/render/box_construct.c
+++ b/render/box_construct.c
@@ -1476,7 +1476,7 @@ bool box_a(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_href, &s);
if (err == DOM_NO_ERR && s != NULL) {
- ok = box_extract_link(dom_string_data(s),
+ ok = box_extract_link(content, dom_string_data(s),
content->base_url, &url);
dom_string_unref(s);
if (!ok)
@@ -1590,7 +1590,7 @@ bool box_image(BOX_SPECIAL_PARAMS)
if (err != DOM_NO_ERR || s == NULL)
return true;
- if (box_extract_link(dom_string_data(s), content->base_url,
+ if (box_extract_link(content, dom_string_data(s), content->base_url,
&url) == false) {
dom_string_unref(s);
return false;
@@ -1627,7 +1627,7 @@ bool box_image(BOX_SPECIAL_PARAMS)
bool box_noscript(BOX_SPECIAL_PARAMS)
{
/* If scripting is enabled, do not display the contents of noscript */
- if (nsoption_bool(enable_javascript))
+ if (content->enable_scripting)
*convert_children = false;
return true;
@@ -1691,7 +1691,7 @@ bool box_object(BOX_SPECIAL_PARAMS)
* (codebase is the base for the other two) */
err = dom_element_get_attribute(n, corestring_dom_codebase, &codebase);
if (err == DOM_NO_ERR && codebase != NULL) {
- if (box_extract_link(dom_string_data(codebase),
+ if (box_extract_link(content, dom_string_data(codebase),
content->base_url,
¶ms->codebase) == false) {
dom_string_unref(codebase);
@@ -1704,8 +1704,8 @@ bool box_object(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_classid, &classid);
if (err == DOM_NO_ERR && classid != NULL) {
- if (box_extract_link(dom_string_data(classid), params->codebase,
- ¶ms->classid) == false) {
+ if (box_extract_link(content, dom_string_data(classid),
+ params->codebase, ¶ms->classid) == false) {
dom_string_unref(classid);
return false;
}
@@ -1714,8 +1714,8 @@ bool box_object(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_data, &data);
if (err == DOM_NO_ERR && data != NULL) {
- if (box_extract_link(dom_string_data(data), params->codebase,
- ¶ms->data) == false) {
+ if (box_extract_link(content, dom_string_data(data),
+ params->codebase, ¶ms->data) == false) {
dom_string_unref(data);
return false;
}
@@ -2134,7 +2134,7 @@ bool box_create_frameset(struct content_html_frames *f, dom_node *n,
url = NULL;
err = dom_element_get_attribute(c, corestring_dom_src, &s);
if (err == DOM_NO_ERR && s != NULL) {
- box_extract_link(dom_string_data(s),
+ box_extract_link(content, dom_string_data(s),
content->base_url, &url);
dom_string_unref(s);
}
@@ -2270,7 +2270,7 @@ bool box_iframe(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_src, &s);
if (err != DOM_NO_ERR || s == NULL)
return true;
- if (box_extract_link(dom_string_data(s), content->base_url,
+ if (box_extract_link(content, dom_string_data(s), content->base_url,
&url) == false) {
dom_string_unref(s);
return false;
@@ -2843,7 +2843,7 @@ bool box_embed(BOX_SPECIAL_PARAMS)
err = dom_element_get_attribute(n, corestring_dom_src, &src);
if (err != DOM_NO_ERR || src == NULL)
return true;
- if (box_extract_link(dom_string_data(src), content->base_url,
+ if (box_extract_link(content, dom_string_data(src), content->base_url,
¶ms->data) == false) {
dom_string_unref(src);
return false;
@@ -2996,7 +2996,8 @@ bool box_get_attribute(dom_node *n, const char *attribute,
* \return true on success, false on memory exhaustion
*/
-bool box_extract_link(const char *rel, nsurl *base, nsurl **result)
+bool box_extract_link(const html_content *content,
+ const char *rel, nsurl *base, nsurl **result)
{
char *s, *s1, *apos0 = 0, *apos1 = 0, *quot0 = 0, *quot1 = 0;
unsigned int i, j, end;
@@ -3024,7 +3025,7 @@ bool box_extract_link(const char *rel, nsurl *base, nsurl **result)
}
s[j] = 0;
- if (nsoption_bool(enable_javascript) == false) {
+ if (content->enable_scripting == false) {
/* extract first quoted string out of "javascript:" link */
if (strncmp(s, "javascript:", 11) == 0) {
apos0 = strchr(s, '\'');
diff --git a/render/html.c b/render/html.c
index a219017..0c278a7 100644
--- a/render/html.c
+++ b/render/html.c
@@ -592,7 +592,9 @@ void html_finish_conversion(html_content *htmlc)
* object, but with its target set to the Document object (and
* the currentTarget set to the Window object)
*/
- js_fire_event(htmlc->jscontext, "load", htmlc->document, NULL);
+ if (htmlc->jscontext != NULL) {
+ js_fire_event(htmlc->jscontext, "load", htmlc->document, NULL);
+ }
/* convert dom tree to box tree */
LOG("DOM to box (%p)", htmlc);
@@ -669,19 +671,22 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
dom_string_unref(name);
}
- /* ensure javascript context is available */
- if (htmlc->jscontext == NULL) {
- union content_msg_data msg_data;
-
- msg_data.jscontext = &htmlc->jscontext;
- content_broadcast(&htmlc->base,
- CONTENT_MSG_GETCTX,
- msg_data);
- LOG("javascript context %p ", htmlc->jscontext);
- }
- if (htmlc->jscontext != NULL) {
- js_handle_new_element(htmlc->jscontext,
- (dom_element *) node);
+ if (htmlc->enable_scripting) {
+ /* ensure javascript context is available */
+ if (htmlc->jscontext == NULL) {
+ union content_msg_data msg_data;
+
+ msg_data.jscontext = &htmlc->jscontext;
+ content_broadcast(&htmlc->base,
+ CONTENT_MSG_GETCTX,
+ msg_data);
+ LOG("javascript context: %p",
+ htmlc->jscontext);
+ }
+ if (htmlc->jscontext != NULL) {
+ js_handle_new_element(htmlc->jscontext,
+ (dom_element *) node);
+ }
}
}
dom_node_unref(node);
@@ -850,6 +855,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
c->scripts = NULL;
c->jscontext = NULL;
+ c->enable_scripting = nsoption_bool(enable_javascript);
c->base.active = 1; /* The html content itself is active */
if (lwc_intern_string("*", SLEN("*"), &c->universal) != lwc_error_ok) {
@@ -876,7 +882,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
/* Create the parser binding */
parse_params.enc = c->encoding;
parse_params.fix_enc = true;
- parse_params.enable_script = nsoption_bool(enable_javascript);
+ parse_params.enable_script = c->enable_scripting;
parse_params.msg = NULL;
parse_params.script = html_process_script;
parse_params.ctx = c;
@@ -1019,7 +1025,7 @@ html_process_encoding_change(struct content *c,
parse_params.enc = html->encoding;
parse_params.fix_enc = true;
- parse_params.enable_script = nsoption_bool(enable_javascript);
+ parse_params.enable_script = html->enable_scripting;
parse_params.msg = NULL;
parse_params.script = html_process_script;
parse_params.ctx = html;
diff --git a/render/html_internal.h b/render/html_internal.h
index e5740db..aaecb78 100644
--- a/render/html_internal.h
+++ b/render/html_internal.h
@@ -97,6 +97,9 @@ typedef struct html_content {
/** Whether a layout (reflow) is in progress */
bool reflowing;
+ /** Whether scripts are enabled for this content */
+ bool enable_scripting;
+
/* Title element node */
dom_node *title;
diff --git a/render/html_script.c b/render/html_script.c
index c9fed64..fe3455d 100644
--- a/render/html_script.c
+++ b/render/html_script.c
@@ -517,6 +517,9 @@ html_process_script(void *ctx, dom_node *node)
dom_hubbub_error err = DOM_HUBBUB_OK;
/* ensure javascript context is available */
+ /* We should only ever be here if scripting was enabled for this
+ * content so it's correct to make a javascript context if there
+ * isn't one already. */
if (c->jscontext == NULL) {
union content_msg_data msg_data;
diff --git a/render/imagemap.c b/render/imagemap.c
index 2e84bd0..b1cb824 100644
--- a/render/imagemap.c
+++ b/render/imagemap.c
@@ -274,6 +274,7 @@ void imagemap_dump(html_content *c)
/**
* Adds an imagemap entry to the list
*
+ * \param c The html content that the imagemap belongs to
* \param n The xmlNode representing the entry to add
* \param base_url Base URL for resolving relative URLs
* \param entry Pointer to list of entries
@@ -281,7 +282,7 @@ void imagemap_dump(html_content *c)
* \return false on memory exhaustion, true otherwise
*/
static bool
-imagemap_addtolist(dom_node *n, nsurl *base_url,
+imagemap_addtolist(const struct html_content *c, dom_node *n, nsurl *base_url,
struct mapentry **entry, dom_string *tagtype)
{
dom_exception exc;
@@ -346,7 +347,7 @@ imagemap_addtolist(dom_node *n, nsurl *base_url,
else
goto bad_out;
- if (box_extract_link(dom_string_data(href),
+ if (box_extract_link(c, dom_string_data(href),
base_url, &new_map->url) == false)
goto bad_out;
@@ -537,7 +538,7 @@ imagemap_extract_map_entries(dom_node *node, html_content *c,
dom_nodelist_unref(nlist);
return false;
}
- if (imagemap_addtolist(subnode, c->base_url,
+ if (imagemap_addtolist(c, subnode, c->base_url,
entry, tname) == false) {
dom_node_unref(subnode);
dom_nodelist_unref(nlist);
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-606-gad273a4
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/ad273a41e894adea3dfb5...
...commit http://git.netsurf-browser.org/netsurf.git/commit/ad273a41e894adea3dfb5e6...
...tree http://git.netsurf-browser.org/netsurf.git/tree/ad273a41e894adea3dfb5e66e...
The branch, master has been updated
via ad273a41e894adea3dfb5e66ecb40574be2d7485 (commit)
via 4055ecf79626b25d5e222054dda48c40cfbdd396 (commit)
from 6d2a78738084a17d860a9eb96ada16150eeba14d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=ad273a41e894adea3df...
commit ad273a41e894adea3dfb5e66ecb40574be2d7485
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Simplify place_float_below loop condition.
diff --git a/render/layout.c b/render/layout.c
index b7d9e20..45d905f 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -3472,7 +3472,7 @@ void place_float_below(struct box *c, int width, int cx, int y,
} else if (left != 0 && right == 0) {
yy = left->y + left->height;
}
- } while (!((left == 0 && right == 0) || (c->width <= x1 - x0)));
+ } while ((left != 0 || right != 0) && (c->width > x1 - x0));
if (c->type == BOX_FLOAT_LEFT) {
c->x = x0;
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=4055ecf79626b25d5e2...
commit 4055ecf79626b25d5e222054dda48c40cfbdd396
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Tiny simplification of curl debug logging.
diff --git a/content/fetchers/curl.c b/content/fetchers/curl.c
index 4f5da3c..88c8bbe 100644
--- a/content/fetchers/curl.c
+++ b/content/fetchers/curl.c
@@ -1036,7 +1036,7 @@ static void fetch_curl_poll(lwc_string *scheme_ignored)
error = true;
}
if (read || write || error) {
- LOG(" fd %*i: %s %s %s", max_fd / 10 + 1, i,
+ LOG(" fd %i: %s %s %s", i,
read ? "read" : " ",
write ? "write" : " ",
error ? "error" : " ");
-----------------------------------------------------------------------
Summary of changes:
content/fetchers/curl.c | 2 +-
render/layout.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/content/fetchers/curl.c b/content/fetchers/curl.c
index 4f5da3c..88c8bbe 100644
--- a/content/fetchers/curl.c
+++ b/content/fetchers/curl.c
@@ -1036,7 +1036,7 @@ static void fetch_curl_poll(lwc_string *scheme_ignored)
error = true;
}
if (read || write || error) {
- LOG(" fd %*i: %s %s %s", max_fd / 10 + 1, i,
+ LOG(" fd %i: %s %s %s", i,
read ? "read" : " ",
write ? "write" : " ",
error ? "error" : " ");
diff --git a/render/layout.c b/render/layout.c
index b7d9e20..45d905f 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -3472,7 +3472,7 @@ void place_float_below(struct box *c, int width, int cx, int y,
} else if (left != 0 && right == 0) {
yy = left->y + left->height;
}
- } while (!((left == 0 && right == 0) || (c->width <= x1 - x0)));
+ } while ((left != 0 || right != 0) && (c->width > x1 - x0));
if (c->type == BOX_FLOAT_LEFT) {
c->x = x0;
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-604-g6d2a787
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/6d2a78738084a17d860a9...
...commit http://git.netsurf-browser.org/netsurf.git/commit/6d2a78738084a17d860a9eb...
...tree http://git.netsurf-browser.org/netsurf.git/tree/6d2a78738084a17d860a9eb96...
The branch, master has been updated
via 6d2a78738084a17d860a9eb96ada16150eeba14d (commit)
via 239f999936663c9832bc7569133e694c1ce72741 (commit)
via 1724e2835028daf90de80b151ab8fd4c3064fd02 (commit)
from 750677795ba1ca41627edd68a4de24e0d6c07a20 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=6d2a78738084a17d860...
commit 6d2a78738084a17d860a9eb96ada16150eeba14d
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Allocate deferred rectangles using itempools
On OS3 we use a normal memory pool instead
diff --git a/amiga/gui.c b/amiga/gui.c
index 3dc575c..09fc36b 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -3796,7 +3796,7 @@ gui_window_create(struct browser_window *bw,
NewList(&g->dllist);
g->deferred_rects = NewObjList();
- g->deferred_rects_pool = CreatePool(MEMF_PRIVATE, sizeof(struct rect), sizeof(struct rect));
+ g->deferred_rects_pool = ami_misc_itempool_create(sizeof(struct rect));
g->bw = bw;
g->scale = browser_window_get_scale(bw);
@@ -4447,7 +4447,7 @@ static void gui_window_destroy(struct gui_window *g)
ami_free_download_list(&g->dllist);
FreeObjList(g->deferred_rects);
- DeletePool(g->deferred_rects_pool);
+ ami_misc_itempool_delete(g->deferred_rects_pool);
gui_window_stop_throbber(g);
cur_gw = NULL;
@@ -4659,7 +4659,7 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
rect->x0, rect->y0, rect->x1, rect->y1);
}
nnode=(struct nsObject *)GetSucc((struct Node *)node);
- FreePooled(g->deferred_rects_pool, node->objstruct, sizeof(struct rect));
+ ami_misc_itempool_free(g->deferred_rects_pool, node->objstruct, sizeof(struct rect));
DelObjectNoFree(node);
} while((node = nnode));
@@ -4693,7 +4693,7 @@ static bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_re
(new_rect->x1 >= rect->x1) &&
(new_rect->y1 >= rect->y1)) {
LOG("Removing queued redraw that is a subset of new box redraw");
- FreePooled(mempool, node->objstruct, sizeof(struct rect));
+ ami_misc_itempool_free(mempool, node->objstruct, sizeof(struct rect));
DelObjectNoFree(node);
/* Don't return - we might find more */
}
@@ -4710,7 +4710,7 @@ static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect,
g->deferred_rects_pool)) {
- deferred_rect = AllocPooled(g->deferred_rects_pool, sizeof(struct rect));
+ deferred_rect = ami_misc_itempool_alloc(g->deferred_rects_pool, sizeof(struct rect));
CopyMem(rect, deferred_rect, sizeof(struct rect));
nsobj = AddObject(g->deferred_rects, AMINS_RECT);
nsobj->objstruct = deferred_rect;
diff --git a/amiga/misc.c b/amiga/misc.c
index 141994a..065909e 100755
--- a/amiga/misc.c
+++ b/amiga/misc.c
@@ -47,6 +47,47 @@ void *ami_misc_allocvec_clear(int size, UBYTE value)
#endif
}
+APTR ami_misc_itempool_create(int size)
+{
+#ifdef __amigaos4__
+ return AllocSysObjectTags(ASOT_ITEMPOOL,
+ ASOITEM_MFlags, MEMF_PRIVATE,
+ ASOITEM_ItemSize, size,
+ ASOITEM_GCPolicy, ITEMGC_AFTERCOUNT,
+ ASOITEM_GCParameter, 50,
+ TAG_DONE);
+#else
+ return CreatePool(MEMF_ANY, 2 * size, size);
+#endif
+}
+
+void ami_misc_itempool_delete(APTR pool)
+{
+#ifdef __amigaos4__
+ FreeSysObject(ASOT_ITEMPOOL, pool);
+#else
+ DeletePool(pool);
+#endif
+}
+
+APTR ami_misc_itempool_alloc(APTR pool, int size)
+{
+#ifdef __amigaos4__
+ return ItemPoolAlloc(pool);
+#else
+ return AllocPooled(pool, size);
+#endif
+}
+
+void ami_misc_itempool_free(APTR pool, APTR item, int size)
+{
+#ifdef __amigaos4__
+ return ItemPoolFree(pool, item);
+#else
+ return FreePooled(pool, item, size);
+#endif
+}
+
static LONG ami_misc_req(const char *message, uint32 type)
{
LONG ret = 0;
diff --git a/amiga/misc.h b/amiga/misc.h
index 66a6f1d..2544c77 100644
--- a/amiga/misc.h
+++ b/amiga/misc.h
@@ -24,6 +24,13 @@ extern struct gui_file_table *amiga_file_table;
struct Window;
void *ami_misc_allocvec_clear(int size, UBYTE value);
+
+/* Itempool cross-compatibility */
+APTR ami_misc_itempool_create(int size);
+void ami_misc_itempool_delete(APTR pool);
+APTR ami_misc_itempool_alloc(APTR pool, int size);
+void ami_misc_itempool_free(APTR pool, APTR item, int size);
+
char *translate_escape_chars(const char *s);
void ami_misc_fatal_error(const char *message);
int32 ami_warn_user_multi(const char *body,
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=239f999936663c9832b...
commit 239f999936663c9832bc7569133e694c1ce72741
Merge: 1724e28 7506777
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Merge branch 'master' of git://git.netsurf-browser.org/netsurf
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=1724e2835028daf90de...
commit 1724e2835028daf90de80b151ab8fd4c3064fd02
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Use a memory pool for deferred rects
diff --git a/amiga/font_diskfont.c b/amiga/font_diskfont.c
index 61f7773..eadd800 100644
--- a/amiga/font_diskfont.c
+++ b/amiga/font_diskfont.c
@@ -215,9 +215,9 @@ static bool amiga_bm_nsfont_split(const plot_font_style_t *fstyle,
ami_font_bm_close(bmfont);
return false;
}
-
+
offset = TextFit(glob->rp, localtext, (UWORD)strlen(localtext),
- &extent, NULL, 1, x, 32767);
+ &extent, NULL, 1, (UWORD)x, 32767);
co = offset;
charp = localtext + co;
diff --git a/amiga/gui.c b/amiga/gui.c
index 8370636..4e68530 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -3796,6 +3796,7 @@ gui_window_create(struct browser_window *bw,
NewList(&g->dllist);
g->deferred_rects = NewObjList();
+ g->deferred_rects_pool = CreatePool(MEMF_PRIVATE, sizeof(struct rect), sizeof(struct rect));
g->bw = bw;
g->scale = browser_window_get_scale(bw);
@@ -4446,6 +4447,7 @@ static void gui_window_destroy(struct gui_window *g)
ami_free_download_list(&g->dllist);
FreeObjList(g->deferred_rects);
+ DeletePool(g->deferred_rects_pool);
gui_window_stop_throbber(g);
cur_gw = NULL;
@@ -4657,17 +4659,18 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
rect->x0, rect->y0, rect->x1, rect->y1);
}
nnode=(struct nsObject *)GetSucc((struct Node *)node);
- DelObject(node);
+ FreePooled(g->deferred_rects_pool, node->objstruct, sizeof(struct rect));
+ DelObjectNoFree(node);
} while((node = nnode));
if(draw == true) ami_reset_pointer(g->shared);
}
static bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_rects,
- const struct rect *new_rect)
+ const struct rect *new_rect, APTR mempool)
{
-struct nsObject *node;
-struct nsObject *nnode;
+ struct nsObject *node;
+ struct nsObject *nnode;
struct rect *rect;
if(IsMinListEmpty(deferred_rects)) return true;
@@ -4690,7 +4693,8 @@ struct nsObject *nnode;
(new_rect->x1 >= rect->x1) &&
(new_rect->y1 >= rect->y1)) {
LOG("Removing queued redraw that is a subset of new box redraw");
- DelObject(node);
+ FreePooled(mempool, node->objstruct, sizeof(struct rect));
+ DelObjectNoFree(node);
/* Don't return - we might find more */
}
} while((node = nnode));
@@ -4704,8 +4708,9 @@ static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
struct rect *deferred_rect;
if(!g) return;
- if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect)) {
- deferred_rect = AllocVecTagList(sizeof(struct rect), NULL);
+ if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect,
+ g->deferred_rects_pool)) {
+ deferred_rect = AllocPooled(g->deferred_rects_pool, sizeof(struct rect));
CopyMem(rect, deferred_rect, sizeof(struct rect));
nsobj = AddObject(g->deferred_rects, AMINS_RECT);
nsobj->objstruct = deferred_rect;
diff --git a/amiga/gui.h b/amiga/gui.h
index 86dedcb..4369919 100644
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -162,6 +162,7 @@ struct gui_window
hlcache_handle *favicon;
bool throbbing;
char *tabtitle;
+ APTR deferred_rects_pool;
struct MinList *deferred_rects;
struct browser_window *bw;
float scale;
-----------------------------------------------------------------------
Summary of changes:
amiga/font_diskfont.c | 4 ++--
amiga/gui.c | 19 ++++++++++++-------
amiga/gui.h | 1 +
amiga/misc.c | 41 +++++++++++++++++++++++++++++++++++++++++
amiga/misc.h | 7 +++++++
5 files changed, 63 insertions(+), 9 deletions(-)
diff --git a/amiga/font_diskfont.c b/amiga/font_diskfont.c
index bd1e1f9..20b6985 100644
--- a/amiga/font_diskfont.c
+++ b/amiga/font_diskfont.c
@@ -218,9 +218,9 @@ static bool amiga_bm_nsfont_split(const plot_font_style_t *fstyle,
ami_font_bm_close(bmfont);
return false;
}
-
+
offset = TextFit(glob->rp, localtext, (UWORD)strlen(localtext),
- &extent, NULL, 1, x, 32767);
+ &extent, NULL, 1, (UWORD)x, 32767);
co = offset;
charp = localtext + co;
diff --git a/amiga/gui.c b/amiga/gui.c
index 768b406..09fc36b 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -3796,6 +3796,7 @@ gui_window_create(struct browser_window *bw,
NewList(&g->dllist);
g->deferred_rects = NewObjList();
+ g->deferred_rects_pool = ami_misc_itempool_create(sizeof(struct rect));
g->bw = bw;
g->scale = browser_window_get_scale(bw);
@@ -4446,6 +4447,7 @@ static void gui_window_destroy(struct gui_window *g)
ami_free_download_list(&g->dllist);
FreeObjList(g->deferred_rects);
+ ami_misc_itempool_delete(g->deferred_rects_pool);
gui_window_stop_throbber(g);
cur_gw = NULL;
@@ -4657,17 +4659,18 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
rect->x0, rect->y0, rect->x1, rect->y1);
}
nnode=(struct nsObject *)GetSucc((struct Node *)node);
- DelObject(node);
+ ami_misc_itempool_free(g->deferred_rects_pool, node->objstruct, sizeof(struct rect));
+ DelObjectNoFree(node);
} while((node = nnode));
if(draw == true) ami_reset_pointer(g->shared);
}
static bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_rects,
- const struct rect *new_rect)
+ const struct rect *new_rect, APTR mempool)
{
-struct nsObject *node;
-struct nsObject *nnode;
+ struct nsObject *node;
+ struct nsObject *nnode;
struct rect *rect;
if(IsMinListEmpty(deferred_rects)) return true;
@@ -4690,7 +4693,8 @@ struct nsObject *nnode;
(new_rect->x1 >= rect->x1) &&
(new_rect->y1 >= rect->y1)) {
LOG("Removing queued redraw that is a subset of new box redraw");
- DelObject(node);
+ ami_misc_itempool_free(mempool, node->objstruct, sizeof(struct rect));
+ DelObjectNoFree(node);
/* Don't return - we might find more */
}
} while((node = nnode));
@@ -4704,8 +4708,9 @@ static void gui_window_update_box(struct gui_window *g, const struct rect *rect)
struct rect *deferred_rect;
if(!g) return;
- if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect)) {
- deferred_rect = AllocVecTagList(sizeof(struct rect), NULL);
+ if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect,
+ g->deferred_rects_pool)) {
+ deferred_rect = ami_misc_itempool_alloc(g->deferred_rects_pool, sizeof(struct rect));
CopyMem(rect, deferred_rect, sizeof(struct rect));
nsobj = AddObject(g->deferred_rects, AMINS_RECT);
nsobj->objstruct = deferred_rect;
diff --git a/amiga/gui.h b/amiga/gui.h
index 86dedcb..4369919 100644
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -162,6 +162,7 @@ struct gui_window
hlcache_handle *favicon;
bool throbbing;
char *tabtitle;
+ APTR deferred_rects_pool;
struct MinList *deferred_rects;
struct browser_window *bw;
float scale;
diff --git a/amiga/misc.c b/amiga/misc.c
index 141994a..065909e 100755
--- a/amiga/misc.c
+++ b/amiga/misc.c
@@ -47,6 +47,47 @@ void *ami_misc_allocvec_clear(int size, UBYTE value)
#endif
}
+APTR ami_misc_itempool_create(int size)
+{
+#ifdef __amigaos4__
+ return AllocSysObjectTags(ASOT_ITEMPOOL,
+ ASOITEM_MFlags, MEMF_PRIVATE,
+ ASOITEM_ItemSize, size,
+ ASOITEM_GCPolicy, ITEMGC_AFTERCOUNT,
+ ASOITEM_GCParameter, 50,
+ TAG_DONE);
+#else
+ return CreatePool(MEMF_ANY, 2 * size, size);
+#endif
+}
+
+void ami_misc_itempool_delete(APTR pool)
+{
+#ifdef __amigaos4__
+ FreeSysObject(ASOT_ITEMPOOL, pool);
+#else
+ DeletePool(pool);
+#endif
+}
+
+APTR ami_misc_itempool_alloc(APTR pool, int size)
+{
+#ifdef __amigaos4__
+ return ItemPoolAlloc(pool);
+#else
+ return AllocPooled(pool, size);
+#endif
+}
+
+void ami_misc_itempool_free(APTR pool, APTR item, int size)
+{
+#ifdef __amigaos4__
+ return ItemPoolFree(pool, item);
+#else
+ return FreePooled(pool, item, size);
+#endif
+}
+
static LONG ami_misc_req(const char *message, uint32 type)
{
LONG ret = 0;
diff --git a/amiga/misc.h b/amiga/misc.h
index 66a6f1d..2544c77 100644
--- a/amiga/misc.h
+++ b/amiga/misc.h
@@ -24,6 +24,13 @@ extern struct gui_file_table *amiga_file_table;
struct Window;
void *ami_misc_allocvec_clear(int size, UBYTE value);
+
+/* Itempool cross-compatibility */
+APTR ami_misc_itempool_create(int size);
+void ami_misc_itempool_delete(APTR pool);
+APTR ami_misc_itempool_alloc(APTR pool, int size);
+void ami_misc_itempool_free(APTR pool, APTR item, int size);
+
char *translate_escape_chars(const char *s);
void ami_misc_fatal_error(const char *message);
int32 ami_warn_user_multi(const char *body,
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-601-g7506777
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/750677795ba1ca41627ed...
...commit http://git.netsurf-browser.org/netsurf.git/commit/750677795ba1ca41627edd6...
...tree http://git.netsurf-browser.org/netsurf.git/tree/750677795ba1ca41627edd68a...
The branch, master has been updated
via 750677795ba1ca41627edd68a4de24e0d6c07a20 (commit)
from a774e9473df785f77e86e69a7d450324a2aa03a3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=750677795ba1ca41627...
commit 750677795ba1ca41627edd68a4de24e0d6c07a20
Author: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Commit: Chris Young <chris(a)unsatisfactorysoftware.co.uk>
Alloc font name on the stack
diff --git a/amiga/font_diskfont.c b/amiga/font_diskfont.c
index 7b88199..bd1e1f9 100644
--- a/amiga/font_diskfont.c
+++ b/amiga/font_diskfont.c
@@ -35,11 +35,14 @@
#include "amiga/gui.h"
#include "amiga/utf8.h"
+#define MAX_FONT_NAME_SIZE 33
+
static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_style_t *fstyle)
{
struct TextFont *bmfont = NULL;
struct TextAttr tattr;
- char *fontname, *font;
+ char *fontname;
+ char font[MAX_FONT_NAME_SIZE];
if(rp == NULL) return NULL;
@@ -78,14 +81,12 @@ static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_st
if (fstyle->weight >= 700)
tattr.ta_Style |= FSF_BOLD;
- if((font = ASPrintf("%s.font", fontname))) {
- tattr.ta_Name = font;
- tattr.ta_YSize = fstyle->size / FONT_SIZE_SCALE;
- LOG("font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
- if((bmfont = OpenDiskFont(&tattr))) {
- SetRPAttrs(rp, RPTAG_Font, bmfont, TAG_DONE);
- }
- FreeVec(font);
+ snprintf(font, MAX_FONT_NAME_SIZE, "%s.font", fontname);
+ tattr.ta_Name = font;
+ tattr.ta_YSize = fstyle->size / FONT_SIZE_SCALE;
+ LOG("font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
+ if((bmfont = OpenDiskFont(&tattr))) {
+ SetRPAttrs(rp, RPTAG_Font, bmfont, TAG_DONE);
}
return bmfont;
-----------------------------------------------------------------------
Summary of changes:
amiga/font_diskfont.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/amiga/font_diskfont.c b/amiga/font_diskfont.c
index 7b88199..bd1e1f9 100644
--- a/amiga/font_diskfont.c
+++ b/amiga/font_diskfont.c
@@ -35,11 +35,14 @@
#include "amiga/gui.h"
#include "amiga/utf8.h"
+#define MAX_FONT_NAME_SIZE 33
+
static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_style_t *fstyle)
{
struct TextFont *bmfont = NULL;
struct TextAttr tattr;
- char *fontname, *font;
+ char *fontname;
+ char font[MAX_FONT_NAME_SIZE];
if(rp == NULL) return NULL;
@@ -78,14 +81,12 @@ static struct TextFont *ami_font_bm_open(struct RastPort *rp, const plot_font_st
if (fstyle->weight >= 700)
tattr.ta_Style |= FSF_BOLD;
- if((font = ASPrintf("%s.font", fontname))) {
- tattr.ta_Name = font;
- tattr.ta_YSize = fstyle->size / FONT_SIZE_SCALE;
- LOG("font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
- if((bmfont = OpenDiskFont(&tattr))) {
- SetRPAttrs(rp, RPTAG_Font, bmfont, TAG_DONE);
- }
- FreeVec(font);
+ snprintf(font, MAX_FONT_NAME_SIZE, "%s.font", fontname);
+ tattr.ta_Name = font;
+ tattr.ta_YSize = fstyle->size / FONT_SIZE_SCALE;
+ LOG("font: %s/%d", tattr.ta_Name, tattr.ta_YSize);
+ if((bmfont = OpenDiskFont(&tattr))) {
+ SetRPAttrs(rp, RPTAG_Font, bmfont, TAG_DONE);
}
return bmfont;
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-600-ga774e94
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/a774e9473df785f77e86e...
...commit http://git.netsurf-browser.org/netsurf.git/commit/a774e9473df785f77e86e69...
...tree http://git.netsurf-browser.org/netsurf.git/tree/a774e9473df785f77e86e69a7...
The branch, master has been updated
via a774e9473df785f77e86e69a7d450324a2aa03a3 (commit)
from 0bbc03c5776fdcf6006bb0447341f82967d2b5d1 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=a774e9473df785f77e8...
commit a774e9473df785f77e86e69a7d450324a2aa03a3
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Make use of cached place float below value earlier.
diff --git a/render/layout.c b/render/layout.c
index f069cd6..b7d9e20 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2775,7 +2775,8 @@ bool layout_line(struct box *first, int *width, int *y,
left == 0 && right == 0)) &&
(!place_below ||
(left == 0 && right == 0 && x == 0)) &&
- cy >= cont->clear_level) {
+ cy >= cont->clear_level &&
+ cy >= cont->cached_place_below_level) {
/* + not cleared or,
* cleared and there are no floats to clear
* + fits without needing to be placed below or,
@@ -2800,6 +2801,9 @@ bool layout_line(struct box *first, int *width, int *y,
/* place below into next available space */
int fcy = (cy > cont->clear_level) ? cy :
cont->clear_level;
+ fcy = (fcy > cont->cached_place_below_level) ?
+ fcy :
+ cont->cached_place_below_level;
fy = (fy > fcy) ? fy : fcy;
fy = (fy == cy) ? fy + height : fy;
-----------------------------------------------------------------------
Summary of changes:
render/layout.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/render/layout.c b/render/layout.c
index f069cd6..b7d9e20 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2775,7 +2775,8 @@ bool layout_line(struct box *first, int *width, int *y,
left == 0 && right == 0)) &&
(!place_below ||
(left == 0 && right == 0 && x == 0)) &&
- cy >= cont->clear_level) {
+ cy >= cont->clear_level &&
+ cy >= cont->cached_place_below_level) {
/* + not cleared or,
* cleared and there are no floats to clear
* + fits without needing to be placed below or,
@@ -2800,6 +2801,9 @@ bool layout_line(struct box *first, int *width, int *y,
/* place below into next available space */
int fcy = (cy > cont->clear_level) ? cy :
cont->clear_level;
+ fcy = (fcy > cont->cached_place_below_level) ?
+ fcy :
+ cont->cached_place_below_level;
fy = (fy > fcy) ? fy : fcy;
fy = (fy == cy) ? fy + height : fy;
--
NetSurf Browser
7 years, 8 months
netsurf: branch master updated. release/3.3-599-g0bbc03c
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/netsurf.git/shortlog/0bbc03c5776fdcf6006bb...
...commit http://git.netsurf-browser.org/netsurf.git/commit/0bbc03c5776fdcf6006bb04...
...tree http://git.netsurf-browser.org/netsurf.git/tree/0bbc03c5776fdcf6006bb0447...
The branch, master has been updated
via 0bbc03c5776fdcf6006bb0447341f82967d2b5d1 (commit)
via c13080d96c41f42ce58b063a7883cac191d6c64b (commit)
via 948a93041dba3ec95dbb04bee523a9bbd4ca9918 (commit)
via 38e6fd1b74f2bc6677398d5167aff68bf163a286 (commit)
via 018adc2f5e332609dfbd71b4c29951dd80f9f67e (commit)
from 54c153246ca76bdd3acb7667fe1106f04a0a9856 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=0bbc03c5776fdcf6006...
commit 0bbc03c5776fdcf6006bb0447341f82967d2b5d1
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Cache place below level, to avoid pointless calls to find_sides.
diff --git a/render/box.c b/render/box.c
index 0d92b59..7111f1a 100644
--- a/render/box.c
+++ b/render/box.c
@@ -156,6 +156,7 @@ struct box * box_create(css_select_results *styles, css_computed_style *style,
box->float_children = NULL;
box->float_container = NULL;
box->next_float = NULL;
+ box->cached_place_below_level = 0;
box->list_marker = NULL;
box->col = NULL;
box->gadget = NULL;
diff --git a/render/box.h b/render/box.h
index 8e5aef8..5501f88 100644
--- a/render/box.h
+++ b/render/box.h
@@ -244,6 +244,9 @@ struct box {
* This is used only for boxes with float_children */
int clear_level;
+ /* Level below which floats have been placed. */
+ int cached_place_below_level;
+
/** List marker box if this is a list-item, or 0. */
struct box *list_marker;
diff --git a/render/layout.c b/render/layout.c
index 95f3681..f069cd6 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -227,6 +227,7 @@ bool layout_block_context(struct box *block, int viewport_height,
assert(block->width != AUTO);
block->float_children = NULL;
+ block->cached_place_below_level = 0;
block->clear_level = 0;
/* special case if the block contains an object */
@@ -2737,6 +2738,7 @@ bool layout_line(struct box *first, int *width, int *y,
d = b->children;
d->float_children = 0;
+ d->cached_place_below_level = 0;
b->float_container = d->float_container = cont;
if (!layout_float(d, *width, content))
@@ -3439,10 +3441,13 @@ bool layout_float(struct box *b, int width, html_content *content)
void place_float_below(struct box *c, int width, int cx, int y,
struct box *cont)
{
- int x0, x1, yy = y;
+ int x0, x1, yy;
struct box *left;
struct box *right;
+ yy = y > cont->cached_place_below_level ?
+ y : cont->cached_place_below_level;
+
#ifdef LAYOUT_DEBUG
LOG("c %p, width %i, cx %i, y %i, cont %p", c, width, cx, y, cont);
#endif
@@ -3471,6 +3476,7 @@ void place_float_below(struct box *c, int width, int cx, int y,
c->x = x1 - c->width;
}
c->y = y;
+ cont->cached_place_below_level = y;
}
@@ -3864,6 +3870,7 @@ bool layout_table(struct box *table, int available_width,
c->padding[RIGHT] -
c->border[RIGHT].width;
c->float_children = 0;
+ c->cached_place_below_level = 0;
c->height = AUTO;
if (!layout_block_context(c, -1, content)) {
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=c13080d96c41f42ce58...
commit c13080d96c41f42ce58b063a7883cac191d6c64b
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Optimise white hot find_sides to take advantage of sorted float_children.
Now we have an early exit when we get to the floats above the area we're
interested in.
diff --git a/render/layout.c b/render/layout.c
index f1e321e..95f3681 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2062,8 +2062,14 @@ void find_sides(struct box *fl, int y0, int y1,
*left = *right = 0;
for (; fl; fl = fl->next_float) {
- fy0 = fl->y;
fy1 = fl->y + fl->height;
+ if (fy1 < y0) {
+ /* Floats are sorted in order of decreasing bottom pos.
+ * Past here, all floats will be too high to concern us.
+ */
+ return;
+ }
+ fy0 = fl->y;
if (y0 < fy1 && fy0 <= y1) {
if (fl->type == BOX_FLOAT_LEFT) {
fx1 = fl->x + fl->width;
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=948a93041dba3ec95db...
commit 948a93041dba3ec95dbb04bee523a9bbd4ca9918
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Sort float_children of containers by their bottom edge.
diff --git a/render/layout.c b/render/layout.c
index 4381f29..f1e321e 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2092,11 +2092,36 @@ void find_sides(struct box *fl, int y0, int y1,
*
* \param cont block formatting context block, used to contain float
* \param b box to add to float
+ *
+ * This sorts floats in order of descending bottom edges.
*/
static void add_float_to_container(struct box *cont, struct box *b)
{
- b->next_float = cont->float_children;
- cont->float_children = b;
+ struct box *box = cont->float_children;
+ int b_bottom = b->y + b->height;
+
+ assert(b->type == BOX_FLOAT_LEFT || b->type == BOX_FLOAT_RIGHT);
+
+ if (box == NULL) {
+ /* No other float children */
+ b->next_float = NULL;
+ cont->float_children = b;
+ return;
+ } else if (b_bottom >= box->y + box->height) {
+ /* Goes at start of list */
+ b->next_float = cont->float_children;
+ cont->float_children = b;
+ } else {
+ struct box *prev = NULL;
+ while (box != NULL && b_bottom < box->y + box->height) {
+ prev = box;
+ box = box->next_float;
+ }
+ if (prev != NULL) {
+ b->next_float = prev->next_float;
+ prev->next_float = b;
+ }
+ }
}
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=38e6fd1b74f2bc66773...
commit 38e6fd1b74f2bc6677398d5167aff68bf163a286
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Split adding float to a container out into separate function.
diff --git a/render/layout.c b/render/layout.c
index 008be24..4381f29 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2088,6 +2088,19 @@ void find_sides(struct box *fl, int y0, int y1,
/**
+ * Insert a float into a container.
+ *
+ * \param cont block formatting context block, used to contain float
+ * \param b box to add to float
+ */
+static void add_float_to_container(struct box *cont, struct box *b)
+{
+ b->next_float = cont->float_children;
+ cont->float_children = b;
+}
+
+
+/**
* Layout lines of text or inline boxes with floats.
*
* \param inline_container inline container box
@@ -2787,16 +2800,7 @@ bool layout_line(struct box *first, int *width, int *y,
else
right = b;
}
- if (cont->float_children == b) {
-#ifdef LAYOUT_DEBUG
- LOG("float %p already placed", b);
-#endif
-
- box_dump(stderr, cont, 0, true);
- assert(0);
- }
- b->next_float = cont->float_children;
- cont->float_children = b;
+ add_float_to_container(cont, b);
split_box = 0;
}
commitdiff http://git.netsurf-browser.org/netsurf.git/commit/?id=018adc2f5e332609dfb...
commit 018adc2f5e332609dfbd71b4c29951dd80f9f67e
Author: Michael Drake <tlsa(a)netsurf-browser.org>
Commit: Michael Drake <tlsa(a)netsurf-browser.org>
Remove redundant condition in white hot path.
diff --git a/render/layout.c b/render/layout.c
index 7905eab..008be24 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2071,7 +2071,7 @@ void find_sides(struct box *fl, int y0, int y1,
*x0 = fx1;
*left = fl;
}
- } else if (fl->type == BOX_FLOAT_RIGHT) {
+ } else {
fx0 = fl->x;
if (fx0 < *x1) {
*x1 = fx0;
-----------------------------------------------------------------------
Summary of changes:
render/box.c | 1 +
render/box.h | 3 +++
render/layout.c | 68 ++++++++++++++++++++++++++++++++++++++++++++-----------
3 files changed, 59 insertions(+), 13 deletions(-)
diff --git a/render/box.c b/render/box.c
index 0d92b59..7111f1a 100644
--- a/render/box.c
+++ b/render/box.c
@@ -156,6 +156,7 @@ struct box * box_create(css_select_results *styles, css_computed_style *style,
box->float_children = NULL;
box->float_container = NULL;
box->next_float = NULL;
+ box->cached_place_below_level = 0;
box->list_marker = NULL;
box->col = NULL;
box->gadget = NULL;
diff --git a/render/box.h b/render/box.h
index 8e5aef8..5501f88 100644
--- a/render/box.h
+++ b/render/box.h
@@ -244,6 +244,9 @@ struct box {
* This is used only for boxes with float_children */
int clear_level;
+ /* Level below which floats have been placed. */
+ int cached_place_below_level;
+
/** List marker box if this is a list-item, or 0. */
struct box *list_marker;
diff --git a/render/layout.c b/render/layout.c
index 7905eab..f069cd6 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -227,6 +227,7 @@ bool layout_block_context(struct box *block, int viewport_height,
assert(block->width != AUTO);
block->float_children = NULL;
+ block->cached_place_below_level = 0;
block->clear_level = 0;
/* special case if the block contains an object */
@@ -2062,8 +2063,14 @@ void find_sides(struct box *fl, int y0, int y1,
*left = *right = 0;
for (; fl; fl = fl->next_float) {
- fy0 = fl->y;
fy1 = fl->y + fl->height;
+ if (fy1 < y0) {
+ /* Floats are sorted in order of decreasing bottom pos.
+ * Past here, all floats will be too high to concern us.
+ */
+ return;
+ }
+ fy0 = fl->y;
if (y0 < fy1 && fy0 <= y1) {
if (fl->type == BOX_FLOAT_LEFT) {
fx1 = fl->x + fl->width;
@@ -2071,7 +2078,7 @@ void find_sides(struct box *fl, int y0, int y1,
*x0 = fx1;
*left = fl;
}
- } else if (fl->type == BOX_FLOAT_RIGHT) {
+ } else {
fx0 = fl->x;
if (fx0 < *x1) {
*x1 = fx0;
@@ -2088,6 +2095,44 @@ void find_sides(struct box *fl, int y0, int y1,
/**
+ * Insert a float into a container.
+ *
+ * \param cont block formatting context block, used to contain float
+ * \param b box to add to float
+ *
+ * This sorts floats in order of descending bottom edges.
+ */
+static void add_float_to_container(struct box *cont, struct box *b)
+{
+ struct box *box = cont->float_children;
+ int b_bottom = b->y + b->height;
+
+ assert(b->type == BOX_FLOAT_LEFT || b->type == BOX_FLOAT_RIGHT);
+
+ if (box == NULL) {
+ /* No other float children */
+ b->next_float = NULL;
+ cont->float_children = b;
+ return;
+ } else if (b_bottom >= box->y + box->height) {
+ /* Goes at start of list */
+ b->next_float = cont->float_children;
+ cont->float_children = b;
+ } else {
+ struct box *prev = NULL;
+ while (box != NULL && b_bottom < box->y + box->height) {
+ prev = box;
+ box = box->next_float;
+ }
+ if (prev != NULL) {
+ b->next_float = prev->next_float;
+ prev->next_float = b;
+ }
+ }
+}
+
+
+/**
* Layout lines of text or inline boxes with floats.
*
* \param inline_container inline container box
@@ -2693,6 +2738,7 @@ bool layout_line(struct box *first, int *width, int *y,
d = b->children;
d->float_children = 0;
+ d->cached_place_below_level = 0;
b->float_container = d->float_container = cont;
if (!layout_float(d, *width, content))
@@ -2787,16 +2833,7 @@ bool layout_line(struct box *first, int *width, int *y,
else
right = b;
}
- if (cont->float_children == b) {
-#ifdef LAYOUT_DEBUG
- LOG("float %p already placed", b);
-#endif
-
- box_dump(stderr, cont, 0, true);
- assert(0);
- }
- b->next_float = cont->float_children;
- cont->float_children = b;
+ add_float_to_container(cont, b);
split_box = 0;
}
@@ -3404,10 +3441,13 @@ bool layout_float(struct box *b, int width, html_content *content)
void place_float_below(struct box *c, int width, int cx, int y,
struct box *cont)
{
- int x0, x1, yy = y;
+ int x0, x1, yy;
struct box *left;
struct box *right;
+ yy = y > cont->cached_place_below_level ?
+ y : cont->cached_place_below_level;
+
#ifdef LAYOUT_DEBUG
LOG("c %p, width %i, cx %i, y %i, cont %p", c, width, cx, y, cont);
#endif
@@ -3436,6 +3476,7 @@ void place_float_below(struct box *c, int width, int cx, int y,
c->x = x1 - c->width;
}
c->y = y;
+ cont->cached_place_below_level = y;
}
@@ -3829,6 +3870,7 @@ bool layout_table(struct box *table, int available_width,
c->padding[RIGHT] -
c->border[RIGHT].width;
c->float_children = 0;
+ c->cached_place_below_level = 0;
c->height = AUTO;
if (!layout_block_context(c, -1, content)) {
--
NetSurf Browser
7 years, 8 months
libutf8proc: branch master updated. release/1.3.1-2-gf72f26b
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libutf8proc.git/shortlog/f72f26b6fbbec2035...
...commit http://git.netsurf-browser.org/libutf8proc.git/commit/f72f26b6fbbec203544...
...tree http://git.netsurf-browser.org/libutf8proc.git/tree/f72f26b6fbbec203544ff...
The branch, master has been updated
via f72f26b6fbbec203544ffdd02a1cdc2120d4aadc (commit)
from 825a412308974f64b64804ee18cdbade3832c8ea (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libutf8proc.git/commit/?id=f72f26b6fbbec20...
commit f72f26b6fbbec203544ffdd02a1cdc2120d4aadc
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Fix windows build symbol names
This allows windows apps to link against the static libutf8proc
builds. I think that the actual fix is to sort out why the header is
misdefining the dll export and import macros.
diff --git a/libutf8proc.pc.in b/libutf8proc.pc.in
index f4645c0..be03a5a 100644
--- a/libutf8proc.pc.in
+++ b/libutf8proc.pc.in
@@ -7,4 +7,4 @@ Name: libutf8proc
Description: UTF8 processing
Version: VERSION
Libs: -L${libdir} -lutf8proc
-Cflags: -I${includedir}
+Cflags: -I${includedir} -DUTF8PROC_EXPORTS
-----------------------------------------------------------------------
Summary of changes:
libutf8proc.pc.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libutf8proc.pc.in b/libutf8proc.pc.in
index f4645c0..be03a5a 100644
--- a/libutf8proc.pc.in
+++ b/libutf8proc.pc.in
@@ -7,4 +7,4 @@ Name: libutf8proc
Description: UTF8 processing
Version: VERSION
Libs: -L${libdir} -lutf8proc
-Cflags: -I${includedir}
+Cflags: -I${includedir} -DUTF8PROC_EXPORTS
--
UTF8 Processing library (import)
7 years, 8 months
libutf8proc: branch master updated. release/1.3.1-1-g825a412
by NetSurf Browser Project
Gitweb links:
...log http://git.netsurf-browser.org/libutf8proc.git/shortlog/825a412308974f64b...
...commit http://git.netsurf-browser.org/libutf8proc.git/commit/825a412308974f64b64...
...tree http://git.netsurf-browser.org/libutf8proc.git/tree/825a412308974f64b6480...
The branch, master has been updated
via 825a412308974f64b64804ee18cdbade3832c8ea (commit)
from 6037f3a30fd6bf78eee1276d2720ed6ce636c242 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff http://git.netsurf-browser.org/libutf8proc.git/commit/?id=825a412308974f6...
commit 825a412308974f64b64804ee18cdbade3832c8ea
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Add missing compiler flag that prevents compilation on win32
diff --git a/Makefile b/Makefile
index 716d9fa..6f6b2f4 100644
--- a/Makefile
+++ b/Makefile
@@ -24,6 +24,7 @@ WARNFLAGS := -Wall -W -Wundef -Wpointer-arith -Wcast-align \
-Wmissing-declarations -Wnested-externs
CFLAGS := -I$(CURDIR)/include/libutf8proc/ -I$(CURDIR)/src \
+ -DUTF8PROC_EXPORTS \
$(WARNFLAGS) $(CFLAGS)
ifneq ($(GCCVER),2)
CFLAGS := $(CFLAGS) -std=c99
-----------------------------------------------------------------------
Summary of changes:
Makefile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Makefile b/Makefile
index 716d9fa..6f6b2f4 100644
--- a/Makefile
+++ b/Makefile
@@ -24,6 +24,7 @@ WARNFLAGS := -Wall -W -Wundef -Wpointer-arith -Wcast-align \
-Wmissing-declarations -Wnested-externs
CFLAGS := -I$(CURDIR)/include/libutf8proc/ -I$(CURDIR)/src \
+ -DUTF8PROC_EXPORTS \
$(WARNFLAGS) $(CFLAGS)
ifneq ($(GCCVER),2)
CFLAGS := $(CFLAGS) -std=c99
--
UTF8 Processing library (import)
7 years, 8 months