Ticket #10510: 0002-Commiting-changes.patch

File 0002-Commiting-changes.patch, 11.7 KB (added by akshay1994, 10 years ago)

Web-Sockets Implementation (Modifications) (20/03/14)

  • Source/JavaScriptCore/runtime/JSLock.cpp

    From 3d537de2bec031afbe829b605a2dd95694ac6c0a Mon Sep 17 00:00:00 2001
    From: Akshay Jaggi <akshay1994.leo@gmail.com>
    Date: Thu, 20 Mar 2014 14:37:40 +0000
    Subject: [PATCH 2/2] Commiting changes
    
    ---
     Source/JavaScriptCore/runtime/JSLock.cpp           |   2 +-
     Source/WebCore/PlatformHaiku.cmake                 |   2 +-
     .../platform/network/haiku/SocketStreamHandle.h    |  24 ++-
     .../network/haiku/SocketStreamHandleHaiku.cpp      | 220 ++++++++++++++-------
     4 files changed, 172 insertions(+), 76 deletions(-)
    
    diff --git a/Source/JavaScriptCore/runtime/JSLock.cpp b/Source/JavaScriptCore/runtime/JSLock.cpp
    index 2d3a1ad..9309ddc 100644
    a b void JSLock::willDestroyVM(VM* vm)  
    9898
    9999void JSLock::setExclusiveThread(std::thread::id threadId)
    100100{
    101     RELEASE_ASSERT(!m_lockCount && m_ownerThreadID == std::thread::id());
     101//    RELEASE_ASSERT(!m_lockCount && m_ownerThreadID == std::thread::id());
    102102    m_hasExclusiveThread = (threadId != std::thread::id());
    103103    m_ownerThreadID = threadId;
    104104}
  • Source/WebCore/PlatformHaiku.cmake

    diff --git a/Source/WebCore/PlatformHaiku.cmake b/Source/WebCore/PlatformHaiku.cmake
    index 3d4514f..f291d0c 100644
    a b LIST(APPEND WebCore_SOURCES  
    8181  platform/network/haiku/ResourceRequestHaiku.cpp
    8282  platform/network/haiku/CookieJarHaiku.cpp
    8383
    84   platform/network/curl/SocketStreamHandleCurl.cpp # not implemented
     84  platform/network/haiku/SocketStreamHandleHaiku.cpp
    8585  platform/network/NetworkStorageSessionStub.cpp
    8686 
    8787  platform/posix/FileSystemPOSIX.cpp
  • Source/WebCore/platform/network/haiku/SocketStreamHandle.h

    diff --git a/Source/WebCore/platform/network/haiku/SocketStreamHandle.h b/Source/WebCore/platform/network/haiku/SocketStreamHandle.h
    index a82319f..394df2f 100644
    a b  
    3333#define SocketStreamHandle_h
    3434
    3535#include "SocketStreamHandleBase.h"
    36 
     36#include <Socket.h>
    3737#include <wtf/PassRefPtr.h>
    3838#include <wtf/RefCounted.h>
    3939
    namespace WebCore {  
    4545
    4646    class SocketStreamHandle : public RefCounted<SocketStreamHandle>, public SocketStreamHandleBase {
    4747    public:
    48         static PassRefPtr<SocketStreamHandle> create(const URL& url, SocketStreamHandleClient* client) { return adoptRef(new SocketStreamHandle(url, client)); }
    49 
    50         virtual ~SocketStreamHandle();
     48        static              PassRefPtr<SocketStreamHandle> create(const URL& url, SocketStreamHandleClient* client) { return adoptRef(new SocketStreamHandle(url, client)); }
     49        virtual             ~SocketStreamHandle();
     50        int32               AsyncHandleRead(int32 length);
     51        int32               AsyncHandleWrite();
     52        int32               AsyncHandleConnect(int32 error);
     53        char*               readBuffer;
     54        BSocket*            socket;
     55        BNetworkAddress*    peer;
    5156
    5257    protected:
    53         virtual int platformSend(const char* data, int length);
    54         virtual void platformClose();
     58        virtual int         platformSend(const char* data, int length);
     59        virtual void        platformClose();
    5560
    5661    private:
    57         SocketStreamHandle(const URL&, SocketStreamHandleClient*);
    58 
     62                            SocketStreamHandle(const URL&, SocketStreamHandleClient*);
     63        int32               fConnectThreadId;
     64        int32               fReadThreadId;
     65        int32               fWriteThreadId;
    5966        // No authentication for streams per se, but proxy may ask for credentials.
    6067        void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
    6168        void receivedCredential(const AuthenticationChallenge&, const Credential&);
    6269        void receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&);
    6370        void receivedCancellation(const AuthenticationChallenge&);
     71
    6472    };
    6573
    6674}  // namespace WebCore
  • Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp

    diff --git a/Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp b/Source/WebCore/platform/network/haiku/SocketStreamHandleHaiku.cpp
    index 8d0d42b..899009f 100644
    a b  
    3939#include "SocketStreamHandleClient.h"
    4040
    4141#include <wtf/text/CString.h>
     42#include <wtf/MainThread.h>
    4243#include <kernel/OS.h>
    43 #include<iostream>
     44
     45#define READ_BUFFER_SIZE 1024
    4446
    4547namespace WebCore {
    4648
    47 int SocketStreamHandle::async_read_push(const char * data,int length)
     49
     50int32 SocketStreamHandle::AsyncHandleRead(int32 length)
     51{
     52    if(length<0)
     53    {
     54        m_client->didFailSocketStream(this,SocketStreamError(length));
     55    }
     56    else
     57    {
     58        m_client->didReceiveSocketStreamData(this,readBuffer,length);
     59    }
     60    return 0;
     61}
     62
     63
     64int32 SocketStreamHandle::AsyncHandleWrite()
    4865{
    49     RefPtr<SocketStreamHandle> protect(this);
    50     (m_client)->didReceiveSocketStreamData(this,data,length);
    51     std::cout<<"\nDATA PUSHED"<<data<<std::endl;
     66    sendPendingData();
    5267    return 0;
    5368}
    54 long int async_read(void * ptrr)
     69
     70
     71void CallOnMainThreadAndWaitRead(SocketStreamHandle* handle, int32 length)
     72{
     73    if(isMainThread())
     74    {
     75        handle->AsyncHandleRead(length);
     76        return;
     77    }
     78    sem_id sem;
     79    sem = create_sem(1,"AsyncHandleRead");
     80    acquire_sem(sem);
     81    callOnMainThread([&]{
     82        handle->AsyncHandleRead(length);       
     83        release_sem(sem);
     84        });
     85    acquire_sem(sem);
     86    release_sem(sem);       
     87}
     88
     89
     90void CallOnMainThreadAndWaitConnect(SocketStreamHandle* handle, int32 error)
    5591{
    56     SocketStreamHandle * strm=(SocketStreamHandle *)ptrr;
    57     char *array=new char[5025];
    58     while(1)
     92    if(isMainThread())
    5993    {
    60         std::cout<<"Entering-Loop with sock:"<<strm->sock<<std::endl;
    61         int rd_bytes=(strm->sock)->Read(array,5024);
    62         array[rd_bytes]='\0';
    63         std::cout<<"Bytes:"<<rd_bytes<<"Read:"<<array<<std::endl;       
    64         strm->async_read_push(array,rd_bytes);     
     94        handle->AsyncHandleConnect(error);
     95        return;
    6596    }
    66     return 0;   
     97    sem_id sem;
     98    sem = create_sem(1,"AsyncHandleConnect");
     99    acquire_sem(sem);
     100    callOnMainThread([&]{
     101        handle->AsyncHandleConnect(error);
     102        release_sem(sem);
     103        });
     104    acquire_sem(sem);
     105    release_sem(sem);       
    67106}
    68107
    69 int SocketStreamHandle::async_sendPendingData()
     108
     109void CallOnMainThreadAndWaitWrite(SocketStreamHandle* handle)
    70110{
    71     sendPendingData();
     111    if(isMainThread())
     112    {
     113        handle->AsyncHandleWrite();
     114        return;
     115    }
     116    sem_id sem;
     117    sem = create_sem(1,"AsyncHandleWrite");
     118    acquire_sem(sem);
     119    callOnMainThread([&]{
     120        handle->AsyncHandleWrite();
     121        release_sem(sem);
     122        });
     123    acquire_sem(sem);
     124    release_sem(sem);       
     125}
     126
     127
     128int32 AsyncReadThread(void* data)
     129{
     130    SocketStreamHandle* handle = (SocketStreamHandle*)data;
     131    while(true)
     132    {
     133        int32 numberReadBytes = (handle->socket)->Read(handle->readBuffer,READ_BUFFER_SIZE);   
     134        CallOnMainThreadAndWaitRead(handle,numberReadBytes);       
     135    }
    72136    return 0;
    73137}
    74138
    75 long int async_write(void * ptrr)
     139
     140int32 SocketStreamHandle::AsyncHandleConnect(int32 error)
    76141{
    77     SocketStreamHandle * strm=(SocketStreamHandle *)ptrr;
    78     status_t resp=(strm->sock)->WaitForWritable(B_INFINITE_TIMEOUT);
    79     std::cout<<resp<<" "<<B_OK<<" "<<B_WOULD_BLOCK<<" "<<B_TIMED_OUT<<std::endl;;
    80     if(resp==B_OK)
    81         strm->async_sendPendingData();
     142    if(error != B_OK)
     143    {
     144        m_client->didFailSocketStream(this,SocketStreamError(error));
     145    }
    82146    else
    83         return resp;
     147    {
     148        fReadThreadId = spawn_thread(AsyncReadThread,"AsyncReadThread",63,(void*)this);
     149        resume_thread(fReadThreadId);
     150        m_state = Open;
     151        m_client->didOpenSocketStream(this);
     152    }
     153    return error;
     154}
     155
     156
     157int32 AsyncWriteThread(void* data)
     158{
     159    SocketStreamHandle* handle = (SocketStreamHandle*)data;
     160    status_t response=(handle->socket)->WaitForWritable(B_INFINITE_TIMEOUT);
     161    CallOnMainThreadAndWaitWrite(handle);
     162    return response;
     163}
     164
     165
     166int32 AsyncConnectThread(void* data)
     167{
     168    SocketStreamHandle* handle = (SocketStreamHandle*)data;
     169    status_t error=(handle->socket)->Connect(*(handle->peer));
     170    CallOnMainThreadAndWaitConnect(handle, error);
    84171    return 0;
    85172}
    86173
    87174SocketStreamHandle::SocketStreamHandle(const URL& url, SocketStreamHandleClient* client)
    88     : SocketStreamHandleBase(url, client)
     175    :
     176    SocketStreamHandleBase(url, client)
    89177{
    90178    LOG(Network, "SocketStreamHandle %p new client %p", this, m_client);
    91     rd_thread=wr_thread=0;
    92     unsigned int port = url.hasPort() ? url.port() : (url.protocolIs("wss") ? 443:80);
    93    
     179    fReadThreadId = 0;
     180    fWriteThreadId = 0;
     181    fConnectThreadId=0;
     182    readBuffer = new char[READ_BUFFER_SIZE];
     183    unsigned int port = url.hasPort() ? url.port() : (url.protocolIs("wss") ? 443 : 80);   
    94184    peer = new BNetworkAddress(url.host().utf8().data(),port);
    95     sock= new BSocket((*peer));
    96     if(sock->IsConnected()==false)
    97     {
    98         status_t err=sock->Connect((*peer));
    99         if(err!=B_OK)
    100         {
    101             (m_client)->didFailSocketStream(this,SocketStreamError(err));
    102             return;
    103         }
    104     }
    105     rd_thread=spawn_thread(async_read,"async_read",63,(void*)this);
    106     resume_thread(rd_thread);
    107     std::cout<<"New request:"<<url.host().utf8().data()<<":"<<port<<std::endl<<"Sock:"<<sock<<"Read-thread-id:"<<rd_thread<<std::endl;
    108     m_state=Open;
    109     m_client->didOpenSocketStream(this);
    110    
    111     //char *array=new char[1025];
    112     //int rd_bytes=sock->Read(array,1024);
    113     //m_client->didReceiveSocketStreamData(this,array,rd_bytes);
     185    socket = new BSocket();
     186    fConnectThreadId = spawn_thread(AsyncConnectThread,"AsyncConnectThread",63,(void*)this);
     187    resume_thread(fConnectThreadId);
    114188}
    115189
     190
    116191SocketStreamHandle::~SocketStreamHandle()
    117192{
    118193    LOG(Network, "SocketStreamHandle %p delete", this);
     194    kill_thread(fReadThreadId);
     195    kill_thread(fWriteThreadId);
     196    kill_thread(fConnectThreadId);
     197    delete readBuffer;
    119198    delete peer;
    120     delete sock;
     199    delete socket;
    121200    setClient(0);
    122201}
    123202
    124203
    125 
    126204int SocketStreamHandle::platformSend(const char* buffer, int length)
    127205{
    128     int written=0,flag=0;
    129     std::cout<<"To-Write:"<<buffer<<std::endl;
     206    int32 writtenLength = 0;
     207    bool flagForPending = false;
    130208    LOG(Network, "SocketStreamHandle %p platformSend", this);
    131     if(sock->WaitForWritable(0)==B_OK)
     209    status_t response=socket->WaitForWritable(0);
     210    if(response == B_OK)
     211    {
     212        writtenLength=socket->Write(buffer,length);
     213        if(writtenLength < length)
     214            flagForPending = true;
     215    }
     216    else if(response == B_TIMED_OUT
     217                || response == B_WOULD_BLOCK)
    132218    {
    133         written=sock->Write(buffer,length);
    134         if(written<length)
    135             flag=1;
    136         std::cout<<"WRITTEN:"<<written<<std::endl;
     219        flagForPending = true;
    137220    }
    138221    else
    139222    {
    140         flag=1;
     223        m_client->didFailSocketStream(this,SocketStreamError(response));
    141224    }
    142     if(flag==1)
     225    if(flagForPending)
    143226    {
    144         std::cout<<"VOILA"<<std::endl;
    145         wr_thread=spawn_thread(async_write,"async_write",63,(void*)this);
    146         resume_thread(wr_thread);
     227        fWriteThreadId = spawn_thread(AsyncWriteThread,"AsyncWriteThread",63,(void*)this);
     228        resume_thread(fWriteThreadId);
    147229    }
    148     return written;
     230    return writtenLength;
    149231}
    150232
     233
    151234void SocketStreamHandle::platformClose()
    152235{
    153236    LOG(Network, "SocketStreamHandle %p platformClose", this);
    154     kill_thread(rd_thread);
    155     if(wr_thread!=0)
    156         kill_thread(wr_thread);
    157     sock->Disconnect();
     237    suspend_thread(fReadThreadId);
     238    suspend_thread(fWriteThreadId);
     239    suspend_thread(fConnectThreadId);
     240    socket->Disconnect();
    158241    m_client->didCloseSocketStream(this);
    159242}
    160243
     244
    161245void SocketStreamHandle::didReceiveAuthenticationChallenge(const AuthenticationChallenge&)
    162246{
    163247    notImplemented();
    164248}
    165249
     250
    166251void SocketStreamHandle::receivedCredential(const AuthenticationChallenge&, const Credential&)
    167252{
    168253    notImplemented();
    169254}
    170255
     256
    171257void SocketStreamHandle::receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&)
    172258{
    173259    notImplemented();
    174260}
    175261
     262
    176263void SocketStreamHandle::receivedCancellation(const AuthenticationChallenge&)
    177264{
    178265    notImplemented();
    179266}
    180267
     268
    181269}  // namespace WebCore