Skip to content

Commit 669fa96

Browse files
committed
Merge remote-tracking branch 'svn-tribler/ppsp-03-svn' into svn_ppsp-03
Conflicts: Android.mk Makefile NativeLib.cpp SConstruct address.cpp api.cpp channel.cpp cmdgw.cpp content.cpp ext/vod_picker.cpp httpgw.cpp sendrecv.cpp svn-revision.h swift.cpp swift.h tests/cmdgwtest.py tests/connecttest.cpp transfer.cpp zerohashtree.cpp
2 parents fe6e5a3 + 92bd1ce commit 669fa96

29 files changed

+1242
-316
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*.obj
2+
*.dblite
3+
*.exe
4+
*.pdb
5+
*.lib
6+
*.exp

Android.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ include $(PREBUILT_STATIC_LIBRARY)
1212

1313

1414
LOCAL_MODULE := swift
15-
LOCAL_SRC_FILES := NativeLib.cpp sha1.cpp compat.cpp sendrecv.cpp send_control.cpp hashtree.cpp bin.cpp binmap.cpp channel.cpp transfer.cpp httpgw.cpp statsgw.cpp cmdgw.cpp avgspeed.cpp avail.cpp storage.cpp api.cpp live.cpp content.cpp zerostate.cpp zerohashtree.cpp swarmmanager.cpp
15+
LOCAL_SRC_FILES := NativeLib.cpp sha1.cpp compat.cpp sendrecv.cpp send_control.cpp hashtree.cpp bin.cpp binmap.cpp channel.cpp transfer.cpp httpgw.cpp statsgw.cpp cmdgw.cpp avgspeed.cpp avail.cpp storage.cpp api.cpp live.cpp content.cpp zerostate.cpp zerohashtree.cpp swarmmanager.cpp address.cpp
1616

1717
LOCAL_CFLAGS += -D__NEW__
1818

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
LIBEVENT_HOME=/prod/pkgs/libevent-2.0.17-stable
1+
LIBEVENT_HOME=/arno/pkgs/libevent-2.0.21-stable-debug
22

33
# Remove NDEBUG define to trigger asserts
44
CPPFLAGS+=-O2 -I. -DNDEBUG -Wall -Wno-sign-compare -Wno-unused -g -I${LIBEVENT_HOME}/include -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
5-
LDFLAGS+=-levent -lstdc++
5+
LDFLAGS+=-L${LIBEVENT_HOME} -levent -lstdc++
66

77
all: swift-dynamic
88

NativeLib.cpp

+72-58
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* are asynchronously retrievable via NativeLib.asyncGetResult().
88
*
99
* Created by Riccardo Petrocco, Arno Bakker
10-
* Copyright 2010-2014 Delft University of Technology. All rights reserved.
10+
* Copyright 2010-2016 Delft University of Technology. All rights reserved.
1111
*
1212
*/
1313
#include <stdio.h>
@@ -19,9 +19,13 @@
1919
#include "com_tudelft_triblerdroid_swift_NativeLib.h"
2020
#include <sstream>
2121
#include <map>
22+
#include <queue>
23+
2224

2325
using namespace swift;
2426

27+
#define ASYNC_POLL_INTERVAL (100*TINT_MSEC)
28+
2529
// httpgw.cpp functions
2630
bool InstallHTTPGateway( struct event_base *evbase,Address bindaddr, uint32_t chunk_size, double *maxspeed, std::string storage_dir, int32_t vod_step, int32_t min_prebuf );
2731
bool HTTPIsSending();
@@ -30,7 +34,7 @@ std::string HttpGwStatsGetSpeedCallback(Sha1Hash swarmid);
3034

3135
// Local functions
3236
// Libevent* functions are executed by Mainloop thread,
33-
void LibeventKeepaliveCallback(int fd, short event, void *arg);
37+
void LibeventPollAsyncCallback(int fd, short event, void *arg);
3438
void LibeventOpenCallback(int fd, short event, void *arg);
3539
void LibeventCloseCallback(int fd, short event, void *arg);
3640
void LibeventGetHTTPProgressCallback(int fd, short event, void *arg);
@@ -41,7 +45,7 @@ void LibeventLiveAddCallback(int fd, short event, void *arg);
4145
bool enginestarted = false;
4246
uint32_t chunk_size = SWIFT_DEFAULT_CHUNK_SIZE;
4347
double maxspeed[2] = {DBL_MAX,DBL_MAX};
44-
struct event evkeepalive;
48+
struct event evasyncpoll;
4549

