extra_rwops.c
author Ozkan Sezer <sezero@users.sourceforge.net>
Wed, 24 May 2017 11:28:05 -0400
changeset 599 f0d57c9b72d8
parent 552 2e8907ff98e9
child 601 5b36839bb796
permissions -rw-r--r--
timidity.c: fix potential buffer overrun in RWgets (num_read check was off-by-one.) also simplify the procedure a bit. (transplanted from 0c4026dd32742e8b7d33fb96d40fe3c03b02f90c)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     1
/*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     2
 * SDL_sound -- An abstract sound format decoding API.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     3
 * Copyright (C) 2001  Ryan C. Gordon.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     4
 *
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     5
 * This library is free software; you can redistribute it and/or
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     7
 * License as published by the Free Software Foundation; either
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     8
 * version 2.1 of the License, or (at your option) any later version.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
     9
 *
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    10
 * This library is distributed in the hope that it will be useful,
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    14
 *
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    16
 * License along with this library; if not, write to the Free Software
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    18
 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    19
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    20
/*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    21
 * Some extra RWops that are needed or are just handy to have.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    22
 *
552
2e8907ff98e9 Replaced references to COPYING with references to LICENSE.txt ...
Ryan C. Gordon <icculus@icculus.org>
parents: 526
diff changeset
    23
 * Please see the file LICENSE.txt in the source's root directory.
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    24
 *
526
2df1f5c62d38 Updated my email address.
Ryan C. Gordon <icculus@icculus.org>
parents: 491
diff changeset
    25
 *  This file written by Ryan C. Gordon. (icculus@icculus.org)
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    26
 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    27
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    28
#include <stdio.h>
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    29
#include <stdlib.h>
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    30
#include "SDL.h"
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    31
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    32
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    33
    /*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    34
     * The Reference Counter RWops...
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    35
     */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    36
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    37
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    38
typedef struct
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    39
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    40
    SDL_RWops *rw;  /* The actual RWops we're refcounting... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    41
    int refcount;   /* The refcount; starts at 1. If goes to 0, delete. */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    42
} RWRefCounterData;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    43
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    44
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    45
/* Just pass through to the actual SDL_RWops's method... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    46
static int refcounter_seek(SDL_RWops *rw, int offset, int whence)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    47
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    48
    RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    49
    return(data->rw->seek(data->rw, offset, whence));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    50
} /* refcounter_seek */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    51
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    52
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    53
/* Just pass through to the actual SDL_RWops's method... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    54
static int refcounter_read(SDL_RWops *rw, void *ptr, int size, int maxnum)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    55
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    56
    RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    57
    return(data->rw->read(data->rw, ptr, size, maxnum));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    58
} /* refcounter_read */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    59
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    60
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    61
/* Just pass through to the actual SDL_RWops's method... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    62
static int refcounter_write(SDL_RWops *rw, const void *ptr, int size, int num)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    63
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    64
    RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    65
    return(data->rw->write(data->rw, ptr, size, num));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    66
} /* refcounter_write */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    67
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    68
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    69
/*
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    70
 * Decrement the reference count. If there are no more references, pass
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    71
 *   through to the actual SDL_RWops's method, and then clean ourselves up.
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    72
 */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    73
