-#ifdef _WIN32
- child_id = _beginthread(
- (void (*)(void *))forward_stats,
- 64 * 1024,
- NULL);
-#elif __OS2__
- child_id = _beginthread(
- (void(* _Optlink)(void*))forward_stats,
- NULL,
- 64 * 1024,
- NULL);
-#else
- /* Generic unix processing */
- signal(SIGALRM, null_routine); /* Ignore the SIGALRM signal */
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&thread, &attr, forward_stats, NULL);
+/* this is a switch () statment in the C preprocessor - ugh */
+#undef SELECTED_ONE_OPTION
+
+/* Use pthreads in preference to any native code */
+#if defined(FEATURE_PTHREAD) && !defined(SELECTED_ONE_OPTION)
+#define SELECTED_ONE_OPTION
+ pthread_t the_thread;
+ pthread_attr_t attrs;
+
+ signal(SIGALRM, null_routine); /* Ignore the SIGALRM signal */
+ pthread_attr_init(&attrs);
+ pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
+ child_id = (pthread_create(&the_thread, &attrs,
+ (void*)forward_stats, NULL) ? -1 : 0);
+ pthread_attr_destroy(&attrs);
+#endif
+
+#if defined(_WIN32) && !defined(_CYGWIN) && !defined(SELECTED_ONE_OPTION)
+#define SELECTED_ONE_OPTION
+ child_id = _beginthread(
+ (void (*)(void *))forward_stats,
+ 64 * 1024,
+ NULL);
+#endif
+
+#if defined(__OS2__) && !defined(SELECTED_ONE_OPTION)
+#define SELECTED_ONE_OPTION
+ child_id = _beginthread(
+ (void(* _Optlink)(void*))forward_stats,
+ NULL,
+ 64 * 1024,
+ NULL);
+#endif
+
+#if defined(__BEOS__) && !defined(SELECTED_ONE_OPTION)
+#define SELECTED_ONE_OPTION
+ thread_id tid = spawn_thread
+ (server_thread, "forward_stats", B_NORMAL_PRIORITY, NULL);
+
+ if ((tid >= 0) && (resume_thread(tid) == B_OK))
+ {
+ child_id = (int) tid;
+ }
+ else
+ {
+ child_id = -1;
+ }
+#endif
+
+#if defined(AMIGA) && !defined(SELECTED_ONE_OPTION)
+#define SELECTED_ONE_OPTION
+ if((child_id = (int)CreateNewProcTags(
+ NP_Entry, (ULONG)server_thread,
+ NP_Output, Output(),
+ NP_CloseOutput, FALSE,
+ NP_Name, (ULONG)"privoxy child",
+ NP_StackSize, 200*1024,
+ TAG_DONE)))
+ {
+ childs++;
+ Signal((struct Task *)child_id, SIGF_SINGLE);
+ Wait(SIGF_SINGLE);
+ }