4650
// for Live
4751
LiveTransfer *livesource_lt = NULL;
@@ -53,6 +57,7 @@ class AsyncParams
5357
{
5458
public:
5559
int callid_;
60+
event_callback_fn func_;
5661
Sha1Hash swarmid_;
5762
Address tracker_;
5863
std::string filename_;
@@ -61,26 +66,26 @@ class AsyncParams
6166
bool removestate_;
6267
bool removecontent_;
6368

64-
AsyncParams(Sha1Hash &swarmid, Address &tracker, std::string filename) :
65-
callid_(-1), swarmid_(swarmid), tracker_(tracker), filename_(filename),
69+
AsyncParams(event_callback_fn func, Sha1Hash &swarmid, Address &tracker, std::string filename) :
70+
callid_(-1), func_(func), swarmid_(swarmid), tracker_(tracker), filename_(filename),
6671
data_(NULL), datalen_(-1), removestate_(false), removecontent_(false)
6772
{
6873
}
6974

70-
AsyncParams(Sha1Hash &swarmid) :
71-
callid_(-1), swarmid_(swarmid), tracker_(""), filename_(""),
75+
AsyncParams(event_callback_fn func, Sha1Hash &swarmid) :
76+
callid_(-1), func_(func), swarmid_(swarmid), tracker_(""), filename_(""),
7277
data_(NULL), datalen_(-1), removestate_(false), removecontent_(false)
7378
{
7479
}
7580

76-
AsyncParams(char *data, int datalen) :
77-
callid_(-1), swarmid_(Sha1Hash::ZERO), tracker_(""), filename_(""),
81+
AsyncParams(event_callback_fn func, char *data, int datalen) :
82+
callid_(-1), func_(func), swarmid_(Sha1Hash::ZERO), tracker_(""), filename_(""),
7883
data_(data), datalen_(datalen), removestate_(false), removecontent_(false)
7984
{
8085
}
8186

82-
AsyncParams(Sha1Hash &swarmid, bool removestate, bool removecontent) :
83-
callid_(-1), swarmid_(swarmid), tracker_(""), filename_(""),
87+
AsyncParams(event_callback_fn func, Sha1Hash &swarmid, bool removestate, bool removecontent) :
88+
callid_(-1), func_(func), swarmid_(swarmid), tracker_(""), filename_(""),
8489
data_(NULL), datalen_(-1), removestate_(removestate), removecontent_(removecontent)
8590
{
8691
}
@@ -93,10 +98,12 @@ class AsyncParams
9398
};
9499

95100

101+
typedef std::queue<AsyncParams *> asqueue_t;
96102
typedef std::map<int,std::string> intstringmap_t;
97103

98104
pthread_mutex_t asyncMutex = PTHREAD_MUTEX_INITIALIZER;
99105
int asyncCallID=481; // protected by mutex
106+
asqueue_t asyncReqQ; // protected by mutex
100107
intstringmap_t asyncResMap; // protected by mutex
101108

102109

@@ -150,10 +157,11 @@ JNIEXPORT jstring JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_Init(JNI
150157
}
151158
}
152159

153-
// Arno: always have some timer running. Otherwise in some cases libevent
154-
// won't execute any evtimer events added later.
155-
evtimer_assign(&evkeepalive, Channel::evbase, LibeventKeepaliveCallback, NULL);
156-
evtimer_add(&evkeepalive, tint2tv(TINT_SEC));
160+
// Arno: as libevent is used single threaded the only way to coordinate
161+
// the Java calling thread and the libevent processing thread is to
162+
// let the latter poll.
163+
evtimer_assign(&evasyncpoll, Channel::evbase, LibeventPollAsyncCallback, NULL);
164+
evtimer_add(&evasyncpoll, tint2tv(ASYNC_POLL_INTERVAL));
157165

158166
// Start HTTP gateway, if requested
159167
if (errorstr == "" && httpgwaddr!=Address())
@@ -177,15 +185,6 @@ JNIEXPORT jstring JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_Init(JNI
177185
}
178186

179187

