[svn-commits] rizzo: branch rizzo/video_v2 r89267 - /team/rizzo/video_v2/channels/
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Nov 14 02:32:26 CST 2007
Author: rizzo
Date: Wed Nov 14 02:32:26 2007
New Revision: 89267
URL: http://svn.digium.com/view/asterisk?view=rev&rev=89267
Log:
give some time to the video_thread to terminate
before the channel is destroyed.
The real solution is moving ast_channel to astobj2 so
we have reference counts that protect us from these issues.
Modified:
team/rizzo/video_v2/channels/console_video.c
Modified: team/rizzo/video_v2/channels/console_video.c
URL: http://svn.digium.com/view/asterisk/team/rizzo/video_v2/channels/console_video.c?view=diff&rev=89267&r1=89266&r2=89267
==============================================================================
--- team/rizzo/video_v2/channels/console_video.c (original)
+++ team/rizzo/video_v2/channels/console_video.c Wed Nov 14 02:32:26 2007
@@ -1845,12 +1845,25 @@
ast_mutex_destroy(&(env->in.dec_in_lock));
}
-/*! \brief uninitialize the entire environment. */
+/*! \brief uninitialize the entire environment.
+ * In practice, signal the thread and give it a bit of time to
+ * complete, giving up if it gets stuck. Because uninit
+ * is called from hangup with the channel locked, and the thread
+ * uses the chan lock, we need to unlock here. This is unsafe,
+ * and we should really use refcounts for the channels.
+ */
static void console_video_uninit(struct video_desc *env)
{
+ int i, t = 100; /* initial wait is shorter, than make it longer */
env->shutdown = 1;
-}
-
+ for (i=0; env->shutdown && i < 10; i++) {
+ ast_channel_unlock(env->owner);
+ usleep(t);
+ t = 1000000;
+ ast_channel_lock(env->owner);
+ }
+ env->owner = NULL;
+}
/*! fill an AVPicture from our fbuf info, as it is required by
* the image conversion routines in ffmpeg.
@@ -2126,8 +2139,8 @@
/*
* I am seeing some kind of deadlock or stall around
* SDL_PumpEvents() while moving the window on a remote X server
- * (Xfree86-4.4.0), but it is unclear what causes it.
- * Could well be a problem on the X server I am using.
+ * (both xfree-4.4.0 and xorg 7.2)
+ * and windowmaker. It is unclear what causes it.
*/
/* grab a bunch of events */
@@ -2138,21 +2151,21 @@
SDL_Event ev[N_EVENTS];
#define MY_EV (SDL_MOUSEBUTTONDOWN|SDL_KEYDOWN)
- while ( (n = SDL_PeepEvents(ev, N_EVENTS, SDL_GETEVENT, MY_EV)) > 0) {
+ while ( (n = SDL_PeepEvents(ev, N_EVENTS, SDL_GETEVENT, SDL_ALLEVENTS)) > 0) {
for (i = 0; i < n; i++) {
- ast_log(LOG_WARNING, "-- event %d at %d %d\n",
+ ast_log(LOG_WARNING, "------ event %d at %d %d\n",
ev[i].type, ev[i].button.x, ev[i].button.y);
}
}
- ast_log(LOG_WARNING, "-- no event, n %d\n", n);
- if (0) {
- struct timeval a = ast_tvnow();
+ if (1) {
+ struct timeval b, a = ast_tvnow();
+ int i;
//SDL_Lock_EventThread();
- a = ast_tvnow();
- fprintf(stderr, "before Pump at %ld.%06lu\n", a.tv_sec, a.tv_usec);
SDL_PumpEvents();
- a = ast_tvnow();
- fprintf(stderr, "after Pump at %ld.%06lu\n", a.tv_sec, a.tv_usec);
+ b = ast_tvnow();
+ i = ast_tvdiff_ms(b, a);
+ if (i > 3)
+ fprintf(stderr, "-------- SDL_PumpEvents took %dms\n", i);
//SDL_Unlock_EventThread();
}
}
@@ -2189,10 +2202,6 @@
struct ast_channel *chan = env->owner;
int fd = chan->alertpipe[1];
- if (env->shutdown) {
- ast_log(LOG_WARNING, "video_thread shutting down\n");
- break;
- }
/* determine if video format changed */
if (count++ % 10 == 0) {
char buf[160];
@@ -2207,10 +2216,7 @@
}
eventhandler(env);
/* sleep for a while */
- if (1)
- SDL_Delay(50);
- else
- ast_select(0, NULL, NULL, NULL, &t);
+ ast_select(0, NULL, NULL, NULL, &t);
SDL_UpdateRects(env->screen, 1, &env->win[WIN_KEYPAD].rect);// XXX inefficient
/*
@@ -2239,6 +2245,8 @@
f = get_video_frames(env, &p); /* read and display */
if (!f)
continue;
+ if (env->shutdown)
+ break;
chan = env->owner;
ast_channel_lock(chan);
@@ -2271,7 +2279,6 @@
if (env->sdl_ok)
cleanup_sdl(env);
- env->owner = NULL;
env->shutdown = 0;
return NULL;
}
More information about the svn-commits
mailing list