diff --git a/daemon/janus.c b/daemon/janus.c index 943d66fe8..16f99037f 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -32,6 +32,7 @@ struct janus_room { uint64_t handle_id; // controlling handle which created the room GHashTable *publishers; // handle ID -> feed ID GHashTable *subscribers; // handle ID -> subscribed feed ID + GHashTable *feeds; // feed ID -> handle ID }; @@ -40,7 +41,6 @@ static GHashTable *janus_tokens; // auth tokens, currently mostly unused static GHashTable *janus_sessions; // session ID -> session. holds a session reference static GHashTable *janus_handles; // handle ID -> handle static GHashTable *janus_rooms; // room ID -> room -static GHashTable *janus_feeds; // feed ID -> handle ID static void __janus_session_free(void *p) { @@ -185,6 +185,7 @@ static const char *janus_videoroom_create(struct janus_session *session, struct // XXX optimise for 64-bit archs room->publishers = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free); room->subscribers = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free); + room->feeds = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free); uint64_t room_id = 0; if (json_reader_read_member(reader, "room")) { @@ -293,6 +294,7 @@ static const char *janus_videoroom_destroy(struct janus_session *session, g_free(room->call_id.s); g_hash_table_destroy(room->publishers); g_hash_table_destroy(room->subscribers); + g_hash_table_destroy(room->feeds); g_slice_free1(sizeof(*room), room); //XXX notify? @@ -404,12 +406,13 @@ static void janus_publishers_list(JsonBuilder *builder, struct call *call, struc } +// global janus_lock is held static const char *janus_videoroom_join_sub(struct janus_handle *handle, struct janus_room *room, int *retcode, uint64_t feed_id, struct call *call, GQueue *srcs) { // does the feed actually exist? get the feed handle *retcode = 512; - uint64_t *feed_handle = g_hash_table_lookup(janus_feeds, &feed_id); + uint64_t *feed_handle = g_hash_table_lookup(room->feeds, &feed_id); if (!feed_handle) return "No such feed exists"; if (!g_hash_table_lookup(room->publishers, feed_handle)) @@ -509,13 +512,13 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan feed_id = janus_random(); if (!feed_id) continue; - if (g_hash_table_lookup(janus_feeds, &feed_id)) + if (g_hash_table_lookup(room->feeds, &feed_id)) continue; break; } // feed ID points to the handle - g_hash_table_insert(janus_feeds, uint64_dup(feed_id), uint64_dup(handle->id)); + g_hash_table_insert(room->feeds, uint64_dup(feed_id), uint64_dup(handle->id)); // handle ID points to the feed g_hash_table_insert(room->publishers, uint64_dup(handle->id), uint64_dup(feed_id)); } @@ -968,7 +971,7 @@ static const char *janus_videoroom_start(struct websocket_message *wm, struct ja return "Not a subscriber"; *retcode = 512; - uint64_t *feed_handle = g_hash_table_lookup(janus_feeds, feed_id); + uint64_t *feed_handle = g_hash_table_lookup(room->feeds, feed_id); if (!feed_handle) return "No such feed exists"; @@ -1959,7 +1962,6 @@ void janus_init(void) { janus_sessions = g_hash_table_new(g_int64_hash, g_int64_equal); janus_handles = g_hash_table_new(g_int64_hash, g_int64_equal); janus_rooms = g_hash_table_new(g_int64_hash, g_int64_equal); - janus_feeds = g_hash_table_new_full(g_int64_hash, g_int64_equal, g_free, g_free); // XXX timer thread to clean up orphaned sessions } void janus_free(void) { @@ -1968,5 +1970,4 @@ void janus_free(void) { g_hash_table_destroy(janus_sessions); g_hash_table_destroy(janus_handles); g_hash_table_destroy(janus_rooms); - g_hash_table_destroy(janus_feeds); }