180-
181-
void LibeventKeepaliveCallback(int fd, short event, void *arg)
182-
{
183-
// Called every second to keep libevent timer processing alive?!
184-
evtimer_add(&evkeepalive, tint2tv(TINT_SEC));
185-
}
186-
187-
188-
189188
JNIEXPORT void JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_Mainloop(JNIEnv * env, jobject obj)
190189
{
191190
// Enter libevent mainloop
@@ -210,7 +209,7 @@ JNIEXPORT void JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_Shutdown(JN
210209
/**
211210
* Allocates a callid for an asynchronous call and schedules it.
212211
*/
213-
int AsyncRegisterCallback(event_callback_fn func, AsyncParams *aptr)
212+
int AsyncRegisterCallback(AsyncParams *aptr)
214213
{
215214
int prc = pthread_mutex_lock(&asyncMutex);
216215
if (prc != 0)
@@ -221,6 +220,8 @@ int AsyncRegisterCallback(event_callback_fn func, AsyncParams *aptr)
221220

222221
aptr->callid_ = asyncCallID;
223222
asyncCallID++;
223+
asyncReqQ.push(aptr);
224+
int retCallID = aptr->callid_;
224225

225226
prc = pthread_mutex_unlock(&asyncMutex);
226227
if (prc != 0)
@@ -229,34 +230,55 @@ int AsyncRegisterCallback(event_callback_fn func, AsyncParams *aptr)
229230
return -1;
230231
}
231232

232-
// Call timer
233-
struct event *evtimerptr = new struct event;
234-
evtimer_assign(evtimerptr,Channel::evbase,func,aptr);
235-
evtimer_add(evtimerptr,tint2tv(0));
236-
237-
return aptr->callid_;
233+
return retCallID;
238234
}
239235

240-
/**
241-
* Sets the result of the asynchronous call identified by callid
236+
237+
/*
238+
* Called every ASYNC_POLL_INTERVAL by Libevent thread to perform actual
239+
* swift calls.
242240
*/
243-
void AsyncSetResult(int callid, std::string result)
241+
void LibeventPollAsyncCallback(int fd, short event, void *arg)
244242
{
245243
int prc = pthread_mutex_lock(&asyncMutex);
246244
if (prc != 0)
247245
{
248-
dprintf("NativeLib::AsyncSetResult: mutex_lock failed\n");
246+
dprintf("NativeLib::LibeventPollAsync: mutex_lock failed\n");
249247
return;
250248
}
251249

252-
asyncResMap[callid] = result;
250+
while(!asyncReqQ.empty())
251+
{
252+
AsyncParams *aptr = asyncReqQ.front();
253+
asyncReqQ.pop();
254+
255+
// Make callback
256+
aptr->func_(fd,event,aptr);
257+
258+
delete aptr;
259+
}
253260

254261
prc = pthread_mutex_unlock(&asyncMutex);
255262
if (prc != 0)
256263
{
257-
dprintf("NativeLib::AsyncSetResult: mutex_unlock failed\n");
264+
dprintf("NativeLib::LibeventPollAsync: mutex_unlock failed\n");
258265
return;
259266
}
267+
268+
// Schedule next poll
269+
evtimer_add(&evasyncpoll, tint2tv(ASYNC_POLL_INTERVAL));
270+
}
271+
272+
273+
274+
275+
/**
276+
* Sets the result of the asynchronous call identified by callid
277+
*/
278+
void AsyncSetResult(int callid, std::string result)
279+
{
280+
// Assumption: asyncMutex held
281+
asyncResMap[callid] = result;
260282
}
261283

262284

@@ -323,10 +345,10 @@ JNIEXPORT jint JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_asyncOpen(
323345
return -1; // "No destination could be determined"
324346

325347
Address tracker(trackercstr);
326-
AsyncParams *aptr = new AsyncParams(swarmid,tracker,dest);
348+
AsyncParams *aptr = new AsyncParams(&LibeventOpenCallback,swarmid,tracker,dest);
327349

328350
// Register callback
329-
int callid = AsyncRegisterCallback(&LibeventOpenCallback,aptr);
351+
int callid = AsyncRegisterCallback(aptr);
330352

331353
(env)->ReleaseStringUTFChars(jswarmid, swarmidcstr); // release jstring
332354
(env)->ReleaseStringUTFChars(jtracker, trackercstr); // release jstring
@@ -357,8 +379,6 @@ void LibeventOpenCallback(int fd, short event, void *arg)
357379

358380
// Register result
359381
AsyncSetResult(aptr->callid_,errorstr);
360-
361-
delete aptr;
362382
}
363383

364384

@@ -378,10 +398,10 @@ JNIEXPORT jint JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_asyncClose(
378398
Sha1Hash swarmid = Sha1Hash(true,swarmidcstr);
379399
bool rs = (bool)jremovestate;
380400
bool rc = (bool)jremovecontent;
381-
AsyncParams *aptr = new AsyncParams(swarmid,rs,rc);
401+
AsyncParams *aptr = new AsyncParams(&LibeventCloseCallback,swarmid,rs,rc);
382402

383403
// Register callback
384-
int callid = AsyncRegisterCallback(&LibeventCloseCallback,aptr);
404+
int callid = AsyncRegisterCallback(aptr);
385405

386406
(env)->ReleaseStringUTFChars(jswarmid, swarmidcstr); // release jstring
387407

@@ -411,8 +431,6 @@ void LibeventCloseCallback(int fd, short event, void *arg)
411431

412432
// Register result
413433
AsyncSetResult(aptr->callid_,errorstr);
414-
415-
delete aptr;
416434
}
417435

418436

@@ -470,10 +488,10 @@ JNIEXPORT jint JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_asyncGetHTT
470488
const char * swarmidcstr = (env)->GetStringUTFChars(jswarmid, &blnIsCopy);
471489
Sha1Hash swarmid = Sha1Hash(true,swarmidcstr);
472490

473-
AsyncParams *aptr = new AsyncParams(swarmid);
491+
AsyncParams *aptr = new AsyncParams(&LibeventGetHTTPProgressCallback,swarmid);
474492

475493
// Register callback
476-
int callid = AsyncRegisterCallback(&LibeventGetHTTPProgressCallback,aptr);
494+
int callid = AsyncRegisterCallback(aptr);
477495

478496
(env)->ReleaseStringUTFChars(jswarmid , swarmidcstr); // release jstring
479497

@@ -493,8 +511,6 @@ void LibeventGetHTTPProgressCallback(int fd, short event, void *arg)
493511

494512
// Register result
495513
AsyncSetResult(aptr->callid_,errorstr);
496-
497-
delete aptr;
498514
}
499515

