/* returns number of bytes written to the socket */
static OpcUa_Int32 OpcUa_P_SocketService_UdpWrite( OpcUa_Socket    a_pSocket,
                                                   OpcUa_Byte*     a_pBuffer,
                                                   OpcUa_UInt32    a_uBufferSize,
                                                   OpcUa_Boolean   a_bBlock)
{
    OpcUa_InternalUdpSocket*    pInternalSocket     = (OpcUa_InternalUdpSocket*)a_pSocket;
    OpcUa_Int32                 result;

    OpcUa_ReturnErrorIfNull(a_pSocket, OPCUA_SOCKET_ERROR);
    OpcUa_ReturnErrorIfNull(a_pBuffer, OPCUA_SOCKET_ERROR);
    OpcUa_ReferenceParameter(a_bBlock);

    result = OpcUa_P_RawSocket_Write (pInternalSocket->rawSocket, a_pBuffer, a_uBufferSize);

    return result;
}
/*============================================================================
 * Break server loop(s) and issue event(s).
 *===========================================================================*/
OpcUa_StatusCode OPCUA_DLLCALL OpcUa_P_SocketManager_InterruptLoop( OpcUa_SocketManager a_pSocketManager,
                                                                    OpcUa_UInt32        a_uEvent,
                                                                    OpcUa_Boolean       a_bAllManagers)
{
    OpcUa_RawSocket                 pSignalSocket;
    OpcUa_InternalSocketManager*    pInternalSocketManager;
    unsigned char                   dummy[1] = {0};

OpcUa_InitializeStatus(OpcUa_Module_Socket, "InterruptLoop");

    OpcUa_ReferenceParameter(a_bAllManagers);

    if(a_uEvent == OPCUA_SOCKET_NO_EVENT)
    {
        return OpcUa_BadInternalError;
    }

    if(a_pSocketManager == OpcUa_Null)
    {
        return OpcUa_BadInvalidArgument;
    }

    pInternalSocketManager = (OpcUa_InternalSocketManager*)a_pSocketManager;

    pSignalSocket = (OpcUa_RawSocket)OPCUA_P_SOCKET_INVALID;

#if OPCUA_MULTITHREADED

    /* get exclusive access to the list */
#if OPCUA_USE_SYNCHRONISATION
    OpcUa_P_Mutex_Lock(pInternalSocketManager->pMutex);
#endif /* OPCUA_USE_SYNCHRONISATION */


    /************ core begin ************/
    /* set event(s) */
    if ((pInternalSocketManager->uintLastExternalEvent & a_uEvent) != a_uEvent)
    {
        pInternalSocketManager->uintLastExternalEvent |= a_uEvent;

        /* get the signal socket, which is hidden as a cookie */
        pSignalSocket = pInternalSocketManager->pCookie;
    }

    /************* core end *************/

    /* release exclusive access to the list */
#if OPCUA_USE_SYNCHRONISATION
    OpcUa_P_Mutex_Unlock(pInternalSocketManager->pMutex);
#endif /* OPCUA_USE_SYNCHRONISATION */

    /* if there, send a dummy byte to break selects */
    if(pSignalSocket != (OpcUa_RawSocket)OPCUA_P_SOCKET_INVALID)
    {
        OpcUa_P_RawSocket_Write(pSignalSocket, dummy, sizeof(dummy));
    }

#endif /* OPCUA_MULTITHREADED */

OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}