--- a/finderrors.c Mon Apr 21 23:35:49 2008 -0400
+++ b/finderrors.c Mon Apr 21 23:44:51 2008 -0400
@@ -2,7 +2,6 @@
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
-#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
@@ -18,31 +17,7 @@
#include <glext.h>
#endif
-static const char *profile = NULL;
-static volatile int die_threads = 0;
-static pthread_mutex_t grab_mutex;
-static pthread_mutex_t report_mutex;
-
-typedef struct ShaderBytecode
-{
- void *name;
- void *data;
- struct ShaderBytecode *next;
-} ShaderBytecode;
-
-static volatile ShaderBytecode *gbytecode = NULL;
-static volatile ShaderBytecode *gparsed = NULL;
-
-static void report(const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- pthread_mutex_lock(&report_mutex);
- vprintf(fmt, ap);
- pthread_mutex_unlock(&report_mutex);
- va_end(ap);
-} // report
-
+#define report printf
static int compile_shader(const char *fname, const MOJOSHADER_parseData *pd)
{
@@ -90,57 +65,13 @@
} // compile_shader
-static void *worker(void *unused)
-{
- unsigned char buf[1024 * 256];
- while (!die_threads)
- {
- ShaderBytecode *my_bytecode = NULL;
- pthread_mutex_lock(&grab_mutex);
- if (gbytecode == NULL)
- die_threads = 1;
- else
- {
- my_bytecode = (ShaderBytecode *) gbytecode;
- gbytecode = gbytecode->next;
- } // else
- pthread_mutex_unlock(&grab_mutex);
-
- if (my_bytecode == NULL)
- break;
-
- const char *fname = (const char *) my_bytecode->name;
- FILE *io = fopen(fname, "rb");
- if (io == NULL)
- report("FAIL: %s fopen() failed.\n", fname);
- else
- {
- int rc = fread(buf, 1, sizeof (buf), io);
- fclose(io);
- if (rc == -1)
- report("FAIL: %s %s\n", fname, strerror(errno));
- else
- my_bytecode->data = (void *) MOJOSHADER_parse(profile, buf, rc, 0, 0, 0);
-
- pthread_mutex_lock(&grab_mutex);
- my_bytecode->next = (ShaderBytecode *) gparsed;
- gparsed = my_bytecode;
- pthread_mutex_unlock(&grab_mutex);
- } // else
- } // while
-
- return NULL;
-} // worker
-
-
-static int do_dir(const char *dname)
+static int do_dir(const char *dname, const char *profile)
{
const int dirlen = strlen(dname) + 1;
int total = 0;
DIR *dirp = opendir(dname);
if (dirp != NULL)
{
- ShaderBytecode *bytecode = NULL;
struct dirent *dent;
while ((dent = readdir(dirp)) != NULL)
{
@@ -148,12 +79,34 @@
continue;
total++;
- bytecode = (ShaderBytecode *) malloc(sizeof (ShaderBytecode));
- bytecode->data = NULL;
- bytecode->name = malloc(strlen(dent->d_name) + dirlen);
- sprintf((char *) bytecode->name, "%s/%s", dname, dent->d_name);
- bytecode->next = (ShaderBytecode *) gbytecode;
- gbytecode = bytecode;
+
+ char *fname = (char *) alloca(strlen(dent->d_name) + dirlen);
+ sprintf(fname, "%s/%s", dname, dent->d_name);
+ FILE *io = fopen(fname, "rb");
+ if (io == NULL)
+ {
+ report("FAIL: %s fopen() failed.\n", fname);
+ continue;
+ } // if
+
+ static unsigned char buf[1024 * 256];
+ int rc = fread(buf, 1, sizeof (buf), io);
+ fclose(io);
+ if (rc == -1)
+ {
+ report("FAIL: %s %s\n", fname, strerror(errno));
+ continue;
+ } // if
+
+ const MOJOSHADER_parseData *pd = MOJOSHADER_parse(profile, buf, rc, 0, 0, 0);
+ if (pd->error != NULL)
+ report("FAIL: %s %s\n", fname, pd->error);
+ else
+ {
+ if (compile_shader(fname, pd))
+ report("PASS: %s\n", fname);
+ } // else
+ MOJOSHADER_freeParseData(pd);
} // while
closedir(dirp);
} // if
@@ -173,76 +126,21 @@
printf("\n\nUSAGE: %s <profile> [dir1] ... [dirN]\n\n", argv[0]);
else
{
- #define MAX_WORKERS 4
- pthread_t workers[MAX_WORKERS];
int total = 0;
+ int i;
#if FINDERRORS_COMPILE_SHADERS
SDL_Init(SDL_INIT_VIDEO);
SDL_SetVideoMode(640, 480, 0, SDL_OPENGL);
#endif
- pthread_mutex_init(&grab_mutex, NULL);
- pthread_mutex_init(&report_mutex, NULL);
-
- profile = argv[1];
- int i;
+ const char *profile = argv[1];
for (i = 2; i < argc; i++)
- total += do_dir(argv[i]);
+ total += do_dir(argv[i], profile);
printf("Saw %d bytecode files.\n", total);
- for (i = 0; i < MAX_WORKERS; i++)
- pthread_create(&workers[i], NULL, worker, NULL);
-
- while (1)
- {
- ShaderBytecode *my_bytecode = NULL;
- pthread_mutex_lock(&grab_mutex);
- if (gparsed != NULL)
- {
- my_bytecode = (ShaderBytecode *) gparsed;
- gparsed = gparsed->next;
- } // if
- pthread_mutex_unlock(&grab_mutex);
-
- if (my_bytecode == NULL)
- {
- if (gbytecode == NULL)
- break;
- else
- {
- usleep(10000);
- continue;
- } // else
- } // if
-
- const MOJOSHADER_parseData *pd = (const MOJOSHADER_parseData *)
- my_bytecode->data;
- const char *fname = my_bytecode->name;
- if (pd != NULL)
- {
- if (pd->error != NULL)
- report("FAIL: %s %s\n", fname, pd->error);
- else
- {
- if (compile_shader(fname, pd))
- report("PASS: %s\n", fname);
- } // else
- MOJOSHADER_freeParseData(pd);
- } // if
-
- free(my_bytecode->name);
- free(my_bytecode);
- } // while
-
- for (i = 0; i < MAX_WORKERS; i++)
- pthread_join(workers[i], NULL);
-
- pthread_mutex_destroy(&report_mutex);
- pthread_mutex_destroy(&grab_mutex);
-
#if FINDERRORS_COMPILE_SHADERS
SDL_Quit();
#endif