static int refcounter_close(SDL_RWops *rw)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    74
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    75
    int retval = 0;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    76
    RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    77
    data->refcount--;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    78
    if (data->refcount <= 0)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    79
    {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    80
        retval = data->rw->close(data->rw);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    81
        free(data);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    82
        SDL_FreeRW(rw);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    83
    } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    84
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    85
    return(retval);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    86
} /* refcounter_close */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    87
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    88
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    89
void RWops_RWRefCounter_addRef(SDL_RWops *rw)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    90
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    91
    RWRefCounterData *data = (RWRefCounterData *) rw->hidden.unknown.data1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    92
    data->refcount++;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    93
} /* RWops_RWRefCounter_addRef */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    94
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    95
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    96
SDL_RWops *RWops_RWRefCounter_new(SDL_RWops *rw)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    97
{
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    98
    SDL_RWops *retval = NULL;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    99
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   100
    if (rw == NULL)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   101
    {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   102
        SDL_SetError("NULL argument to RWops_RWRefCounter_new().");
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   103
        return(NULL);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   104
    } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   105
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   106
    retval = SDL_AllocRW();
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   107
    if (retval != NULL)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   108
    {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   109
        RWRefCounterData *data;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   110
        data = (RWRefCounterData *) malloc(sizeof (RWRefCounterData));
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   111
        if (data == NULL)
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   112
        {
83
2b5ba7f33840 Stopped using SDL_OutOfMemory().
Ryan C. Gordon <icculus@icculus.org>
parents: 8
diff changeset
   113
            SDL_SetError("Out of memory.");
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   114
            SDL_FreeRW(retval);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   115
            retval = NULL;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   116
        } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   117
        else
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   118
        {
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   119
            data->rw = rw;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   120
            data->refcount = 1;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   121
            retval->hidden.unknown.data1 = data;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   122
            retval->seek = refcounter_seek;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   123
            retval->read = refcounter_read;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   124
            retval->write = refcounter_write;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   125
            retval->close = refcounter_close;
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   126
        } /* else */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   127
    } /* if */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   128
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   129
    return(retval);
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   130
} /* RWops_RWRefCounter_new */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   131
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   132
485
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   133
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   134
    /*
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   135
     * RWops pooling...
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   136
     */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   137
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   138
static SDL_RWops *rwops_pool = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   139
static SDL_mutex *rwops_pool_mutex = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   140
491
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   141
SDL_RWops *RWops_pooled_alloc(void)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   142
{
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   143
    SDL_RWops *rw;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   144
    if (rwops_pool_mutex == NULL)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   145
        return(NULL);  /* never initialized. */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   146
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   147
    SDL_LockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   148
    rw = rwops_pool;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   149
    if (rw)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   150
        rwops_pool = (SDL_RWops *) (rw->hidden.unknown.data1);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   151
    SDL_UnlockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   152
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   153
    if (!rw)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   154
        rw = (SDL_RWops *) malloc(sizeof (SDL_RWops));
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   155
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   156
    return(rw);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   157
} /* RWops_pooled_alloc */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   158
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   159
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   160
void RWops_pooled_free(SDL_RWops *rw)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   161
{
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   162
    if (rwops_pool_mutex == NULL)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   163
        return;  /* never initialized...why are we here? */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   164
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   165
    if (rw == NULL)
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   166
        return;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   167
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   168
    SDL_LockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   169
    rw->hidden.unknown.data1 = rwops_pool;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   170
    rwops_pool = rw;
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   171
    SDL_UnlockMutex(rwops_pool_mutex);
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   172
} /* RWops_pooled_free */
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   173
8e9720b66e55 Patched to compile on more severe compilers.
Ryan C. Gordon <icculus@icculus.org>
parents: 490
diff changeset
   174
485
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   175
int RWops_pooled_init(void)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   176
{
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   177
    const int preallocate = 50;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   178
    int i;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   179
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   180
    rwops_pool_mutex = SDL_CreateMutex();
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   181
    if (rwops_pool_mutex == NULL)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   182
        return(0);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   183
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   184
    for (i = 0; i < preallocate; i++)
490
c7ab783f05d3 Patched to compile.
Ryan C. Gordon <icculus@icculus.org>
parents: 485
diff changeset
   185
        RWops_pooled_free(RWops_pooled_alloc());
485
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   186
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   187
    return(1);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   188
} /* RWops_pooled_init */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   189
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   190
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   191
void RWops_pooled_deinit(void)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   192
{
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   193
    SDL_RWops *cur;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   194
    SDL_RWops *next;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   195
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   196
    if (rwops_pool_mutex == NULL)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   197
        return;  /* never initialized. */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   198
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   199
    SDL_LockMutex(rwops_pool_mutex);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   200
    /* all allocated rwops must be in the pool now, or the memory leaks. */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   201
    cur = rwops_pool;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   202
    rwops_pool = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   203
    SDL_UnlockMutex(rwops_pool_mutex);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   204
    SDL_DestroyMutex(rwops_pool_mutex);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   205
    rwops_pool_mutex = NULL;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   206
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   207
    while (cur)
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   208
    {
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   209
        next = (SDL_RWops *) (cur->hidden.unknown.data1);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   210
        free(cur);
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   211
        cur = next;
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   212
    } /* while */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   213
} /* RWops_pooled_deinit */
137c0b00ea4c Added Sound_NewSampleFromMem(), and implementation of RWops pooling.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
   214
8
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   215
/* end of extra_rwops.c ... */
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   216
dca15bb29d35 Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
   217