500516

@@ -509,10 +525,10 @@ JNIEXPORT jint JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_asyncGetSta
509525
const char * swarmidcstr = (env)->GetStringUTFChars(jswarmid, &blnIsCopy);
510526
Sha1Hash swarmid = Sha1Hash(true,swarmidcstr);
511527

512-
AsyncParams *aptr = new AsyncParams(swarmid);
528+
AsyncParams *aptr = new AsyncParams(&LibeventGetStatsCallback,swarmid);
513529

514530
// Register callback
515-
int callid = AsyncRegisterCallback(&LibeventGetStatsCallback,aptr);
531+
int callid = AsyncRegisterCallback(aptr);
516532

517533
(env)->ReleaseStringUTFChars(jswarmid , swarmidcstr); // release jstring
518534

@@ -533,8 +549,6 @@ void LibeventGetStatsCallback(int fd, short event, void *arg)
533549

534550
// Register result
535551
AsyncSetResult(aptr->callid_,errorstr);
536-
537-
delete aptr;
538552
}
539553

540554

@@ -594,7 +608,7 @@ JNIEXPORT jstring JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_LiveAdd(
594608

595609
char *data = (char *)b;
596610
int datalen = (int)dataLength;
597-
dprintf("NativeLib::LiveAdd: Got %p bytes %d from java\n", data, datalen );
611+
//dprintf("NativeLib::LiveAdd: Got %p bytes %d from java\n", data, datalen );
598612

599613
if (data != NULL && datalen > 0)
600614
{
@@ -603,17 +617,19 @@ JNIEXPORT jstring JNICALL Java_com_tudelft_triblerdroid_swift_NativeLib_LiveAdd(
603617
char *copydata = new char[datalen];
604618
memcpy(copydata,data,datalen);
605619

606-
AsyncParams *aptr = new AsyncParams(copydata,datalen);
620+
AsyncParams *aptr = new AsyncParams(&LibeventLiveAddCallback,copydata,datalen);
607621

608622
// Register callback
609-
(void)AsyncRegisterCallback(&LibeventLiveAddCallback,aptr);
623+
(void)AsyncRegisterCallback(aptr);
610624
}
611625

612626
env->ReleaseByteArrayElements(dataArray, b, JNI_ABORT);
613627

614628
return env->NewStringUTF("");
615629
}
616630

631+
632+
617633
/*
618634
* Add live data to libevent evbuffer, to be turned into chunks when >=chunk_size
619635
* has been added.
@@ -641,8 +657,6 @@ void LibeventLiveAddCallback(int fd, short event, void *arg)
641657
if (ret < 0)
642658
print_error("live: create: error evbuffer_drain");
643659
}
644-
645-
delete aptr;
646660
}
647661

648662

0 commit comments

Comments
 (0)