Date   

[PATCH 1.1] Interlocked changes queue.c: Correct reference counting and destroy interlock

John Gray <jgray@...>
 

Index: queue.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/queue.c,v

retrieving revision 1.35.4.5.2.1.4.11

diff -w -u -r1.35.4.5.2.1.4.11 queue.c

--- queue.c         27 Sep 2011 12:38:50 -0000           1.35.4.5.2.1.4.11

+++ queue.c      14 Jan 2012 09:41:43 -0000

@@ -198,6 +198,7 @@

     impl->mQueueMonitorClosure  =   NULL;

     /* Create the counter lock. */

+    wInterlocked_initialize(&impl->mNumberOpenObjects);

     wInterlocked_set(0, &impl->mNumberOpenObjects);

 

@@ -436,7 +437,7 @@

     int newCount = wInterlocked_decrement(&impl->mNumberOpenObjects);

     /* Write a log if something has gone wrong. */

-    if(impl->mNumberOpenObjects < 0)

+    if(newCount < 0)

     {

         mama_log(MAMA_LOG_LEVEL_ERROR, "Queue 0x%p has been dereferenced too many times.", queue);

     }

@@ -719,6 +720,9 @@

         impl->mMamaQueueBridgeImpl = NULL;

         impl->mMsg                 = NULL;

+        /* Destroy the counter lock */

+        wInterlocked_destroy(&impl->mNumberOpenObjects);

+

         free (impl);

         mama_log (MAMA_LOG_LEVEL_FINEST, "Leaving mamaQueue_destroy for queue 0x%X.", queue);

Index: subscription.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/subscription.c,v

retrieving revision 1.152.4.15.2.8.2.10

diff -w -u -r1.152.4.15.2.8.2.10 subscription.c

--- subscription.c              10 Oct 2011 16:03:18 -0000           1.152.4.15.2.8.2.10

+++ subscription.c           14 Jan 2012 09:41:43 -0000

@@ -1831,6 +1831,9 @@

     /* Destroy the mutex. */

     wlock_destroy(impl->mCreateDestroyLock);

+    /* Destroy the state. */

+       wInterlocked_destroy(&impl->mState);

+

     /* Free the subscription impl. */

     free(impl);

}

 

Signed-off-by: John Gray <jgray@...>


[PATCH 1.1] Fault Tolerence Configuration: Use Transport Properties for FT Configuration

John Gray <jgray@...>
 

Currently, the FT setup code uses the hard-coded transport name, "ft", to read

properties from mama.properties despite the fact that the caller supplies a

mamaTransport reference. This change uses the supplied transport's name to

lookup FT configuration properties.

 

Index: c_cpp/src/c/ft.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/Attic/ft.c,v

retrieving revision 1.1.2.7

diff -u -r1.1.2.7 ft.c

--- c_cpp/src/c/ft.c          2 Oct 2011 19:02:17 -0000              1.1.2.7

+++ c_cpp/src/c/ft.c       29 Dec 2011 17:05:46 -0000

@@ -58,6 +58,8 @@

#define FT_FIELD_IPADDRESS          "MamaIPAddress"

#define FT_FIELD_IPADDRESS_FID      206

+#define FT_MAX_PROPERTY_NAME_LENGTH 1024

+

mama_status

