added mutex around XMPP calls
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 10 Jan 2014 18:55:47 +0000 (20:55 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 10 Jan 2014 18:55:47 +0000 (20:55 +0200)
include/strophe.h
src/libstrophe/common.h
src/libstrophe/event.c
src/server/core/xmpp.cpp

index ad928ca..f71ba0f 100644 (file)
@@ -372,9 +372,17 @@ void xmpp_presence_new();
 */
 
 /** event loop **/
+typedef enum {
+    XMPP_LOOP_NOTSTARTED,
+    XMPP_LOOP_RUNNING,
+    XMPP_LOOP_QUIT
+} xmpp_loop_status_t;
+
 void LIBSTROPHE_EXPORTABLE xmpp_run_once(xmpp_ctx_t *ctx, const unsigned long  timeout);
 void LIBSTROPHE_EXPORTABLE xmpp_run(xmpp_ctx_t *ctx);
 void LIBSTROPHE_EXPORTABLE xmpp_stop(xmpp_ctx_t *ctx);
+void LIBSTROPHE_EXPORTABLE xmpp_set_loop_status(xmpp_ctx_t *ctx, xmpp_loop_status_t status);
+xmpp_loop_status_t LIBSTROPHE_EXPORTABLE xmpp_get_loop_status(xmpp_ctx_t *ctx);
 
 #ifdef __cplusplus
 }
index 51e2c53..bd2dbaf 100644 (file)
 
 /** run-time context **/
 
-typedef enum {
-    XMPP_LOOP_NOTSTARTED,
-    XMPP_LOOP_RUNNING,
-    XMPP_LOOP_QUIT
-} xmpp_loop_status_t;
-
 typedef struct _xmpp_connlist_t {
     xmpp_conn_t *conn;
     struct _xmpp_connlist_t *next;
index 1524f03..e1ade8f 100644 (file)
@@ -350,3 +350,19 @@ void xmpp_stop(xmpp_ctx_t *ctx)
     if (ctx->loop_status == XMPP_LOOP_RUNNING)
        ctx->loop_status = XMPP_LOOP_QUIT;
 }
+
+/**
+ * Set loop status
+ */
+void xmpp_set_loop_status(xmpp_ctx_t *ctx, xmpp_loop_status_t status)
+{
+   ctx->loop_status = status;
+}
+
+/**
+ * Get current loop status
+ */
+xmpp_loop_status_t xmpp_get_loop_status(xmpp_ctx_t *ctx)
+{
+   return ctx->loop_status;
+}
index e32ae68..4587222 100644 (file)
@@ -237,8 +237,9 @@ static void ConnectionHandler(xmpp_conn_t * const conn, const xmpp_conn_event_t
 /**
  * XMPP context
  */
-xmpp_ctx_t *s_xmppContext = NULL;
-xmpp_conn_t *s_xmppConnection = NULL;
+static xmpp_ctx_t *s_xmppContext = NULL;
+static xmpp_conn_t *s_xmppConnection = NULL;
+static MUTEX s_xmppMutex = MutexCreate();
 
 /**
  * XMPP thread
@@ -262,8 +263,13 @@ THREAD_RESULT THREAD_CALL XMPPConnectionManager(void *arg)
    // outer loop - try to reconnect after disconnect
    do
    {
-      // enter the event loop - connection handler will trigger an exit
-      xmpp_run(s_xmppContext);
+      xmpp_set_loop_status(s_xmppContext, XMPP_LOOP_RUNNING);
+      while(xmpp_get_loop_status(s_xmppContext) == XMPP_LOOP_RUNNING) 
+      {
+         MutexLock(s_xmppMutex);
+         xmpp_run_once(s_xmppContext, 100);
+         MutexUnlock(s_xmppMutex);
+      }
    } while(!SleepAndCheckForShutdown(30));
 
    xmpp_conn_release(s_xmppConnection);
@@ -280,6 +286,7 @@ THREAD_RESULT THREAD_CALL XMPPConnectionManager(void *arg)
  */
 void StopXMPPConnector()
 {
+   MutexLock(s_xmppMutex);
    if (s_xmppContext != NULL)
    {
       if (s_xmppConnected)
@@ -287,6 +294,7 @@ void StopXMPPConnector()
       else
          xmpp_stop(s_xmppContext);
    }
+   MutexUnlock(s_xmppMutex);
 }
 
 /**
@@ -305,6 +313,8 @@ bool SendXMPPMessage(const TCHAR *rcpt, const TCHAR *message)
    const char *_message = message;
 #endif
 
+   MutexLock(s_xmppMutex);
+
        xmpp_stanza_t *msg = xmpp_stanza_new(s_xmppContext);
        xmpp_stanza_set_name(msg, "message");
        xmpp_stanza_set_type(msg, "chat");
@@ -321,6 +331,8 @@ bool SendXMPPMessage(const TCHAR *rcpt, const TCHAR *message)
        xmpp_send(s_xmppConnection, msg);
        xmpp_stanza_release(msg);
 
+   MutexUnlock(s_xmppMutex);
+
 #ifdef UNICODE
    free(_rcpt);
    free(_message);