Browse Source

http shared ptr

dmuratshin 8 years ago
parent
commit
fa2583aaba

+ 3 - 0
oxygine/src/AsyncTask.cpp

@@ -1,6 +1,8 @@
 #include "AsyncTask.h"
 #include "AsyncTask.h"
 #include "core/oxygine.h"
 #include "core/oxygine.h"
 #include <typeinfo>
 #include <typeinfo>
+
+
 namespace oxygine
 namespace oxygine
 {
 {
 #define LOGD(arg) (log::messageln("at: %s (%d) %s", getName().c_str(), getObjectID(), arg))
 #define LOGD(arg) (log::messageln("at: %s (%d) %s", getName().c_str(), getObjectID(), arg))
@@ -8,6 +10,7 @@ namespace oxygine
     AsyncTask::AsyncTask() : _status(status_not_started), _mainThreadSync(false)
     AsyncTask::AsyncTask() : _status(status_not_started), _mainThreadSync(false)
     {
     {
         setName("AsyncTask");
         setName("AsyncTask");
+        _ref_counter = 999999;
     }
     }
 
 
     AsyncTask::~AsyncTask()
     AsyncTask::~AsyncTask()

+ 10 - 5
oxygine/src/AsyncTask.h

@@ -4,13 +4,15 @@
 #include "EventDispatcher.h"
 #include "EventDispatcher.h"
 #include "Event.h"
 #include "Event.h"
 #include "core/oxygine.h"
 #include "core/oxygine.h"
+#include <memory>
+
 #ifdef ERROR
 #ifdef ERROR
 #undef ERROR
 #undef ERROR
 #endif
 #endif
 
 
 namespace oxygine
 namespace oxygine
 {
 {
-    DECLARE_SMART(AsyncTask, spAsyncTask);
+    //DECLARE_SMART(AsyncTask, spAsyncTask);
 
 
     class AsyncTaskEvent: public Event
     class AsyncTaskEvent: public Event
     {
     {
@@ -20,7 +22,7 @@ namespace oxygine
     };
     };
 
 
 
 
-    class AsyncTask: public EventDispatcher
+    class AsyncTask: public EventDispatcher, public std::enable_shared_from_this<AsyncTask>
     {
     {
     public:
     public:
         enum
         enum
@@ -50,6 +52,8 @@ namespace oxygine
         void onError();
         void onError();
         void onComplete();
         void onComplete();
 
 
+
+
         status _status;
         status _status;
 
 
         friend class AsyncTaskManager;
         friend class AsyncTaskManager;
@@ -72,15 +76,16 @@ namespace oxygine
             {
             {
                 if (addref)
                 if (addref)
                 {
                 {
-                    addRef();
+                    //addRef();
                     if (!core::isMainThread())
                     if (!core::isMainThread())
                         sleep(10);
                         sleep(10);
 
 
+                    std::shared_ptr<AsyncTask> task = shared_from_this();
 
 
-                    core::getMainThreadDispatcher().postCallback([ = ]()
+                    core::getMainThreadDispatcher().postCallback([f, task]()
                     {
                     {
                         f();
                         f();
-                        releaseRef();
+                        //releaseRef();
                     });
                     });
                 }
                 }
                 else
                 else

+ 2 - 1
oxygine/src/HttpRequestTask.cpp

@@ -3,6 +3,7 @@
 #include "core/oxygine.h"
 #include "core/oxygine.h"
 #include "utils/stringUtils.h"
 #include "utils/stringUtils.h"
 
 
+
 namespace oxygine
 namespace oxygine
 {
 {
     HttpRequestTask* createNullHttpTask()
     HttpRequestTask* createNullHttpTask()
@@ -14,7 +15,7 @@ namespace oxygine
 
 
     spHttpRequestTask HttpRequestTask::create()
     spHttpRequestTask HttpRequestTask::create()
     {
     {
-        return _createRequestsCallback();
+        return spHttpRequestTask(_createRequestsCallback());
     }
     }
 
 
 #if OX_NO_HTTP
 #if OX_NO_HTTP

+ 4 - 1
oxygine/src/HttpRequestTask.h

@@ -7,7 +7,10 @@
 
 
 namespace oxygine
 namespace oxygine
 {
 {
-    DECLARE_SMART(HttpRequestTask, spHttpRequestTask);
+    //DECLARE_SMART(HttpRequestTask, spHttpRequestTask);
+    class HttpRequestTask;
+    typedef std::shared_ptr<HttpRequestTask> spHttpRequestTask;
+
     class HttpRequestTask: public AsyncTask
     class HttpRequestTask: public AsyncTask
     {
     {
     public:
     public:

+ 16 - 12
oxygine/src/core/android/HttpRequestJavaTask.cpp

@@ -81,15 +81,16 @@ namespace oxygine
         }
         }
 
 
 
 
-        addRef();
+        //addRef();
+        void* ptr = new spAsyncTask(shared_from_this());
         _handle = env->NewGlobalRef(env->CallStaticObjectMethod(_jHttpRequestsClass, _jCreateRequestMethod,
         _handle = env->NewGlobalRef(env->CallStaticObjectMethod(_jHttpRequestsClass, _jCreateRequestMethod,
-                                    jurl, jkeys, jvalues, jpost, (jlong)this));
+                                    jurl, jkeys, jvalues, jpost, (jlong)ptr));
     }
     }
 
 
     void HttpRequestJavaTask::error_()
     void HttpRequestJavaTask::error_()
     {
     {
         onError();
         onError();
-        releaseRef();
+        //releaseRef();
     }
     }
 
 
     void HttpRequestJavaTask::gotHeader_(int respCode, int contentLen)
     void HttpRequestJavaTask::gotHeader_(int respCode, int contentLen)
@@ -112,7 +113,7 @@ namespace oxygine
     void HttpRequestJavaTask::complete_()
     void HttpRequestJavaTask::complete_()
     {
     {
         onComplete();
         onComplete();
-        releaseRef();
+        //releaseRef();
     }
     }
 
 
     void HttpRequestJavaTask::_finaliaze(bool)
     void HttpRequestJavaTask::_finaliaze(bool)
@@ -135,27 +136,30 @@ extern "C"
 
 
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestSuccess(JNIEnv* env, jclass, jlong handle)
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestSuccess(JNIEnv* env, jclass, jlong handle)
     {
     {
-        oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
-        task->complete_();
+        oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
+        static_cast<oxygine::HttpRequestJavaTask*>(task->get())->complete_();
+        delete task;
+        //task->complete_();
     }
     }
 
 
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestError(JNIEnv* env, jclass, jlong handle)
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestError(JNIEnv* env, jclass, jlong handle)
     {
     {
-        oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
-        task->error_();
+        oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
+        static_cast<oxygine::HttpRequestJavaTask*>(task->get())->error_();
+        delete task;
     }
     }
 
 
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestWrite(JNIEnv* env, jclass,
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestWrite(JNIEnv* env, jclass,
             jlong handle, jbyteArray array, jint size)
             jlong handle, jbyteArray array, jint size)
     {
     {
-        oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
-        task->write_(array, size);
+        oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
+        static_cast<oxygine::HttpRequestJavaTask*>(task->get())->write_(array, size);
     }
     }
 
 
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestGotHeader(JNIEnv* env, jclass,
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestGotHeader(JNIEnv* env, jclass,
             jlong handle, jint respCode, jint contentLen)
             jlong handle, jint respCode, jint contentLen)
     {
     {
-        oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
-        task->gotHeader_(respCode, contentLen);
+        oxygine::spAsyncTask* task = (oxygine::spAsyncTask*)handle;
+        static_cast<oxygine::HttpRequestJavaTask*>(task->get())->gotHeader_(respCode, contentLen);
     }
     }
 }
 }

+ 9 - 3
oxygine/src/oxygine-forwards.h

@@ -1,7 +1,7 @@
 #pragma  once
 #pragma  once
 #include "core/ref_counter.h"
 #include "core/ref_counter.h"
 #include "closure/closure.h"
 #include "closure/closure.h"
-
+#include <memory>
 
 
 #ifdef OXYGINE_SDL
 #ifdef OXYGINE_SDL
 typedef struct SDL_Window SDL_Window;
 typedef struct SDL_Window SDL_Window;
@@ -37,7 +37,7 @@ namespace oxygine
     class intrusive_ptr;
     class intrusive_ptr;
 
 
     DECLARE_SMART(Actor, spActor);
     DECLARE_SMART(Actor, spActor);
-    DECLARE_SMART(AsyncTask, spAsyncTask);
+    //DECLARE_SMART(AsyncTask, spAsyncTask);
     DECLARE_SMART(Box9Sprite, spBox9Sprite);
     DECLARE_SMART(Box9Sprite, spBox9Sprite);
     DECLARE_SMART(Button, spButton);
     DECLARE_SMART(Button, spButton);
     DECLARE_SMART(ClipRectActor, spClipRectActor);
     DECLARE_SMART(ClipRectActor, spClipRectActor);
@@ -46,7 +46,7 @@ namespace oxygine
     DECLARE_SMART(DebugActor, spDebugActor);
     DECLARE_SMART(DebugActor, spDebugActor);
     DECLARE_SMART(DragHandler, spDragHandler);
     DECLARE_SMART(DragHandler, spDragHandler);
     DECLARE_SMART(EventDispatcher, spEventDispatcher);
     DECLARE_SMART(EventDispatcher, spEventDispatcher);
-    DECLARE_SMART(HttpRequestTask, spHttpRequestTask);
+    //DECLARE_SMART(HttpRequestTask, spHttpRequestTask);
     DECLARE_SMART(InputText, spInputText);
     DECLARE_SMART(InputText, spInputText);
     DECLARE_SMART(MaskedSprite, spMaskedSprite);
     DECLARE_SMART(MaskedSprite, spMaskedSprite);
     DECLARE_SMART(NativeTexture, spNativeTexture);
     DECLARE_SMART(NativeTexture, spNativeTexture);
@@ -69,6 +69,12 @@ namespace oxygine
     DECLARE_SMART(TweenQueue, spTweenQueue);
     DECLARE_SMART(TweenQueue, spTweenQueue);
     DECLARE_SMART(WebImage, spWebImage);
     DECLARE_SMART(WebImage, spWebImage);
 
 
+    class HttpRequestTask;
+    typedef std::shared_ptr<HttpRequestTask> spHttpRequestTask;
+
+    class AsyncTask;
+    typedef std::shared_ptr<AsyncTask> spAsyncTask;
+
     class Actor;
     class Actor;
     class AnimationFrame;
     class AnimationFrame;
     class ClipRectActor;
     class ClipRectActor;