multicastFt_setup (

     mamaFtMember                   member,

@@ -105,6 +107,10 @@

static int multicastFt_receiveHeartbeat(void* member);

static int bridgeFt_receiveHeartbeat(void* member);

+static const char*

+multicastFt_getProperty(char *buffer, const char *propertyName, const char

+        *transportName);

+

static int foundheartbeat=0;

 /*****************************************

@@ -878,6 +884,32 @@

/****************************************************************************

*       Multicast FT specific

******************************************************************************/

+

+const char *multicastFt_getProperty(char *buffer, const char *propertyName, const char *transportName)

+{

+    /* Returns. */

+    const char *ret = NULL;

+

+    /* Format the full property name. */

+    int numberWritten = snprintf(buffer, (FT_MAX_PROPERTY_NAME_LENGTH - 1), propertyName, transportName);

+

+    /* If too many characters are written the log an error. */

+    if((FT_MAX_PROPERTY_NAME_LENGTH - 1) < numberWritten)

+    {

+        mama_log(MAMA_LOG_LEVEL_ERROR, "%s Property name too long. Length [%d],"

+                " Max Length [%d].", transportName, strlen(transportName),

+                (FT_MAX_PROPERTY_NAME_LENGTH - 1));

+    }

+

+    else

+    {

+        /* Otherwise get the property. */

+        ret = mama_getProperty(buffer);

+    }

+

+    return ret;

+}

+

mama_status

multicastFt_setup (

     mamaFtMember                   member,

@@ -904,46 +936,70 @@

     const char* ftNetwork   = NULL;

     const char* ftTtl       = NULL;

     const char* iorecvstr   = NULL;

+    const char* transportName   = NULL;

+    mama_status status          = MAMA_STATUS_OK;   

     struct in_addr iface;

     struct in_addr cFtIfAddr;

+    /* This buffer is used for formatting property names. */

+    char propertyName[FT_MAX_PROPERTY_NAME_LENGTH] = "";

+

     mamaFtMemberImpl* impl = (mamaFtMemberImpl*) member;

-    if (!impl || !groupName)

+    if (!impl || !groupName || !transport)

         return MAMA_STATUS_INVALID_ARG;

-    ftInterface = mama_getProperty ("mama.multicast.transport.ft.interface");

-    if (ftInterface == NULL)

+    /* Get the transport name. */

+    status = mamaTransport_getName(transport, &transportName);

+    if((MAMA_STATUS_OK != status) || (NULL == transportName) || ('\0' ==

+                transportName[0]))

     {

-    ftInterface = mama_getProperty ("mama.native.transport.ft.interface");

+        mama_log (MAMA_LOG_LEVEL_ERROR, "MAMA multicast FT: the transport name "

+                "is invalid");

+        return MAMA_STATUS_INVALID_ARG;

+    }

+

+    ftInterface = multicastFt_getProperty(propertyName,

+            "mama.multicast.transport.%s.interface", transportName);

     if (ftInterface == NULL)

+    {

+        ftInterface = multicastFt_getProperty(propertyName,

+                "mama.native.transport.%s.interface", transportName);       

+        if (ftInterface == NULL)

             ftInterface = "";

     }

-    ftNetwork = mama_getProperty ("mama.multicast.transport.ft.network");

+    ftNetwork = multicastFt_getProperty (propertyName,

+            "mama.multicast.transport.%s.network", transportName);

     if (ftNetwork == NULL)

     {

-        ftNetwork = mama_getProperty ("mama.native.transport.ft.network");

-            if (ftNetwork == NULL)

-                ftNetwork = FT_NETWORK;

+        ftNetwork = multicastFt_getProperty (propertyName,

+                "mama.native.transport.%s.network", transportName);

+        if (ftNetwork == NULL)

+            ftNetwork = FT_NETWORK;

     }

-    ftService = mama_getProperty ("mama.multicast.transport.ft.service");

+    ftService = multicastFt_getProperty (propertyName,

+            "mama.multicast.transport.%s.service", transportName);

     if (ftService == NULL)

     {

-        ftService = mama_getProperty ("mama.native.transport.ft.service");

+        ftService = multicastFt_getProperty (propertyName,

+                "mama.native.transport.%s.service", transportName);

         if (ftService != NULL)

-                service = atol (ftService);

+            service = atol (ftService);

     }

-    ftTtl = mama_getProperty ("mama.multicast.transport.ft.ttl");

+    ftTtl = multicastFt_getProperty (propertyName,

+            "mama.multicast.transport.%s.ttl", transportName);

     if (ftTtl == NULL)

     {

-        ftTtl = mama_getProperty ("mama.native.transport.ft.ttl");

+        ftTtl = multicastFt_getProperty (propertyName,

+                "mama.native.transport.%s.ttl", transportName);

         if (ftTtl != NULL)

-                ttl = atol (ftTtl);

+            ttl = atol (ftTtl);

     }

-    iorecvstr = mama_getProperty ("mama.multicast.transport.ft.iowindow");

+    iorecvstr = multicastFt_getProperty (propertyName,

+            "mama.multicast.transport.%s.iowindow", transportName);

     if (iorecvstr != NULL)

     {

         iorecv=atoi (iorecvstr);

 

Signed-off-by: John Gray <jgray@...>

 


[PATCH 1.1] mamasymbolist subscriber: Initialize Callbacks structs to 0 for mamasymbolist subscriber

John Gray <jgray@...>
 

This avoids a potential segmentation fault in the event that an uninitialized

callback gets invoked.

 

 

Index: c_cpp/src/examples/c/mamasymbollistsubscriberc.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/examples/c/Attic/mamasymbollistsubscriberc.c,v

retrieving revision 1.1.2.2

diff -u -r1.1.2.2 mamasymbollistsubscriberc.c

--- c_cpp/src/examples/c/mamasymbollistsubscriberc.c               27 Sep 2011 16:54:39 -0000           1.1.2.2

+++ c_cpp/src/examples/c/mamasymbollistsubscriberc.c            29 Dec 2011 05:26:02 -0000

@@ -151,6 +151,7 @@

     mama_status         status;

     mamaMsgCallbacks    symbolListCallbacks;

     mamaSubscription    symbolListSubscription;

+    memset(&symbolListCallbacks, 0, sizeof(symbolListCallbacks));

     gSymbolList = (const char**) calloc (MAX_SUBSCRIPTIONS, sizeof (char*));

     gSubscriptionList = (mamaSubscription*)calloc (MAX_SUBSCRIPTIONS,

@@ -463,6 +464,7 @@

     mama_status      status  = MAMA_STATUS_OK;

     size_t           i;

     mamaMsgCallbacks callbacks;

+    memset(&callbacks, 0, sizeof(callbacks));

     callbacks.onCreate       = subscriptionOnCreate;

     callbacks.onError        = subscriptionOnError;

 

Signed-off-by: John Gray <jgray@...>

 


[PATCH 1.1] listenmsgcallback.c: Msg status possibly stale and unknown

John Gray <jgray@...>
 

Added new msg status of possibly stale and unknown

 

--- listenermsgcallback.c               2012-01-27 10:45:39.000000000 +0000

+++ listenermsgcallback.c            2012-01-27 11:10:30.000000000 +0000

@@ -314,6 +314,23 @@

                                                               listenerMsgCallbackImpl_logUnknownStatus(ctx, status, subscription);

                                                               break;

         }

+                                             /* The possibly stale messages are sent by the MAMACACHE with a miscellanious type and should be translated

+                                             * into a quality event.

+                                             */

+                                             case MAMA_MSG_STATUS_POSSIBLY_STALE:

+                                             {

+                                                             /* Verify that the type is misc. */

+                                                             if(msgType == MAMA_MSG_TYPE_MISC)

+                                                             {

+                                                                             /* Change the state to maybe stale and invoke the onquality callback. */

+                                                                             mamaSubscription_setPossiblyStale(subscription);

+                                                                             break;

+                                                             }

+

+                                                             /* Otherwise log the fact we have received an unknown message. */

+                                                             listenerMsgCallbackImpl_logUnknownStatus(ctx, status, subscription);

+                                                             break;

+                                             }

         case MAMA_MSG_STATUS_MISC:

         {

             if (msgType == MAMA_MSG_TYPE_REFRESH)

@@ -635,3 +652,17 @@

                   userSymbol,

                   closure);

}

+

+void listenerMsgCallbackImpl_logUnknownStatus(SubjectContext *ctx, int status, mamaSubscription subscription)

+{

+    /* Write the log at fine level. */

+    if ((gMamaLogLevel >= MAMA_LOG_LEVEL_FINE) || (mamaSubscription_checkDebugLevel (subscription, MAMA_LOG_LEVEL_FINE)))

+    {

+        const char* userSymbol = NULL;

+        mamaSubscription_getSymbol (subscription, &userSymbol);

+        mama_log (MAMA_LOG_LEVEL_FINE,

+                        "%s%s%s%s Unexpected status: %s",

+                        userSymbolFormatted, ctxSymbolFormatted,

+                        mamaMsgStatus_stringForStatus( status ) );

+    }

+}

Signed-off-by: John Gray <jgray@...>

 


[PATCH 1.1] listenmsgcallback.c: invokeErrorCallback function renamed

John Gray <jgray@...>
 

Renamed listenerMsgCallbackImpl_invokeErrorCallback to

listenerMsgCallbackImpl_invokeErrorCallback because it is an internal method.

The method is also static and moved to the end of the file.

 

Index: c_cpp/src/c/listenermsgcallback.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/listenermsgcallback.c,v

retrieving revision 1.62.4.1.14.6

diff -u -r1.62.4.1.14.6 listenermsgcallback.c

--- c_cpp/src/c/listenermsgcallback.c      1 Sep 2011 09:41:02 -0000             1.62.4.1.14.6

+++ c_cpp/src/c/listenermsgcallback.c   29 Dec 2011 04:41:36 -0000

@@ -45,8 +45,23 @@

extern int gGenerateGlobalStats;

extern int gGenerateQueueStats;

-/* Function prototypes. */

-void listenerMsgCallback_invokeErrorCallback(listenerMsgCallback callback, SubjectContext *ctx, mama_status mamaStatus, mamaSubscription subscription, const char *userSymbol);

+/* *************************************************** */

+/* Private Function Prototypes. */

+/* *************************************************** */

+

+/**

+ * This function will invoke the subscription's onError callback passing in a particular error code.

+ *

+ * @param[in] callback The impl.

+ * @param[in] ctx The subscription context.

+ * @param[in] mamaStatus The status that will be passed to the error callback.

+ * @param[in] subscription The subscription.

+ * @param[in] userSymbol The symbol.

+ */

+static void

+listenerMsgCallbackImpl_invokeErrorCallback(listenerMsgCallback callback,

+        SubjectContext *ctx, mama_status mamaStatus, mamaSubscription

+        subscription, const char *userSymbol);

 /**

  * Main callback for MamaListener. This is the base strategy for

@@ -197,30 +212,6 @@

      * may have been destroyed in the callback! */

}

-/*          Description         :               This function will invoke the subscription's onError callback passing in a particular error code.

- */

-void listenerMsgCallback_invokeErrorCallback(listenerMsgCallback callback, SubjectContext *ctx, mama_status mamaStatus, mamaSubscription subscription, const char *userSymbol)

-{

-    /* Local variables. */

-              void *closure = NULL;

-

-              /* Get the callback object from the subscription. */

-    mamaMsgCallbacks *cbs = mamaSubscription_getUserCallbacks (subscription);

-

-              /* Wait for a response. */

-    mamaSubscription_stopWaitForResponse(subscription, ctx);

-

-              /* Get the closure from the subscription. */

-              mamaSubscription_getClosure (subscription, &closure);

-

-    mama_setLastError (MAMA_ERROR_DEFAULT);

-    cbs->onError (subscription,

-                  mamaStatus,

-                  NULL,

-                  userSymbol,

-                  closure);

-}

-

static int isInitialMessageOrRecap (msgCallback *callback, int msgType)

{

     return msgType == MAMA_MSG_TYPE_INITIAL        ||

@@ -287,17 +278,17 @@

     {

         switch (status)

         {

-                              case MAMA_MSG_STATUS_NOT_PERMISSIONED:

-                                              listenerMsgCallback_invokeErrorCallback(callback, ctx, MAMA_STATUS_NOT_PERMISSIONED, subscription, userSymbol);

-                                              return;

+        case MAMA_MSG_STATUS_NOT_PERMISSIONED:

+            listenerMsgCallbackImpl_invokeErrorCallback(callback, ctx, MAMA_STATUS_NOT_PERMISSIONED, subscription, userSymbol);

+            return;

         case MAMA_MSG_STATUS_BAD_SYMBOL:

-                                              listenerMsgCallback_invokeErrorCallback(callback, ctx, MAMA_STATUS_BAD_SYMBOL, subscription, userSymbol);

-                                              return;

+            listenerMsgCallbackImpl_invokeErrorCallback(callback, ctx, MAMA_STATUS_BAD_SYMBOL, subscription, userSymbol);

+            return;

         case MAMA_MSG_STATUS_NOT_FOUND:

-                                              listenerMsgCallback_invokeErrorCallback(callback, ctx, MAMA_STATUS_NOT_FOUND, subscription, userSymbol);

-                                              return;

+            listenerMsgCallbackImpl_invokeErrorCallback(callback, ctx, MAMA_STATUS_NOT_FOUND, subscription, userSymbol);

+            return;

         case MAMA_MSG_STATUS_NO_SUBSCRIBERS:

         {

@@ -553,3 +544,31 @@

    return 1;

#endif /* WITH_ENTITLEMENTS */

}

+

+/* *************************************************** */

+/* Private Functions. */

+/* *************************************************** */

+

+/* Description: This function will invoke the subscription's onError callback passing in a particular error code.

+ */

+void listenerMsgCallbackImpl_invokeErrorCallback(listenerMsgCallback callback, SubjectContext *ctx, mama_status mamaStatus, mamaSubscription subscription, const char *userSymbol)

+{

+    /* Local variables. */

+    void *closure = NULL;

+

+    /* Get the callback object from the subscription. */

+    mamaMsgCallbacks *cbs = mamaSubscription_getUserCallbacks (subscription);

+

+    /* Wait for a response. */

+    mamaSubscription_stopWaitForResponse(subscription, ctx);

+

+    /* Get the closure from the subscription. */

+    mamaSubscription_getClosure (subscription, &closure);

+

+    mama_setLastError (MAMA_ERROR_DEFAULT);

+    cbs->onError (subscription,

+                  mamaStatus,

+                  NULL,

+                  userSymbol,

+                  closure);

+}

 

Signed-off-by: John Gray <jgray@...>


[PATCH 1.1] status.c: Added MAMA_STATUS_SUBSCRIPTION_GAP

John Gray <jgray@...>
 

Added MAMA_STATUS_SUBSCRIPTION_GAP

 

Middleware bridges pass this status to the mamaSubscription onError callback

when the middleware detects a gap:

 

    mamaSubscription_getUserCallbacks(sub)->onError(...)

 

Middlewares that do not detect dropped messages will not use this status.

 

Note that this callback is independent of the sequence number gap detection

implemented by dqpublisher and dqstrategy.

 

Index: c_cpp/src/c/status.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/status.c,v

retrieving revision 1.18.4.3.2.1.4.5

diff -u -r1.18.4.3.2.1.4.5 status.c

--- c_cpp/src/c/status.c 29 Aug 2011 11:52:44 -0000          1.18.4.3.2.1.4.5

+++ c_cpp/src/c/status.c              28 Dec 2011 17:47:07 -0000

@@ -61,7 +61,8 @@

     case MAMA_STATUS_SUBSCRIPTION_INVALID_STATE: return "MAMA_STATUS_SUBSCRIPTION_INVALID_STATE";

     case MAMA_STATUS_QUEUE_OPEN_OBJECTS: return "MAMA_STATUS_QUEUE_OPEN_OBJECTS";

     case MAMA_STATUS_SUBSCRIPTION_INVALID_TYPE: return "MAMA_STATUS_SUBSCRIPTION_INVALID_TYPE"; 

-

+    case MAMA_STATUS_SUBSCRIPTION_GAP: return "MAMA_STATUS_SUBSCRIPTION_GAP";

+   

 #ifdef WITH_ENTITLEMENTS

     case MAMA_ENTITLE_STATUS_NOMEM : return "ENTITLE_STATUS_NOMEM";

     case MAMA_ENTITLE_STATUS_BAD_PARAM : return "ENTITLE_STATUS_BAD_PARAM";

Index: c_cpp/src/c/mama/status.h

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/mama/status.h,v

retrieving revision 1.29.4.3.2.1.4.6

diff -u -r1.29.4.3.2.1.4.6 status.h

--- c_cpp/src/c/mama/status.h 29 Aug 2011 11:52:44 -0000          1.29.4.3.2.1.4.6

+++ c_cpp/src/c/mama/status.h              28 Dec 2011 17:47:07 -0000

@@ -1,4 +1,4 @@

-/* $Id$

+/* $Id: status.h,v 1.29.4.3.2.1.4.6 2011/08/29 11:52:44 ianbell Exp $

  *

  * OpenMAMA: The open middleware agnostic messaging API

  * Copyright (C) 2011 NYSE Inc.

@@ -99,7 +99,9 @@

     /* Queue has open objects. */

     MAMA_STATUS_QUEUE_OPEN_OBJECTS          = 5002,

     /* The function isn't supported for this type of subscription. */

-    MAMA_STATUS_SUBSCRIPTION_INVALID_TYPE   = 5003

+    MAMA_STATUS_SUBSCRIPTION_INVALID_TYPE   = 5003,

+    /* The underlying transport saw a gap. */

+    MAMA_STATUS_SUBSCRIPTION_GAP            = 5004

 #ifdef WITH_ENTITLEMENTS

     /* Out of memory */

 

Signed-off-by: John Gray <jgray@...>


[PATCH 1.1] transport.c: Add mamaTransport_disableRefresh() Method

John Gray <jgray@...>
 

Add mamaTransport_disableRefresh() Method

 

Added method to disable refreshes for a transport. This method must be called

after mamaTransport_allocate() but before mamaTransport_create(). If invoked

with a non-zero argument the transport will not send refresh messages.

 

Index: c_cpp/src/c/transport.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/transport.c,v

retrieving revision 1.79.4.6.2.2.2.8

diff -u -r1.79.4.6.2.2.2.8 transport.c

--- c_cpp/src/c/transport.c          2 Oct 2011 19:02:17 -0000              1.79.4.6.2.2.2.8

+++ c_cpp/src/c/transport.c       27 Dec 2011 20:44:15 -0000

@@ -161,6 +161,7 @@

     int                     mGroupSizeHint;

     uint8_t                 mDisableDisconnectCb;

+    uint8_t                                                                           mDisableRefresh;

     preInitialScheme         mPreInitialScheme;

} transportImpl;

@@ -369,14 +370,18 @@

  *

  * Return non-zero to disable refresh messages.

  */

-static int mamaTransportInternal_disableRefreshes (const char* transportName)

+void mamaTransport_disableRefresh(mamaTransport transport, uint8_t disable)

+{

+    self->mDisableRefresh=disable;

+}

+

+static int mamaTransportInternal_disableRefreshes(const char* transportName)

{

   const char* propValue;

   char propString[MAX_PROP_STRING];

   int retVal;

-  retVal=snprintf (propString, MAX_PROP_STRING,

-    "mama.transport.%s.%s",

+  retVal=snprintf(propString, MAX_PROP_STRING, "mama.transport.%s.%s",

     transportName ? transportName : "", PROP_NAME_DISABLE_REFRESH);

   if ((retVal<0) || (retVal>=MAX_PROP_STRING))

@@ -759,8 +764,7 @@

                 name);

     }

-

-    if (!mamaTransportInternal_disableRefreshes (name))

+    if ((!self->mDisableRefresh) && (!mamaTransportInternal_disableRefreshes(name)))

     {

         return refreshTransport_create (&self->mRefreshTransport,

                                     (mamaTransport)self,

Index: c_cpp/src/c/mama/transport.h

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/mama/transport.h,v

retrieving revision 1.34.4.2.4.1.2.3

diff -u -r1.34.4.2.4.1.2.3 transport.h

--- c_cpp/src/c/mama/transport.h           10 Aug 2011 14:53:28 -0000          1.34.4.2.4.1.2.3

+++ c_cpp/src/c/mama/transport.h        27 Dec 2011 20:44:15 -0000

@@ -291,6 +291,17 @@

                                    double *result);

 /**

+ * Disable Refreshing.

+ *

+ * @param transport the transport instance

+ * @param disable t/f.

+ */

+MAMAExpDLL

+extern void

+mamaTransport_disableRefresh (mamaTransport transport,

+                                                                                                                             uint8_t disable);

+

+/**

  * Set the throttle rate.

  *

  * @param transport the transport.

 

Signed-off-by: John Gray <jgray@...>


[PATCH 1.1] Interlock declaration: Required for applying common_3 patch

John Gray <jgray@...>
 

This must be applied with the common_3 file as it contains the Interlocked_destroy function declaration.

 

 

Index: common/c_cpp/src/c/wombat/wInterlocked.h

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/wombat/Attic/wInterlocked.h,v

retrieving revision 1.1.2.6.8.5

diff -c -p -r1.1.2.6.8.5 wInterlocked.h

*** common/c_cpp/src/c/wombat/wInterlocked.h       17 Jan 2012 13:48:53 -0000            1.1.2.6.8.5

--- common/c_cpp/src/c/wombat/wInterlocked.h          26 Jan 2012 17:24:48 -0000

*************** adec32 (uint32_t* ptr)

*** 69,74 ****

--- 69,97 ----

  typedef uint32_t wInterlockedInt;

 

  /**

+  * This function will initialise a wInterlockedInt.

+  *

+  * @param[in] value Pointer to the item to be initialized.

+  * @return 0 on success.

+  */

+

+ WCOMMONINLINE int wInterlocked_initialize(wInterlockedInt *value)

+ {

+     return 0;

+ }

+

+ /**

+  * This function will destroy a wInterlockedInt.

+  *

+  * @param[in] value Pointer to the item to be destroyed.

+  * @return 0 on success.

+  */

+ WCOMMONINLINE int wInterlocked_destroy(wInterlockedInt *value)

+ {

+     return 0;

+ }

+

+ /**

   * This function will atomically decrement a 32-bit integer value.

   *

   * @param[in] value Pointer to the value to be decremented.

 

 

Signed-off-by: John Gray <jgray@...>


RabbitMQ bridge

Leslie Spiro <lspiro@...>
 

DOT are considering producing an OpenMama bridge using RabbitMQ, which we would then donate to OpenMama. This would provide a solid, well supported and fully open source option to the current product mix.

We are interested in whether any people here think they might be interested in this RabbitMQ bridge should we undertake the project ?

Leslie Spiro
DOT


[PATCH 1.1] Hash rename: Renamed hash functions to whash

John Gray <jgray@...>
 

This avoid potential namespace conflicts as the hash functions are now used

outside of common.

 

Index: c_cpp/src/c/lookup2.c

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/lookup2.c,v

retrieving revision 1.2.34.3

diff -u -r1.2.34.3 lookup2.c

--- c_cpp/src/c/lookup2.c   10 Aug 2011 13:06:52 -0000  1.2.34.3

+++ c_cpp/src/c/lookup2.c   17 Jan 2012 22:58:16 -0000

@@ -96,7 +96,7 @@

--------------------------------------------------------------------

*/

 

-ub4 hash( k, length, initval)

+ub4 whash( k, length, initval)

register ub1 *k;        /* the key */

register ub4  length;   /* the length of the key */

register ub4  initval;    /* the previous hash, or an arbitrary value */

@@ -151,7 +151,7 @@

  -- that the length be the number of ub4's in the key

--------------------------------------------------------------------

*/

-ub4 hash2( k, length, initval)

+ub4 whash2( k, length, initval)

register ub4 *k;        /* the key */

register ub4  length;   /* the length of the key */

register ub4  initval;    /* the previous hash, or an arbitrary value */

@@ -196,7 +196,7 @@

--------------------------------------------------------------------

*/

 

-ub4 hash3( k, length, initval)

+ub4 whash3( k, length, initval)

register ub1 *k;        /* the key */

register ub4  length;   /* the length of the key */

register ub4  initval;    /* the previous hash, or an arbitrary value */

@@ -268,7 +268,7 @@

 

   for (i=0; i<256; ++i)

   {

-    h = hash(buf,i,h);

+    h = whash(buf,i,h);

   }

}

 

@@ -306,10 +306,10 @@

         /* have a and b be two keys differing in only one bit */

         a[i] ^= (k<<j);

         a[i] ^= (k>>(8-j));

-         c[0] = hash(a, hlen, m);

+         c[0] = whash(a, hlen, m);

         b[i] ^= ((k+1)<<j);

         b[i] ^= ((k+1)>>(8-j));

-         d[0] = hash(b, hlen, m);

+         d[0] = whash(b, hlen, m);

         /* check every bit is 1, 0, set, and not set at least once */

         for (l=0; l<HASHSTATE; ++l)

         {

@@ -357,10 +357,10 @@

   ub4 h,i,j,ref,x,y;

 

   printf("Endianness.  These should all be the same:\n");

-  printf("%.8lx\n", hash(q, sizeof(q)-1, (ub4)0));

-  printf("%.8lx\n", hash(qq+1, sizeof(q)-1, (ub4)0));

-  printf("%.8lx\n", hash(qqq+2, sizeof(q)-1, (ub4)0));

-  printf("%.8lx\n", hash(qqqq+3, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(q, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(qq+1, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(qqq+2, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(qqqq+3, sizeof(q)-1, (ub4)0));

   printf("\n");

   for (h=0, b=buf+1; h<8; ++h, ++b)

   {

@@ -370,11 +370,11 @@

       for (j=0; j<i; ++j) *(b+j)=0;

 

       /* these should all be equal */

-      ref = hash(b, len, (ub4)1);

+      ref = whash(b, len, (ub4)1);

       *(b+i)=(ub1)~0;

       *(b-1)=(ub1)~0;

-      x = hash(b, len, (ub4)1);

-      y = hash(b, len, (ub4)1);

+      x = whash(b, len, (ub4)1);

+      y = whash(b, len, (ub4)1);

       if ((ref != x) || (ref != y))

       {

     printf("alignment error: %.8lx %.8lx %.8lx %ld %ld\n",ref,x,y,h,i);

@@ -395,7 +395,7 @@

   printf("These should all be different\n");

   for (i=0, h=0; i<8; ++i)

   {

-    h = hash(buf, (ub4)0, h);

+    h = whash(buf, (ub4)0, h);

     printf("%2ld  0-byte strings, hash is  %.8lx\n", i, h);

   }

}

Index: c_cpp/src/c/lookup2.h

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/lookup2.h,v

retrieving revision 1.1.34.2

diff -u -r1.1.34.2 lookup2.h

--- c_cpp/src/c/lookup2.h   10 Aug 2011 13:06:53 -0000  1.1.34.2

+++ c_cpp/src/c/lookup2.h   17 Jan 2012 22:58:16 -0000

@@ -13,6 +13,6 @@

#define hashsize(n) ((ub4)1<<(n))

#define hashmask(n) (hashsize(n)-1)

 

-ub4 hash (ub1 *k, ub4 length, ub4 initval);

+ub4 whash (ub1 *k, ub4 length, ub4 initval);

 

#endif  /* _LOOKUP2_H_ */

Index: c_cpp/src/c/wtable.c

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/wtable.c,v

retrieving revision 1.12.10.2.12.4

diff -u -r1.12.10.2.12.4 wtable.c

--- c_cpp/src/c/wtable.c    7 Sep 2011 09:45:08 -0000   1.12.10.2.12.4

+++ c_cpp/src/c/wtable.c    17 Jan 2012 22:58:16 -0000

@@ -236,7 +236,7 @@

         }

 

         len = strlen(key);

-        h = hash((unsigned char *)key, len, HASH_INITVAL);

+        h = whash((unsigned char *)key, len, HASH_INITVAL);

         h = (h & hashmask(wtable->size));

         if (wtable_debug)

         {

@@ -310,7 +310,7 @@

         }

 

         len = strlen(key);

-        h = hash((unsigned char *)key, len, HASH_INITVAL);

+        h = whash((unsigned char *)key, len, HASH_INITVAL);

         h = (h & hashmask(wtable->size));

         if (wtable_debug)

         {

@@ -380,7 +380,7 @@

         }

 

         len = strlen(key);

-        h = hash((unsigned char *)key, len, HASH_INITVAL);

+        h = whash((unsigned char *)key, len, HASH_INITVAL);

         h = (h & hashmask(wtable->size));

         if (wtable_debug)

         {

 

Signed-off-by: John Gray <jgray@...>

 


Recall: [PATCH 1.1] Hash rename: Renamed hash functions to whash

John Gray <jgray@...>
 

John Gray would like to recall the message, "[PATCH 1.1] Hash rename: Renamed hash functions to whash".


[PATCH 1.1] Hash rename: Renamed hash functions to whash

John Gray <jgray@...>
 

This avoid potential namespace conflicts as the hash functions are now used

outside of common.

 

Index: c_cpp/src/c/lookup2.c

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/lookup2.c,v

retrieving revision 1.2.34.3

diff -u -r1.2.34.3 lookup2.c

--- c_cpp/src/c/lookup2.c   10 Aug 2011 13:06:52 -0000  1.2.34.3

+++ c_cpp/src/c/lookup2.c   17 Jan 2012 22:58:16 -0000

@@ -96,7 +96,7 @@

--------------------------------------------------------------------

*/

 

-ub4 hash( k, length, initval)

+ub4 whash( k, length, initval)

register ub1 *k;        /* the key */

register ub4  length;   /* the length of the key */

register ub4  initval;    /* the previous hash, or an arbitrary value */

@@ -151,7 +151,7 @@

  -- that the length be the number of ub4's in the key

--------------------------------------------------------------------

*/

-ub4 hash2( k, length, initval)

+ub4 whash2( k, length, initval)

register ub4 *k;        /* the key */

register ub4  length;   /* the length of the key */

register ub4  initval;    /* the previous hash, or an arbitrary value */

@@ -196,7 +196,7 @@

--------------------------------------------------------------------

*/

 

-ub4 hash3( k, length, initval)

+ub4 whash3( k, length, initval)

register ub1 *k;        /* the key */

register ub4  length;   /* the length of the key */

register ub4  initval;    /* the previous hash, or an arbitrary value */

@@ -268,7 +268,7 @@

 

   for (i=0; i<256; ++i)

   {

-    h = hash(buf,i,h);

+    h = whash(buf,i,h);

   }

}

 

@@ -306,10 +306,10 @@

         /* have a and b be two keys differing in only one bit */

         a[i] ^= (k<<j);

         a[i] ^= (k>>(8-j));

-         c[0] = hash(a, hlen, m);

+         c[0] = whash(a, hlen, m);

         b[i] ^= ((k+1)<<j);

         b[i] ^= ((k+1)>>(8-j));

-         d[0] = hash(b, hlen, m);

+         d[0] = whash(b, hlen, m);

         /* check every bit is 1, 0, set, and not set at least once */

         for (l=0; l<HASHSTATE; ++l)

         {

@@ -357,10 +357,10 @@

   ub4 h,i,j,ref,x,y;

 

   printf("Endianness.  These should all be the same:\n");

-  printf("%.8lx\n", hash(q, sizeof(q)-1, (ub4)0));

-  printf("%.8lx\n", hash(qq+1, sizeof(q)-1, (ub4)0));

-  printf("%.8lx\n", hash(qqq+2, sizeof(q)-1, (ub4)0));

-  printf("%.8lx\n", hash(qqqq+3, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(q, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(qq+1, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(qqq+2, sizeof(q)-1, (ub4)0));

+  printf("%.8lx\n", whash(qqqq+3, sizeof(q)-1, (ub4)0));

   printf("\n");

   for (h=0, b=buf+1; h<8; ++h, ++b)

   {

@@ -370,11 +370,11 @@

       for (j=0; j<i; ++j) *(b+j)=0;

 

       /* these should all be equal */

-      ref = hash(b, len, (ub4)1);

+      ref = whash(b, len, (ub4)1);

       *(b+i)=(ub1)~0;

       *(b-1)=(ub1)~0;

-      x = hash(b, len, (ub4)1);

-      y = hash(b, len, (ub4)1);

+      x = whash(b, len, (ub4)1);

+      y = whash(b, len, (ub4)1);

       if ((ref != x) || (ref != y))

       {

     printf("alignment error: %.8lx %.8lx %.8lx %ld %ld\n",ref,x,y,h,i);

@@ -395,7 +395,7 @@

   printf("These should all be different\n");

   for (i=0, h=0; i<8; ++i)

   {

-    h = hash(buf, (ub4)0, h);

+    h = whash(buf, (ub4)0, h);

     printf("%2ld  0-byte strings, hash is  %.8lx\n", i, h);

   }

}

Index: c_cpp/src/c/lookup2.h

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/lookup2.h,v

retrieving revision 1.1.34.2

diff -u -r1.1.34.2 lookup2.h

--- c_cpp/src/c/lookup2.h   10 Aug 2011 13:06:53 -0000  1.1.34.2

+++ c_cpp/src/c/lookup2.h   17 Jan 2012 22:58:16 -0000

@@ -13,6 +13,6 @@

#define hashsize(n) ((ub4)1<<(n))

#define hashmask(n) (hashsize(n)-1)

 

-ub4 hash (ub1 *k, ub4 length, ub4 initval);

+ub4 whash (ub1 *k, ub4 length, ub4 initval);

 

#endif  /* _LOOKUP2_H_ */

Index: c_cpp/src/c/wtable.c

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/wtable.c,v

retrieving revision 1.12.10.2.12.4

diff -u -r1.12.10.2.12.4 wtable.c

--- c_cpp/src/c/wtable.c    7 Sep 2011 09:45:08 -0000   1.12.10.2.12.4

+++ c_cpp/src/c/wtable.c    17 Jan 2012 22:58:16 -0000

@@ -236,7 +236,7 @@

         }

 

         len = strlen(key);

-        h = hash((unsigned char *)key, len, HASH_INITVAL);

+        h = whash((unsigned char *)key, len, HASH_INITVAL);

         h = (h & hashmask(wtable->size));

         if (wtable_debug)

         {

@@ -310,7 +310,7 @@

         }

 

         len = strlen(key);

-        h = hash((unsigned char *)key, len, HASH_INITVAL);

+        h = whash((unsigned char *)key, len, HASH_INITVAL);

         h = (h & hashmask(wtable->size));

         if (wtable_debug)

         {

@@ -380,7 +380,7 @@

         }

 

         len = strlen(key);

-        h = hash((unsigned char *)key, len, HASH_INITVAL);

+        h = whash((unsigned char *)key, len, HASH_INITVAL);

         h = (h & hashmask(wtable->size));

         if (wtable_debug)

         {

 

Signed-off-by: John Gray <jgray@...>

 


[PATCH 1.1] Windows Interlock: Function wInterlocked set to return 0

John Gray <jgray@...>
 

Function wInterlocked set to return 0 for windows.  Not an operation (no-op) in Unix.

 

Index: queue.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/queue.c,v

retrieving revision 1.35.4.5.2.1.4.11

diff -w -u -r1.35.4.5.2.1.4.11 queue.c

--- queue.c 27 Sep 2011 12:38:50 -0000  1.35.4.5.2.1.4.11

+++ queue.c 14 Jan 2012 09:41:43 -0000

@@ -198,6 +198,7 @@

     impl->mQueueMonitorClosure  =   NULL;

 

     /* Create the counter lock. */

+    wInterlocked_initialize(&impl->mNumberOpenObjects);

     wInterlocked_set(0, &impl->mNumberOpenObjects);

 

 

@@ -436,7 +437,7 @@

     int newCount = wInterlocked_decrement(&impl->mNumberOpenObjects);

 

     /* Write a log if something has gone wrong. */

-    if(impl->mNumberOpenObjects < 0)

+    if(newCount < 0)

     {

         mama_log(MAMA_LOG_LEVEL_ERROR, "Queue 0x%p has been dereferenced too many times.", queue);

     }

@@ -719,6 +720,9 @@

         impl->mMamaQueueBridgeImpl = NULL;

         impl->mMsg                 = NULL;

 

+        /* Destroy the counter lock */

+        wInterlocked_destroy(&impl->mNumberOpenObjects);

+

         free (impl);

 

         mama_log (MAMA_LOG_LEVEL_FINEST, "Leaving mamaQueue_destroy for queue 0x%X.", queue);

 

Signed-off-by: John Gray <jgray@...>

 


Recall: [PATCH 1.1] Windows Interlock: Function wInterlocked set to return 0

John Gray <jgray@...>
 

John Gray would like to recall the message, "[PATCH 1.1] Windows Interlock: Function wInterlocked set to return 0".


[PATCH 1.1] Windows Interlock: Function wInterlocked set to return 0

John Gray <jgray@...>
 

Function wInterlocked set to return 0 for windows.  Not an operation (no-op) in Unix.

 

Index: queue.c

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/queue.c,v

retrieving revision 1.35.4.5.2.1.4.11

diff -w -u -r1.35.4.5.2.1.4.11 queue.c

--- queue.c 27 Sep 2011 12:38:50 -0000  1.35.4.5.2.1.4.11

+++ queue.c 14 Jan 2012 09:41:43 -0000

@@ -198,6 +198,7 @@

     impl->mQueueMonitorClosure  =   NULL;

 

     /* Create the counter lock. */

+    wInterlocked_initialize(&impl->mNumberOpenObjects);

     wInterlocked_set(0, &impl->mNumberOpenObjects);

 

 

@@ -436,7 +437,7 @@

     int newCount = wInterlocked_decrement(&impl->mNumberOpenObjects);

 

     /* Write a log if something has gone wrong. */

-    if(impl->mNumberOpenObjects < 0)

+    if(newCount < 0)

     {

         mama_log(MAMA_LOG_LEVEL_ERROR, "Queue 0x%p has been dereferenced too many times.", queue);

     }

@@ -719,6 +720,9 @@

         impl->mMamaQueueBridgeImpl = NULL;

         impl->mMsg                 = NULL;

 

+        /* Destroy the counter lock */

+        wInterlocked_destroy(&impl->mNumberOpenObjects);

+

         free (impl);

 

         mama_log (MAMA_LOG_LEVEL_FINEST, "Leaving mamaQueue_destroy for queue 0x%X.", queue);

 

Signed-off-by: John Gray <jgray@...>

 


[PATCH 1.1] Properties: Fixed Memory Leaks in Properties

John Gray <jgray@...>
 

Free memory and fail if realloc fails in propertiesImpl_addKey(). When we

replace a value in the hash table in propertiesImpl_addProperty(), free the old

value.

 

Index: c_cpp/src/c/property.c

===================================================================

RCS file: /cvsroot/products/common/c_cpp/src/c/property.c,v

retrieving revision 1.22.2.2.2.1.2.4

diff -u -r1.22.2.2.2.1.2.4 property.c

--- c_cpp/src/c/property.c  7 Sep 2011 09:45:08 -0000   1.22.2.2.2.1.2.4

+++ c_cpp/src/c/property.c  18 Jan 2012 02:56:09 -0000

@@ -326,7 +326,7 @@

    propertiesImpl_ *this = (propertiesImpl_ *)handle;

    const char*      rval = NULL;

 

-   if( name == NULL || strlen( name ) == 0 )

+   if( name == NULL || NULL == this || strlen( name ) == 0 )

    {

        return NULL;

    }

@@ -554,9 +554,19 @@

         }

         else

         {

-            this->mKeys = (const char* *)realloc(

-                (void* )this->mKeys,

-                allocSize * sizeof( const char* ) );

+            void* reallocBlock =

+                realloc((void* )this->mKeys, (allocSize * sizeof(const char*)));

+

+            if(NULL != reallocBlock)

+            {

+                this->mKeys = (const char**)reallocBlock;

+            }

+            else

+            {

+                free((void* )this->mKeys);

+                this->mKeys = NULL;

+                return 0;

+            }

         }

     }

 

@@ -571,28 +581,36 @@

                             const char* value )

{

     propertiesImpl_ *this = (propertiesImpl_*)properties;

+    void* data = NULL;

+    int ret = 0;

 

-    if( gPropertyDebug )

-    {

-        fprintf (stderr,

-                 "\nAddProperty KEY: %s, VALUE: %s\n",

-                 name,

-                 value);

-    }

+    if( NULL == this )

+        return 0;

 

-    if ( NULL == wtable_lookup( this->mTable, (char* )name ))

+    if ( NULL == (data = wtable_lookup(this->mTable, (char*)name)))

     {

         if( !propertiesImpl_AddKey( this, name ))

             return 0;

     }

 

-    if (-1==wtable_insert( this->mTable, (char* )name, (caddr_t)value ))

+    if(-1 == (ret = wtable_insert( this->mTable, (char* )name, (caddr_t)value)))

     {

         return 0;

     }

 

+    if(0 == ret) /* If 0 is returned then data has been replaced. */

+    {

+        /* If existing data in the table has now been replaced then the old data must be freed. */

+        if(NULL != data)

+        {

+            free(data);

+        }

+

+       if(gPropertyDebug)

+        {

+           fprintf(stderr, "\nAddProperty KEY: %s, VALUE: %s\n", name, value);

+       }

+    }

 

     return 1;

}

-

-

 

Signed-off-by: John Gray <jgray@...>


[PATCH 1.1] mamainternal.h: Added types.h to includes

John Gray <jgray@...>
 

Needed to include types.h to mamainternal.h to enable building

 

Index: c_cpp/src/c/mamainternal.h

===================================================================

RCS file: /cvsroot/products/mama/c_cpp/src/c/mamainternal.h,v

retrieving revision 1.16.22.6

diff -u -r1.16.22.6 mamainternal.h

--- c_cpp/src/c/mamainternal.h  18 Aug 2011 10:54:08 -0000  1.16.22.6

+++ c_cpp/src/c/mamainternal.h  6 Jan 2012 21:21:27 -0000

@@ -23,6 +23,7 @@

#define MamaInternalH__

 

#include <property.h>

+#include "mama/types.h"

 

#if defined(__cplusplus)

extern "C"

 

Signed-off-by: John Gray <jgray@...>

 


Re: Bridge API doc

Daniel Cegiełka <daniel.cegielka@...>
 

Hi Alex,

2012/1/20 <alex.stovboun@...>
Mike,

I am researching various middleware options. ZeroMQ looks promising.

There is already an idea to add support for RDMA/IB in ZeroMQ - that would cut latency into 2-3 us.


 
Any plans to implement a bridge for it? If yes, is there a timeline?

I'm planning to get involved in the preparation of support for ZeroMQ and I hope that in future the ZeroMQ bridge will be a part of the MAMA. It would be very good if we could build for ZeroMQ active and stable support - especially look forward to working here with NYSE Technologies.

 
I am also looking into writing a bridge for our proprietary middleware.

If you could briefly describe the bridge interface functions (at least the most important ones) - that would already be a great starting point for anyone trying to write a bridge.

MAMA is based on the dlopen() function but it's very important to prepare bridge with a deep understanding of the messages, which is necessary for MAMDA:


There is also a lot of questions about how to prepare ZeroMQ bridge - using raw zmq C API (zmq.h) or maybe C++ (zmq.hpp) with MAMA C++ wrapper (not published yet by NYSE).. or C API with czmq?

best regards,
Daniel


 

Regards,
Alex


PLEASE READ: This message is for the named person's use only. It may contain confidential, proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you receive this message in error, please delete it and all copies from your system, destroy any hard copies and notify the sender. You must not, directly or indirectly, use, disclose, distribute, print, or copy any part of this message if you are not the intended recipient. Nomura Holding America Inc., Nomura Securities International, Inc, and their respective subsidiaries each reserve the right to monitor all e-mail communications through its networks. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorized to state the views of such entity. Unless otherwise stated, any pricing information in this message is indicative only, is subject to change and does not constitute an offer
 to deal at any price quoted. Any reference to the terms of executed transactions should be treated as preliminary only and subject to our formal written confirmation.

_______________________________________________
Openmama-dev mailing list
Openmama-dev@...
http://lists.openmama.org/listinfo/openmama-dev


Re: Bridge API doc

alex.stovboun@...
 

Mike,

I am researching various middleware options. ZeroMQ looks promising. Any plans to implement a bridge for it? If yes, is there a timeline?
I am also looking into writing a bridge for our proprietary middleware.

If you could briefly describe the bridge interface functions (at least the most important ones) - that would already be a great starting point for anyone trying to write a bridge.

Regards,
Alex


PLEASE READ: This message is for the named person's use only. It may contain confidential, proprietary or legally privileged information. No confidentiality or privilege is waived or lost by any mistransmission. If you receive this message in error, please delete it and all copies from your system, destroy any hard copies and notify the sender. You must not, directly or indirectly, use, disclose, distribute, print, or copy any part of this message if you are not the intended recipient. Nomura Holding America Inc., Nomura Securities International, Inc, and their respective subsidiaries each reserve the right to monitor all e-mail communications through its networks. Any views expressed in this message are those of the individual sender, except where the message states otherwise and the sender is authorized to state the views of such entity. Unless otherwise stated, any pricing information in this message is indicative only, is subject to change and does not constitute an offer to deal at any price quoted. Any reference to the terms of executed transactions should be treated as preliminary only and subject to our formal written confirmation.


Re: Bridge API doc

Mike Schonberg <mschonberg@...>
 

Alex,

I started working on the bridge documentation; however, at the moment we are very busy getting the remaining components of MAMA and MAMDA ready for open source: C++, Java, Windows support etc.

I plan to return to the bridge documentation as soon as I get some spare cycles. I will post a draft when I have some content worthy of review.

Is there a particular middleware or payload that interests you?

Regards,
-Mike

-----Original Message-----
From: openmama-dev-bounces@lists.openmama.org [mailto:openmama-dev-
bounces@lists.openmama.org] On Behalf Of alex.stovboun@nomura.com
Sent: Thursday, January 19, 2012 3:00 PM
To: openmama-dev@lists.openmama.org
Subject: [Openmama-dev] Bridge API doc

Mike,

When do you plan to publish the first cut of the bridge API doc?

Regards,
Alex


PLEASE READ: This message is for the named person's use only. It may
contain confidential, proprietary or legally privileged information. No
confidentiality or privilege is waived or lost by any mistransmission.
If you receive this message in error, please delete it and all copies
from your system, destroy any hard copies and notify the sender. You
must not, directly or indirectly, use, disclose, distribute, print, or
copy any part of this message if you are not the intended recipient.
Nomura Holding America Inc., Nomura Securities International, Inc, and
their respective subsidiaries each reserve the right to monitor all e-
mail communications through its networks. Any views expressed in this
message are those of the individual sender, except where the message
states otherwise and the sender is authorized to state the views of
such entity. Unless otherwise stated, any pricing information in this
message is indicative only, is subject to change and does not
constitute an offer to deal at any price quoted. Any reference to the
terms of executed transactions should be treated as preliminary only
and subject to our formal written confirmation.
Please consider the environment before printing this email.

Visit our website at http://www.nyse.com

****************************************************

Note: The information contained in this message and any attachment to it is privileged, confidential and protected from disclosure. If the reader of this message is not the intended recipient, or an employee or agent responsible for delivering this message to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please notify the sender immediately by replying to the message, and please delete it from your system. Thank you. NYSE Euronext.

2261 - 2280 of 2305