53
53
#include <pmfapi.h>
54
54
#include <lsqfetch.h>
56
#define ASN2ALL_APP_VER "1.8"
56
#define ASN2ALL_APP_VER "2.4"
58
58
CharPtr ASN2ALL_APPLICATION = ASN2ALL_APP_VER;
60
static ValNodePtr requested_uid_list = NULL;
61
static TNlmMutex requested_uid_mutex = NULL;
63
static ValNodePtr locked_bsp_list = NULL;
64
static TNlmMutex locked_bsp_mutex = NULL;
66
static void AddUidToQueue (
71
ValNodePtr last = NULL, vnp;
75
if (sip == NULL || sip->choice != SEQID_GI) return;
76
uid = (Int4) sip->data.intvalue;
79
ret = NlmMutexLockEx (&requested_uid_mutex);
81
ErrPostEx (SEV_FATAL, 0, 0, "AddUidToQueue mutex failed [%ld]", (long) ret);
85
/* check against uids already in queue */
88
for (vnp = requested_uid_list; vnp != NULL; vnp = vnp->next) {
90
if ((Int4) vnp->data.intvalue == uid) break;
93
/* add uid to queue */
97
vnp = ValNodeAddInt (&last, 0, uid);
100
requested_uid_list = ValNodeAddInt (NULL, 0, uid);
101
last = requested_uid_list;
105
NlmMutexUnlock (requested_uid_mutex);
108
static Int4 RemoveUidFromQueue (
116
ret = NlmMutexLockEx (&requested_uid_mutex);
118
ErrPostEx (SEV_FATAL, 0, 0, "RemoveUidFromQueue mutex failed [%ld]", (long) ret);
122
/* extract next requested uid from queue */
124
if (requested_uid_list != NULL) {
125
vnp = requested_uid_list;
126
requested_uid_list = vnp->next;
128
uid = (Int4) vnp->data.intvalue;
132
NlmMutexUnlock (requested_uid_mutex);
137
static void QueueFarSegments (SeqLocPtr slp)
145
if (slp == NULL) return;
147
sip = SeqLocId (slp);
149
loc = SeqLocFindNext (slp, NULL);
151
sip = SeqLocId (loc);
154
if (sip == NULL) return;
156
/* if packaged in record, no need to fetch it */
158
if (BioseqFindCore (sip) != NULL) return;
160
/* check against currently locked records */
162
for (vnp = locked_bsp_list; vnp != NULL; vnp = vnp->next) {
163
bsp = (BioseqPtr) vnp->data.ptrvalue;
164
if (bsp == NULL) continue;
165
if (SeqIdIn (sip, bsp->id)) return;
171
static void QueueFarBioseqs (BioseqPtr bsp, Pointer userdata)
175
SeqLocPtr slp = NULL;
178
if (bsp == NULL) return;
180
if (bsp->repr == Seq_repr_seg) {
181
vn.choice = SEQLOC_MIX;
183
vn.data.ptrvalue = bsp->seq_ext;
185
while ((slp = SeqLocFindNext (&vn, slp)) != NULL) {
186
if (slp != NULL && slp->choice != SEQLOC_NULL) {
187
QueueFarSegments (slp);
190
} else if (bsp->repr == Seq_repr_delta) {
191
for (dsp = (DeltaSeqPtr) (bsp->seq_ext); dsp != NULL; dsp = dsp->next) {
192
if (dsp->choice == 1) {
193
slp = (SeqLocPtr) dsp->data.ptrvalue;
194
if (slp != NULL && slp->choice != SEQLOC_NULL) {
195
QueueFarSegments (slp);
202
static void AddBspToList (
210
if (bsp == NULL) return;
212
ret = NlmMutexLockEx (&locked_bsp_mutex);
214
ErrPostEx (SEV_FATAL, 0, 0, "AddBspToList mutex failed [%ld]", (long) ret);
218
vnp = ValNodeAddPointer (&locked_bsp_list, 0, (Pointer) bsp);
220
NlmMutexUnlock (locked_bsp_mutex);
223
static ValNodePtr ExtractBspList (
231
ret = NlmMutexLockEx (&locked_bsp_mutex);
233
ErrPostEx (SEV_FATAL, 0, 0, "ExtractBspList mutex failed [%ld]", (long) ret);
237
vnp = locked_bsp_list;
238
locked_bsp_list = NULL;
240
NlmMutexUnlock (locked_bsp_mutex);
245
static VoidPtr DoAsyncLookup (
254
MemSet ((Pointer) &vn, 0, sizeof (ValNode));
256
uid = RemoveUidFromQueue ();
259
vn.choice = SEQID_GI;
260
vn.data.intvalue = uid;
263
bsp = BioseqLockById (&vn);
268
uid = RemoveUidFromQueue ();
274
#define NUM_ASYNC_LOOKUP_THREADS 5
276
static void ProcessAsyncLookups (
283
TNlmThread thds [NUM_ASYNC_LOOKUP_THREADS];
285
/* spawn several threads for individual BioseqLockById requests */
287
for (i = 0; i < NUM_ASYNC_LOOKUP_THREADS; i++) {
288
thds [i] = NlmThreadCreate (DoAsyncLookup, NULL);
291
/* wait for all fetching threads to complete */
293
for (i = 0; i < NUM_ASYNC_LOOKUP_THREADS; i++) {
294
NlmThreadJoin (thds [i], &status);
298
static ValNodePtr AsyncLockFarComponents (
304
ValNodePtr bsplist = NULL, sublist, vnp;
307
if (sep == NULL) return NULL;
308
oldsep = SeqEntrySetScope (sep);
310
/* add far uids to queue */
312
VisitBioseqsInSep (sep, NULL, QueueFarBioseqs);
314
/* fetching from uid list using several threads */
316
ProcessAsyncLookups ();
318
sublist = ExtractBspList ();
320
/* take list, look for seg or delta, recurse */
322
while (sublist != NULL) {
323
for (vnp = sublist; vnp != NULL; vnp = vnp->next) {
324
bsp = (BioseqPtr) vnp->data.ptrvalue;
325
if (bsp == NULL) continue;
326
QueueFarBioseqs (bsp, NULL);
329
ValNodeLink (&bsplist, sublist);
332
ProcessAsyncLookups ();
334
sublist = ExtractBspList ();
337
SeqEntrySetScope (oldsep);
341
60
static ValNodePtr DoLockFarComponents (
343
62
Boolean useThreads
1075
835
TRUE, 'c', ARG_BOOLEAN, 0.0, 0, NULL},
1076
836
{"Remote Fetching", "F", NULL, NULL,
1077
837
TRUE, 'r', ARG_BOOLEAN, 0.0, 0, NULL},
838
{"Local Fetching", "F", NULL, NULL,
839
TRUE, 'k', ARG_BOOLEAN, 0.0, 0, NULL},
1078
840
{"Path to Indexed Binary ASN.1 Data", NULL, NULL, NULL,
1079
841
TRUE, 'd', ARG_STRING, 0.0, 0, NULL},
1080
842
{"Lock Components in Advance", "F", NULL, NULL,