Allow control over thread stack size.
authorcantor <cantor@de75baf8-a10c-0410-a50a-987c0e22f00f>
Thu, 21 Jan 2010 02:39:26 +0000 (02:39 +0000)
committercantor <cantor@de75baf8-a10c-0410-a50a-987c0e22f00f>
Thu, 21 Jan 2010 02:39:26 +0000 (02:39 +0000)
git-svn-id: https://svn.middleware.georgetown.edu/cpp-xmltooling/branches/REL_1@713 de75baf8-a10c-0410-a50a-987c0e22f00f

xmltooling/util/PThreads.cpp
xmltooling/util/Threads.h
xmltooling/util/Win32Threads.cpp

index e914d79..a5d159c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2007 Internet2
+ *  Copyright 2001-2010 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@ namespace xmltooling {
     class XMLTOOL_DLLLOCAL ThreadImpl : public Thread {
         pthread_t thread_id;
     public:
-        ThreadImpl(void* (*start_routine)(void*), void* arg);
+        ThreadImpl(void* (*start_routine)(void*), void* arg, size_t stacksize);
         virtual ~ThreadImpl() {}
     
         int detach() {
@@ -176,9 +176,27 @@ namespace xmltooling {
 
 };
 
-ThreadImpl::ThreadImpl(void* (*start_routine)(void*), void* arg)
+ThreadImpl::ThreadImpl(void* (*start_routine)(void*), void* arg, size_t stacksize)
 {
-    int rc=pthread_create(&thread_id, NULL, start_routine, arg);
+    int rc;
+
+    if (stacksize > 0) {
+        pthread_attr_t attrs;
+        rc = pthread_attr_init(&attrs);
+        if (rc) {
+            Category::getInstance(XMLTOOLING_LOGCAT".Threads").error("pthread_attr_init error (%d)", rc);
+            throw ThreadingException("Thread creation failed.");
+        }
+        rc = pthread_attr_setstacksize(&attrs, stacksize);
+        if (rc) {
+            Category::getInstance(XMLTOOLING_LOGCAT".Threads").error("pthread_attr_setstacksize error (%d)", rc);
+            throw ThreadingException("Thread creation failed.");
+        }
+        rc = pthread_create(&thread_id, &attrs, start_routine, arg);
+    }
+    else {
+        rc = pthread_create(&thread_id, NULL, start_routine, arg);
+    }
     if (rc) {
 #ifdef HAVE_STRERROR_R
         char buf[256];
@@ -260,9 +278,9 @@ ThreadKeyImpl::ThreadKeyImpl(void (*destroy_fcn)(void*))
     }
 }
 
-Thread* Thread::create(void* (*start_routine)(void*), void* arg)
+Thread* Thread::create(void* (*start_routine)(void*), void* arg, size_t stacksize)
 {
-    return new ThreadImpl(start_routine, arg);
+    return new ThreadImpl(start_routine, arg, stacksize);
 }
 
 void Thread::exit(void* return_val)
index e75f9b5..443009c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2009 Internet2
+ *  Copyright 2001-2010 Internet2
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -37,8 +37,9 @@ namespace xmltooling
     class XMLTOOL_API Thread
     {
         MAKE_NONCOPYABLE(Thread);
-    public:
+    protected:
         Thread() {}
+    public:
         virtual ~Thread() {}
 
         /**
@@ -69,9 +70,10 @@ namespace xmltooling
          *
          * @param start_routine the function to execute on the thread
          * @param arg           a parameter for the start routine
+         * @param stacksize     size of stack to use, or 0 for default
          * @return  the created and running thread object
          */
-        static Thread* create(void* (*start_routine)(void*), void* arg);
+        static Thread* create(void* (*start_routine)(void*), void* arg, size_t stacksize=0);
 
         /**
          * Exits a thread gracefully.
@@ -110,8 +112,9 @@ namespace xmltooling
     class XMLTOOL_API ThreadKey
     {
         MAKE_NONCOPYABLE(ThreadKey);
-    public:
+    protected:
         ThreadKey() {}
+    public:
         virtual ~ThreadKey() {}
 
         /**
@@ -154,8 +157,9 @@ namespace xmltooling
     class XMLTOOL_API Mutex
     {
         MAKE_NONCOPYABLE(Mutex);
-    public:
+    protected:
         Mutex() {}
+    public:
         virtual ~Mutex() {}
 
         /**
@@ -186,8 +190,9 @@ namespace xmltooling
     class XMLTOOL_API RWLock
     {
         MAKE_NONCOPYABLE(RWLock);
-    public:
+    protected:
         RWLock() {}
+    public:
         virtual ~RWLock() {}
 
         /**
@@ -225,8 +230,9 @@ namespace xmltooling
     class XMLTOOL_API CondWait
     {
         MAKE_NONCOPYABLE(CondWait);
-    public:
+    protected:
         CondWait() {}
+    public:
         virtual ~CondWait() {}
 
         /**
index 072bb14..09d2720 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright 2001-2009 Internet2
+ *  Copyright 2001-2010 Internet2
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -96,13 +96,13 @@ namespace xmltooling {
     private:
         HANDLE thread_id;
     public:
-        ThreadImpl(void* (*start_routine)(void*), void* arg) : thread_id(0) {
+        ThreadImpl(void* (*start_routine)(void*), void* arg, size_t stacksize) : thread_id(0) {
             thread_id=CreateThread(
                 0, // security attributes
-                0, // use default stack size, maybe this should be setable
+                stacksize, // 0 just means the default size anyway
                 (LPTHREAD_START_ROUTINE ) start_routine,
                 arg,
-                0, // flags, default is ignore stacksize and don't create suspended which is what we want
+                0, // flags, default is don't create suspended which is what we want
                 0);
             if (thread_id==0) {
                 map_windows_error_status_to_pthreads();
@@ -381,9 +381,9 @@ namespace xmltooling {
 // public "static" creation functions
 //
 
-Thread* Thread::create(void* (*start_routine)(void*), void* arg)
+Thread* Thread::create(void* (*start_routine)(void*), void* arg, size_t stacksize)
 {
-    return new ThreadImpl(start_routine, arg);
+    return new ThreadImpl(start_routine, arg, stacksize);
 }
 
 void Thread::exit(void* return_val)