firefox & flash9 patches
Chagin Dmitry
dchagin at freebsd.org
Wed Oct 1 17:08:23 UTC 2008
On Wed, Oct 01, 2008 at 06:52:37PM +0200, Tijl Coosemans wrote:
> On Monday 29 September 2008 22:02:37 Chagin Dmitry wrote:
> > please, test following patches (just -current).
> > with them firefox && flash9 forks for me,
> > I tested only on ia32 at amd64 with 2.6.16 enabled,
> > firefox 2.0.0.16 and flash9 plugin.
> >
> > If all is good, I will ask des@ and kib@ to review&commit them. thnx!
>
> On 7.1-PRERELEASE, linux 2.4, fc4, the linprocfs patch seems to improve
> things a lot. I'm still having crashes from time to time, but overall
> flash9 works much better. Great work!
>
second half of my patch (fooaffinity() related) can't be applied on RELENG_7,
I will prepare a patch for RELENG_7, will test?
> I've attached the patch for RELENG_7 (patch-linprocfs) and another
> patch for libflashsupport [1]. It should improve OSS support, A/V sync
> etc. For those without a linux box, I've attached a compiled version of
> the lib as well. You can drop it in /compat/linux/usr/lib.
>
> [1] http://sourceforge.net/projects/flashsupport/
> --- linprocfs.c.orig 2008-10-01 17:47:51.000000000 +0200
> +++ linprocfs.c 2008-10-01 17:49:02.000000000 +0200
> @@ -869,14 +869,12 @@
> static int
> linprocfs_doprocmaps(PFS_FILL_ARGS)
> {
> - char mebuffer[512];
> vm_map_t map = &p->p_vmspace->vm_map;
> vm_map_entry_t entry, tmp_entry;
> vm_object_t obj, tobj, lobj;
> vm_offset_t saved_end;
> vm_ooffset_t off = 0;
> char *name = "", *freename = NULL;
> - size_t len;
> ino_t ino;
> unsigned int last_timestamp;
> int ref_count, shadow_count, flags;
> @@ -894,13 +892,9 @@
> if (uio->uio_rw != UIO_READ)
> return (EOPNOTSUPP);
>
> - if (uio->uio_offset != 0)
> - return (0);
> -
> error = 0;
> vm_map_lock_read(map);
> - for (entry = map->header.next;
> - ((uio->uio_resid > 0) && (entry != &map->header));
> + for (entry = map->header.next; entry != &map->header;
> entry = entry->next) {
> name = "";
> freename = NULL;
> @@ -949,7 +943,7 @@
> * format:
> * start, end, access, offset, major, minor, inode, name.
> */
> - snprintf(mebuffer, sizeof mebuffer,
> + error = sbuf_printf(sb,
> "%08lx-%08lx %s%s%s%s %08lx %02x:%02x %lu%s%s\n",
> (u_long)entry->start, (u_long)entry->end,
> (entry->protection & VM_PROT_READ)?"r":"-",
> @@ -965,18 +959,11 @@
> );
> if (freename)
> free(freename, M_TEMP);
> - len = strlen(mebuffer);
> - if (len > uio->uio_resid)
> - len = uio->uio_resid; /*
> - * XXX We should probably return
> - * EFBIG here, as in procfs.
> - */
> last_timestamp = map->timestamp;
> vm_map_unlock_read(map);
> - error = uiomove(mebuffer, len, uio);
> + if (error == -1)
> + return (0);
> vm_map_lock_read(map);
> - if (error)
> - break;
> if (last_timestamp + 1 != map->timestamp) {
> /*
> * Look again for the entry because the map was
> --- flashsupport.c.orig 2008-10-01 16:25:02.000000000 +0200
> +++ flashsupport.c 2008-10-01 16:57:58.000000000 +0200
> @@ -44,11 +44,11 @@
> #endif // HAVE_ALSA_ASOUNDLIB_H
>
> #ifdef HAVE_LINUX_SOUNDCARD_H
> -//#define OSS
> +#define OSS
> #endif // HAVE_LINUX_SOUNDCARD_H
>
> #ifdef HAVE_LINUX_VIDEODEV_H
> -#define V4L1
> +//#define V4L1
> #endif // HAVE_LINUX_VIDEODEV_H
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////
> @@ -736,28 +736,23 @@
> int oss_fd;
> pthread_t thread;
> int signal;
> + char * buf;
> + int bsize;
> };
>
> static void *oss_thread(void *ptr)
> {
> struct SoundOutput_Instance *instance = (struct SoundOutput_Instance *)ptr;
> - char buffer[4096];
> - int len = 0;
> int written = 0;
> + usleep(100);
> for(;;) {
> - FPI_SoundOutput_FillBuffer(ptr,buffer,4096);
> - len = 4096;
> - while ( len ) {
> - written = write(instance->oss_fd, buffer, len);
> - if ( written >= 0 ) {
> - len -= written;
> - }
> - if ( instance->signal ) {
> - pthread_exit(0);
> - }
> - if ( written < 0 ) {
> - usleep(100);
> - }
> + FPI_SoundOutput_FillBuffer(ptr, instance->buf, instance->bsize);
> + written = write(instance->oss_fd, instance->buf, instance->bsize);
> + if ( instance->signal ) {
> + pthread_exit(0);
> + }
> + if ( written < 0 ) {
> + usleep(100);
> }
> }
> }
> @@ -784,12 +779,16 @@
>
> if ( ioctl(instance->oss_fd, SNDCTL_DSP_SPEED, &speed) < 0 ) goto fail;
>
> + if ( ioctl(instance->oss_fd, SNDCTL_DSP_GETBLKSIZE, &instance->bsize) < 0 ) goto fail;
> +
> + instance->buf = (char *)FPI_Mem_Alloc(instance->bsize);
> +
> if ( pthread_create(&instance->thread, 0, oss_thread, instance) < 0 ) goto fail;
>
> return instance;
> fail:
> if ( instance ) {
> - if ( FPI_Mem_Free ) FPI_Mem_Free(instance);
> + FPX_SoundOutput_Close(instance);
> }
> return 0;
> }
> @@ -803,18 +802,19 @@
>
> instance->signal = 1;
>
> - if ( instance->oss_fd ) {
> - ioctl(instance->oss_fd, SNDCTL_DSP_RESET, 0);
> - }
> -
> if ( instance->thread ) {
> pthread_join(instance->thread,&retVal);
> }
>
> if ( instance->oss_fd ) {
> + ioctl(instance->oss_fd, SNDCTL_DSP_RESET, 0);
> close(instance->oss_fd);
> }
>
> + if ( instance->buf ) {
> + if ( FPI_Mem_Free ) FPI_Mem_Free(instance->buf);
> + }
> +
> if ( FPI_Mem_Free ) FPI_Mem_Free(instance);
>
> return 0;
> @@ -827,10 +827,10 @@
> struct SoundOutput_Instance *instance = (struct SoundOutput_Instance *)ptr;
> if ( instance->oss_fd ) {
> int value = 0;
> - if ( ( value = ioctl(instance->oss_fd,SNDCTL_DSP_GETODELAY,&value) ) == 0 ) {
> - return value / 4;
> + if ( ioctl(instance->oss_fd,SNDCTL_DSP_GETODELAY,&value) == -1 ) {
> + return 0;
> }
> - return 0;
> + return value / 4;
> }
> return -1;
> }
I don't have soundcard, so I can't test it :)
thnx!
--
Have fun!
chd
More information about the freebsd-emulation
mailing list