ShmPipe * sp_client_open (const char *path) { ShmPipe *self = spalloc_new (ShmPipe); struct sockaddr_un sock_un; int flags; memset (self, 0, sizeof (ShmPipe)); self->main_socket = socket (PF_UNIX, SOCK_STREAM, 0); self->use_count = 1; if (self->main_socket < 0) goto error; flags = fcntl (self->main_socket, F_GETFL, 0); if (flags < 0) goto error; if (fcntl (self->main_socket, F_SETFL, flags | FD_CLOEXEC) < 0) goto error; sock_un.sun_family = AF_UNIX; strncpy (sock_un.sun_path, path, sizeof (sock_un.sun_path) - 1); if (connect (self->main_socket, (struct sockaddr *) &sock_un, sizeof (struct sockaddr_un)) < 0) goto error; return self; error: sp_client_close (self); return NULL; }
static void gst_shm_pipe_dec (GstShmPipe * pipe) { g_return_if_fail (pipe); g_return_if_fail (pipe->src); g_return_if_fail (pipe->use_count > 0); GST_OBJECT_LOCK (pipe->src); pipe->use_count--; if (pipe->use_count > 0) { GST_OBJECT_UNLOCK (pipe->src); return; } if (pipe->pipe) sp_client_close (pipe->pipe); GST_OBJECT_UNLOCK (pipe->src); gst_object_unref (pipe->src); g_slice_free (GstShmPipe, pipe); }