diff options
author | Corey Farrell <git@cfware.com> | 2015-04-29 00:35:22 -0400 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2015-04-29 13:28:54 -0400 |
commit | c9c03998cc9c57acbf1998a0cbc0bc1fa6d24edb (patch) | |
tree | bd11b677fedc5ff69bbad932a55b99854c09f023 /main/astobj2.c | |
parent | ed5715eb3994d08fdf81001dabdb39b171a308ac (diff) |
Astobj2: Add ao2_weakproxy_ref_object function.
This function allows code to run ao2_ref against the real
object associated with a weakproxy. It is useful when
all of the following conditions are true:
* You have a pointer to weakproxy.
* You do not have or need a pointer to the real object.
* You need to ensure the real object exists and is not
destroyed during a process.
In this case it's wasteful to store a pointer to the real
object just for the sake of releasing it later.
Change-Id: I38a319b83314de75be74207a8771aab269bcca46
Diffstat (limited to 'main/astobj2.c')
-rw-r--r-- | main/astobj2.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/main/astobj2.c b/main/astobj2.c index c5b5cd957..f9dd8d490 100644 --- a/main/astobj2.c +++ b/main/astobj2.c @@ -836,6 +836,33 @@ int __ao2_weakproxy_set_object(void *weakproxy, void *obj, int flags, return ret; } +int __ao2_weakproxy_ref_object(void *weakproxy, int delta, int flags, + const char *tag, const char *file, int line, const char *func) +{ + struct astobj2 *internal = __INTERNAL_OBJ_CHECK(weakproxy, file, line, func); + int ret = -1; + + if (!internal || internal->priv_data.magic != AO2_WEAK) { + /* This method is meant to be run on weakproxy objects! */ + return -2; + } + + /* We have a weak object, grab lock. */ + if (!(flags & OBJ_NOLOCK)) { + ao2_lock(weakproxy); + } + + if (internal->priv_data.weakptr) { + ret = __ao2_ref(internal->priv_data.weakptr, delta, tag, file, line, func); + } + + if (!(flags & OBJ_NOLOCK)) { + ao2_unlock(weakproxy); + } + + return ret; +} + void *__ao2_weakproxy_get_object(void *weakproxy, int flags, const char *tag, const char *file, int line, const char *func) { |