summaryrefslogtreecommitdiffstats
path: root/Utilities/cmxmlrpc/xmlrpc_transport.c
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2005-02-22 18:08:27 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2005-02-22 18:08:27 (GMT)
commitb9b4ea0f7bbf0313d8aa5e354ee56f912969763c (patch)
treeba5e857cda91949be14f508e6df490e1e2176f40 /Utilities/cmxmlrpc/xmlrpc_transport.c
parentbfcb4b693763bb11f841094d2ca9852a64e5d33b (diff)
downloadCMake-b9b4ea0f7bbf0313d8aa5e354ee56f912969763c.zip
CMake-b9b4ea0f7bbf0313d8aa5e354ee56f912969763c.tar.gz
CMake-b9b4ea0f7bbf0313d8aa5e354ee56f912969763c.tar.bz2
ENH: Initial import
Diffstat (limited to 'Utilities/cmxmlrpc/xmlrpc_transport.c')
-rw-r--r--Utilities/cmxmlrpc/xmlrpc_transport.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/Utilities/cmxmlrpc/xmlrpc_transport.c b/Utilities/cmxmlrpc/xmlrpc_transport.c
new file mode 100644
index 0000000..3ae6e69
--- /dev/null
+++ b/Utilities/cmxmlrpc/xmlrpc_transport.c
@@ -0,0 +1,142 @@
+/* Copyright (C) 2001 by First Peer, Inc. All rights reserved.
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions
+** are met:
+** 1. Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** 2. Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in the
+** documentation and/or other materials provided with the distribution.
+** 3. The name of the author may not be used to endorse or promote products
+** derived from this software without specific prior written permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE. */
+
+#include "xmlrpc_config.h"
+
+#undef PACKAGE
+#undef VERSION
+
+#include <stddef.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+#ifdef _DEBUG
+# include <crtdbg.h>
+# define new DEBUG_NEW
+# define malloc(size) _malloc_dbg( size, _NORMAL_BLOCK, __FILE__, __LINE__)
+# undef THIS_FILE
+ static char THIS_FILE[] = __FILE__;
+#endif
+#endif /*WIN32*/
+
+#include "xmlrpc.h"
+#include "xmlrpc_client.h"
+
+#if defined (WIN32)
+#include <process.h>
+#endif
+
+/* For debugging the xmlrpc_transport threading. */
+/* #define tdbg_printf printf */
+#define tdbg_printf (void *)
+
+/* Lacking from the abyss/thread.c implimentaion. */
+void wait_for_asynch_thread(pthread_t *thread)
+{
+#if WIN32
+ unsigned long milliseconds = INFINITE;
+ switch (WaitForSingleObject (
+ *thread /* handle to object to wait for */,
+ milliseconds /* time-out interval in milliseconds*/) )
+ {
+ /* One may want to handle these cases */
+ case WAIT_OBJECT_0:
+ case WAIT_TIMEOUT:
+ break;
+ }
+#else
+ void * result;
+ int success;
+ success = pthread_join (*thread, &result);
+#endif
+}
+
+/* MRB-WARNING: Only call when you have successfully
+** acquired the Lock/Unlock mutex! */
+void unregister_asynch_thread (running_thread_list *list, pthread_t *thread)
+{
+ running_thread_info * pCur = NULL;
+ XMLRPC_ASSERT_PTR_OK(thread);
+ XMLRPC_ASSERT_PTR_OK(list);
+
+ tdbg_printf("unregister_asynch_thread: &pthread_id = %08X *(%08X)\n", thread, *thread);
+ /* Removal */
+ /* Lock (); */
+ for (pCur = list->AsyncThreadHead; pCur != NULL; pCur = (running_thread_info *)pCur->Next)
+ {
+ if (pCur->_thread == *thread)
+ {
+ if (pCur == list->AsyncThreadHead)
+ list->AsyncThreadHead = pCur->Next;
+ if (pCur == list->AsyncThreadTail)
+ list->AsyncThreadTail = pCur->Last;
+ if (pCur->Last)
+ ((running_thread_info *)(pCur->Last))->Next = pCur->Next;
+ if (pCur->Next)
+ ((running_thread_info *)(pCur->Next))->Last = pCur->Last;
+ /* Free malloc'd running_thread_info */
+ free (pCur);
+ return;
+ }
+ }
+
+ /* This is a serious progmatic error, since the thread
+ ** should be in that list! */
+ XMLRPC_ASSERT_PTR_OK(0x0000);
+
+ /* Unlock (); */
+}
+
+/* MRB-WARNING: Only call when you have successfully
+** acquired the Lock/Unlock mutex! */
+void register_asynch_thread (running_thread_list *list, pthread_t *thread)
+{
+ running_thread_info* info = (running_thread_info *) malloc(sizeof(running_thread_info));
+
+ XMLRPC_ASSERT_PTR_OK(thread);
+ XMLRPC_ASSERT_PTR_OK(list);
+
+ tdbg_printf("register_asynch_thread: &pthread_id = %08X *(%08X)\n", thread, *thread);
+
+ info->_thread = *thread;
+
+ /* Insertion */
+ /* Lock (); */
+ if (list->AsyncThreadHead == NULL)
+ {
+ list->AsyncThreadHead = list->AsyncThreadTail = info;
+ list->AsyncThreadTail->Next = list->AsyncThreadHead->Next = NULL;
+ list->AsyncThreadTail->Last = list->AsyncThreadHead->Last = NULL;
+ }
+ else
+ {
+ info->Last = list->AsyncThreadTail;
+ list->AsyncThreadTail->Next = info;
+ list->AsyncThreadTail = list->AsyncThreadTail->Next;
+ list->AsyncThreadTail->Next = NULL;
+ }
+ /* Unlock (); */
+}