Re: multithreading.
"Chris Thomasson" <cristom@comcast.net> wrote in message
news:nOedncvAJsfHom3anZ2dnUVZ_tWtnZ2d@comcast.com...
"Jon Harrop" <usenet@jdh30.plus.com> wrote in message
[...]
I know I can compete, and most likely beat, a traditional GC with
handcrafted implementations that C++ give me the freedom to work with.
I admire your faith but I would like to see some evidence to back up such
claims because they run contrary to common wisdom accumulated over the
past
few decades.
Here is a stupid contrived example:
________________________________________________________
struct object {
object* cache_next;
bool cached;
[...];
};
#define OBJ_DEPTH() 100000
static object g_obj_buf[OBJ_DEPTH()] = { NULL, true };
static object* g_obj_cache = NULL;
void object_prime() {
for(int i = 0; i < OBJ_DEPTH(); ++i) {
g_obj_buf[i].cache_next = g_obj_cache;
g_obj_cache = &g_obj_buf[i];
}
}
WHOOPS! There are several STUPID TYPO's in there. Well, that's what I get
for typing this out in the newsreader! Anyway, here is the full code for the
very simplistic object cache that will compile with a C compiler:
______________________________________________________________________
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct object_s object;
struct object_s {
object* cache_next;
int cached;
};
#define OBJ_DEPTH() 100000
static object g_obj_buf[OBJ_DEPTH()] = { { NULL } };
static object* g_obj_cache = NULL;
void object_prime(void) {
int i;
for(i = 0; i < OBJ_DEPTH(); ++i) {
g_obj_buf[i].cache_next = g_obj_cache;
g_obj_buf[i].cached = 1;
g_obj_cache = &g_obj_buf[i];
}
}
object* object_pop(void) {
object* obj = g_obj_cache;
if (! obj) {
if (obj = malloc(sizeof(*obj))) {
obj->cache_next = NULL;
obj->cached = 0;
}
} else {
g_obj_cache = obj->cache_next;
}
return obj;
}
void object_push(object* obj) {
if (obj) {
if (obj->cached) {
obj->cache_next = g_obj_cache;
g_obj_cache = obj;
} else {
free(obj);
}
}
}
void foo(unsigned long int depth) {
for (;depth > 0; --depth) {
object* foo = object_pop();
object_push(foo);
}
}
int main(void) {
object_prime();
foo(5);
/*---------------------------------------------------------*/
puts("\n\n\n______________________________________________\n\
press <ENTER> to exit...");
getchar();
return 0;
}
______________________________________________________________________
Sorry about that non-sense Jon!
;^(...
BTW, thank you for not flaming me too bad on this! ACK!