From 8f3727444fc67c56dc1e1b26bdcb2f41d19320ec Mon Sep 17 00:00:00 2001
From: rpj <rpj>
Date: Sat, 11 Jul 1998 05:12:55 +0000
Subject: Preliminary implementation. Lot's of FIXME's.

---
 create.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/create.c b/create.c
index 8474085..daae84f 100644
--- a/create.c
+++ b/create.c
@@ -7,6 +7,10 @@
  */
 
 #include "pthread.h"
+#include "implement.h"
+
+/* FIXME: There must be a Win32 routine to get this value. */
+DWORD pthread_threads_count = 0;
 
 int
 pthread_create(pthread_t *thread, const pthread_attr_t *attr,
@@ -15,4 +19,49 @@ pthread_create(pthread_t *thread, const pthread_attr_t *attr,
   /* Call Win32 CreateThread.
      Map attributes as correctly as possible.
   */
+  HANDLE handle;
+
+  /* FIXME: I don't have doco on attributes so these aren't
+     included yet. Threads will be started with Win32 defaults:
+     unsuspended and with default stack size.
+   */
+  DWORD  flags = 0;
+  DWORD  stack = 0;
+  LPSECURITY_ATTRIBUTES  security = NULL;
+
+  /* FIXME: This needs to be moved into process space. 
+     Perhaps into a structure that contains all
+     per thread info that is Win32 thread specific but
+     not visible from the pthreads API, and
+     accessible through HANDLE (or pthread_t).
+   */
+  SECURITY_ATTRIBUTES security_attr;
+  DWORD  threadID;
+
+  if (pthread_threads_count >= PTHREAD_THREADS_MAX)
+    return EAGAIN;
+
+  switch (attr)
+    {
+    case NULL:
+      /* Use POSIX default attributes */
+      break;
+    default:
+      /* Map attributes */
+      break;
+    }
+
+  /* FIXME: I don't have error return values to work with so
+     I'm assuming this always succeeds (obviously not).
+   */
+  handle = CreateThread(security,
+			stack,
+			start_routine,
+			arg,
+			flags,
+			&threadID);
+
+  *thread = (pthread_t) handle;
+  pthread_threads_count++;
+  return 0;
 }
-- 
cgit v1.2.3