X-Git-Url: http://andersk.mit.edu/gitweb/libfaim.git/blobdiff_plain/c5ca2538e0cb3b3ffbffee35f7bc9ec40f27d84c..37ee990eab0e60fadbc1555d3f4a7e85d2026297:/aim_snac.c?ds=sidebyside diff --git a/aim_snac.c b/aim_snac.c index c6b005b..08db68e 100644 --- a/aim_snac.c +++ b/aim_snac.c @@ -1,4 +1,3 @@ - /* * * Various SNAC-related dodads... @@ -13,6 +12,7 @@ * */ +#define FAIM_INTERNAL #include /* @@ -30,6 +30,25 @@ faim_internal void aim_initsnachash(struct aim_session_t *sess) return; } +faim_internal unsigned long aim_cachesnac(struct aim_session_t *sess, + const unsigned short family, + const unsigned short type, + const unsigned short flags, + const void *data, const int datalen) +{ + struct aim_snac_t snac; + + snac.id = sess->snac_nextid++; + snac.family = family; + snac.type = type; + snac.flags = flags; + + snac.data = malloc(datalen); + memcpy(snac.data, data, datalen); + + return aim_newsnac(sess, &snac); +} + /* * Clones the passed snac structure and caches it in the * list/hash. @@ -109,11 +128,12 @@ faim_internal struct aim_snac_t *aim_remsnac(struct aim_session_t *sess, faim_internal int aim_cleansnacs(struct aim_session_t *sess, int maxage) { - struct aim_snac_t *cur, *next, *prev = NULL; - time_t curtime; int i; for (i = 0; i < FAIM_SNAC_HASH_SIZE; i++) { + struct aim_snac_t *cur, **prev; + time_t curtime; + faim_mutex_lock(&sess->snac_hash_locks[i]); if (!sess->snac_hash[i]) { faim_mutex_unlock(&sess->snac_hash_locks[i]); @@ -122,24 +142,18 @@ faim_internal int aim_cleansnacs(struct aim_session_t *sess, curtime = time(NULL); /* done here in case we waited for the lock */ - cur = sess->snac_hash[i]; - while (cur) { - next = cur->next; + for (prev = &sess->snac_hash[i]; (cur = *prev); ) { if ((curtime - cur->issuetime) > maxage) { - if (sess->snac_hash[i] == cur) - prev = sess->snac_hash[i] = next; - else - prev->next = next; + + *prev = cur->next; /* XXX should we have destructors here? */ if (cur->data) free(cur->data); free(cur); - } else { - prev = cur; - } - cur = next; + } else + prev = &cur->next; } faim_mutex_unlock(&sess->snac_hash_locks[i]);