Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
Icecast-Server
Commits
a9d391ff
Commit
a9d391ff
authored
May 25, 2018
by
Philipp Schafft
🦁
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Feature: Added generic reference object
parent
54bbfc35
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
157 additions
and
0 deletions
+157
-0
src/Makefile.am
src/Makefile.am
+2
-0
src/icecasttypes.h
src/icecasttypes.h
+16
-0
src/refobject.c
src/refobject.c
+107
-0
src/refobject.h
src/refobject.h
+32
-0
No files found.
src/Makefile.am
View file @
a9d391ff
...
...
@@ -29,6 +29,7 @@ noinst_HEADERS = \
md5.h
\
matchfile.h
\
tls.h
\
refobject.h
\
event.h
\
event_log.h
\
event_exec.h
\
...
...
@@ -68,6 +69,7 @@ icecast_SOURCES = \
md5.c
\
matchfile.c
\
tls.c
\
refobject.c
\
format.c
\
format_ogg.c
\
format_mp3.c
\
...
...
src/icecasttypes.h
View file @
a9d391ff
...
...
@@ -9,6 +9,10 @@
#ifndef __ICECASTTYPES_H__
#define __ICECASTTYPES_H__
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "compat.h"
/* ---[ client.[ch] ]--- */
...
...
@@ -88,4 +92,16 @@ typedef enum {
typedef
struct
_relay_server
relay_server
;
/* ---[ refobject.[ch] ]--- */
typedef
struct
refobject_base_tag
refobject_base_t
;
#ifdef HAVE_TYPE_ATTRIBUTE_TRANSPARENT_UNION
typedef
union
__attribute__
((
__transparent_union__
))
{
refobject_base_t
*
refobject_base
;
}
refobject_t
;
#else
typedef
void
*
refobject_t
;
#endif
#endif
src/refobject.c
0 → 100644
View file @
a9d391ff
/* Icecast
*
* This program is distributed under the GNU General Public License, version 2.
* A copy of this license is included with this source.
*
* Copyright 2018, Philipp "ph3-der-loewe" Schafft <lion@lion.leolix.org>,
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include "common/thread/thread.h"
#include "refobject.h"
#ifdef HAVE_TYPE_ATTRIBUTE_TRANSPARENT_UNION
#define TO_BASE(x) ((x).refobject_base)
#else
#define TO_BASE(x) ((refobject_base_t*)(x))
#endif
refobject_t
refobject_new
(
size_t
len
,
refobject_free
freecb
,
void
*
userdata
)
{
refobject_base_t
*
ret
=
NULL
;
if
(
len
<
sizeof
(
refobject_base_t
))
return
(
refobject_t
)
ret
;
ret
=
calloc
(
1
,
len
);
if
(
ret
==
NULL
)
return
(
refobject_t
)
ret
;
ret
->
refc
=
1
;
ret
->
freecb
=
freecb
;
ret
->
userdata
=
userdata
;
thread_mutex_create
(
&
(
ret
->
lock
));
return
(
refobject_t
)
ret
;
}
int
refobject_ref
(
refobject_t
self
)
{
if
(
TO_BASE
(
self
)
==
NULL
)
return
-
1
;
thread_mutex_lock
(
&
(
TO_BASE
(
self
)
->
lock
));
TO_BASE
(
self
)
->
refc
++
;
thread_mutex_unlock
(
&
(
TO_BASE
(
self
)
->
lock
));
return
0
;
}
int
refobject_unref
(
refobject_t
self
)
{
register
refobject_base_t
*
base
=
TO_BASE
(
self
);
if
(
base
==
NULL
)
return
-
1
;
thread_mutex_lock
(
&
(
base
->
lock
));
base
->
refc
--
;
if
(
base
->
refc
)
{
thread_mutex_unlock
(
&
(
base
->
lock
));
return
0
;
}
if
(
base
->
freecb
)
base
->
freecb
(
self
,
&
(
base
->
userdata
));
if
(
base
->
userdata
)
free
(
base
->
userdata
);
thread_mutex_unlock
(
&
(
base
->
lock
));
thread_mutex_destroy
(
&
(
base
->
lock
));
return
0
;
}
void
*
refobject_get_userdata
(
refobject_t
self
)
{
void
*
ret
;
if
(
TO_BASE
(
self
)
==
NULL
)
return
NULL
;
thread_mutex_lock
(
&
(
TO_BASE
(
self
)
->
lock
));
ret
=
TO_BASE
(
self
)
->
userdata
;
thread_mutex_unlock
(
&
(
TO_BASE
(
self
)
->
lock
));
return
ret
;
}
int
refobject_set_userdata
(
refobject_t
self
,
void
*
userdata
)
{
if
(
TO_BASE
(
self
)
==
NULL
)
return
-
1
;
thread_mutex_lock
(
&
(
TO_BASE
(
self
)
->
lock
));
TO_BASE
(
self
)
->
userdata
=
userdata
;
thread_mutex_unlock
(
&
(
TO_BASE
(
self
)
->
lock
));
return
0
;
}
src/refobject.h
0 → 100644
View file @
a9d391ff
/* Icecast
*
* This program is distributed under the GNU General Public License, version 2.
* A copy of this license is included with this source.
*
* Copyright 2018, Philipp "ph3-der-loewe" Schafft <lion@lion.leolix.org>,
*/
#ifndef __REFOBJECT_H__
#define __REFOBJECT_H__
#include "common/thread/thread.h"
#include "icecasttypes.h"
#include "compat.h"
typedef
void
(
*
refobject_free
)(
refobject_t
self
,
void
**
userdata
);
struct
refobject_base_tag
{
size_t
refc
;
mutex_t
lock
;
void
*
userdata
;
refobject_free
freecb
;
};
refobject_t
refobject_new
(
size_t
len
,
refobject_free
freecb
,
void
*
userdata
);
int
refobject_ref
(
refobject_t
self
);
int
refobject_unref
(
refobject_t
self
);
void
*
refobject_get_userdata
(
refobject_t
self
);
int
refobject_set_userdata
(
refobject_t
self
,
void
*
userdata
);
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment