LinuxÒÁµéÔ°ÂÛ̳'s Archiver

ljq1000 ·¢±íÓÚ 2008-3-24 15:33

Ò»¸ölinuxϹ²ÏíÄÚ´æµÄÓ¦ÓÃ

´ó¼ÒºÃ£º
hB:GE6t4JI     ÕâÊÇÒ»¸öÎÒÔÚ¹¤×÷ÖÐʹÓõĻùÓÚlinux¹²ÏíÄÚ´æµÄÀà¡£Éè¼ÆËüµÄÄ¿µÄÊÇΪÁËÔÚÁ½¸ö»ò¶à¸ö½ø³Ì¼äͬ²½»òÒì²½µÄ´«Êä½á¹¹»¯Êý¾Ý¡£
?^.mg/Y9t     ¸ÃÀàµÄʵÏÖÉæ¼°µ½ÒÔÏ ֪ʶµã£º¹²ÏíÄÚ´æ¡¢ÐźÅÁ¿¡¢ÐźźÍARMÉϵÄÄÚ´æ¶ÔÆë·½Ê½µÈ¡£k/ie [B
    ÎÒÊÇÏë½è´Ë»ú»áÅ×שÒýÓñ£¬Ôںʹó¼Ò¹²Í¬Ñ§Ï°Ö®Ó࣬ҲϣÍû¸÷λÄܹ»²»Áß·¢±í¸ß¼û£¬ÌÖÂÛÒ»ÏÂÕâ¸öÀàµÄÓÅȱµãÒÔ¼°ÊµÏÖ½ø³Ì¼äͨПüºÃ¸ü¸ßЧµÄ·½·¨¡£vn%U/oIp l
    ÎÒµÄÁªÏµ·½Ê½ÊÇ [email=ljq1000@hotmail.com]ljq1000@hotmail.com[/email]£¬»¶Ó­´ó¼ÒÓëÎÒÁªÏµ¡£ P1PX;uO?;A$WA3E
[code]/*********************************************************************
8W)}0r`!~8V'Ko
'J9{8oyF0R   Auther: Li Jieqian3fE;y;nHN&Ej"I+CX0Q

:\E'dTVx   The MQShm class provides transporting structural data synchronously
8X M|8~X~t e;v between two process.2R,^ kzN%D Y-N
~\FHtH fK fQo!o
  One of the process is called Data-Maker, the other called Data-Customer.
}&{yr/|:e The functionaly of process is relative. gI@1S2G
;^7v:l?s]*zN
  Usage in Data-Maker:C#F:` j1\p5zE
  lock -> set status to busy -> fill data in shm -> set status to ready -> 7}-q*Wv.@x)d r#S
unlock -> wait status OK
:`W/T[,_%T5{Md.n
A4oUV0Lf   Usage in Data-Customer:
x"k!~!b)M8d]'h$s[   wait status ready -> lock -> get data -> clear shm -> set status to OK#Lp~ }){ hE
PWWgx7[dW0ot
  Note that: MQShm class use a unix share memory and two semphones. H w p hr+zV
Share memory is created with a KEY user defined, semphones is created $P l~+[!C YA
with key KEY and KEY + 1.GS+`S$p

"Kz6r#m%{ ************************************************************************/lL)C7W`h.J

:JE[2Ivrt:d0@ #ifndef MQSHM_H[6U$lH| Pj$|w
#define MQSHM_H-p3j Hro*K
MP!u"l+L b(z6H_"@b
#include <sys/ipc.h>
!F7W*w^M Us:r3a #include <sys/shm.h>9H},i^k9M
/p@0r$@y-T#I-Lg$H
typedef unsigned int  uint;
;|(]:Z)LCCx%a.F typedef unsigned char uchar;
$I:wh/VTv typedef unsigned short ushort;z+Uf}]%VZ#c
typedef unsigned short link_t;b'fV h@;Uic0p:[&e{c

!l'j&PYK3` })\5I const link_t ALIGN_MASK = 0x8000;
v^6P s\Y&V w
eSBd;G2V struct MQShmPriv;
'at0nV N,C C v lt.zC~
class MQShm7yE'@Q3}8VsJ0@
{7kX2Sl0N?1c
public:
&r_0F;Ixb:]   // shm status5sNv:}u4nM7I|a
  enum {
*|Q"WjBe     StUnknown = 0, L)S!vI6CAwi
    StOK = 1, $GZ\U7ON}S+k
    StError = 2,
8u'R?1j&R2c4U[ Ec7TW     StBusy = 4,
w'ks(}z     StReady = 8'R,q#\LZ3qp
  };
C!g0tDlF"Z5O3| %^ ~ l7Zk6k*x
  static const link_t null = (link_t) -1 & ~ALIGN_MASK;gKC5i cu
@;IN5M3}]4W"n$W
private:)U} v @!R
  int _shmId;
-_-dt8Al#C&i   int _shmSemId;k8s1c/K{7\2W/k
  int _pidSemId;
/hk9}9M5b\I y   size_t _size;Q7n([/Ey!r
  uchar *_shm;,`]HzY[^
  MQShmPriv *_priv;
b|8lt#Q E   int _myPidIdx;vL#Yfs*P.Z
B](V%bWZ]
private:
kof`v${o   void pidLock();
%i/G.gZ X.R%sv   void pidUnlock();2VXGrj @

@C#kV| public:
4Kt(Ta0b sX ?   MQShm(key_t key, size_t size, bool init = false);
KQ#yjRLO   virtual ~MQShm();
6}&h!a:l{ g;zBm g.L_zH w J m5i[p
  void close();
6I*vX \ F cV*zBj.I &h-F9f9pn P8my:W8U
  void lock(); N?1_1H7{;g"j p
  void unlock();
{$d|1Q2z9m   bool locked();
G+o,j2o,FWDa /|m1De h$Z
  uint freeSpace() const;
6z(U`M\#_ o^
HJvK3mh.n6@   uint itemCount() const;i9Xqx i$S

2Z\'c$r(_s9Pe;BFi   // user defined counter operation
wE)D;R;]J   void clrCounter();
OgA5r8[-P   uint getCounter() const;Q&Pq6G9]+N
  void setCounter(uint n);c0lk} _

y u$?)E%hD%Q   // status operation
3moPM&jhG,pI Fy\   int status() const;
P:t#Av+KA b:ni   void setStatus(int st);8bYw6n&lHy2f
  bool waitStatus(int st, uint timeout = 20);!K+Kj5I\&N I n?$S
)_8Cn]3fqh
  void append(const uchar *data, uint len);HM q7L8b
N \e5y8XA\T
  // clear all items in the shm, but do not change
A(Ir"r v4q `d   // the user defined counter and status value
4?X4_/Q6`4o   void clear();
?@A;[2LRt,QV)] &u$wV%iD+{/Wn!h2U+m
  class const_iterator;,gxO0N X*vi3k
  friend class const_iterator;
6K;S5E9p h*m   class const_iterator
*k$Cf3Zu*x%_^D   {m9Gy(B'n+^ }
  private:
g'ft$iBb@r#vWu     const MQShm *_mqShm;
0r{(i I3GS     link_t _linkv;!?s3L^E R

CV {3NF c     // constructor for MQShm
#bOs-m2Rc6?(Xp     const_iterator(const MQShm *mqShm, link_t linkv)
*x%Uf [(jF       : _mqShm(mqShm), _linkv(linkv) {}{9}8~&Kv9x@7~ Q5f

lNe#`?Gh(GL#D~   public:
(@N-Q7R? N/YZ1U     ~const_iterator() {}
E|l x o}^h z(B np0w&FE'dK2dP
    const uchar *data() const;
rapyA$t&g     uint size() const;
(Yq tlRv:hbG#l-M ?)Yq i&{)XZ
    const_iterator &operator++();(k1aih4?

:S!w3[8@Q'U @f     bool operator==(const const_iterator &rhs) const;
R,O!gS%N$kA+s h |n     bool operator!=(const const_iterator &rhs) const;
]a:X&`y6c![8w9u
~!r|9C \W,f     friend class MQShm;
ezh.Wpk;q#~   };!~4N:Y]%qzp,K:EX
"WFB qF;B
  MQShm::const_iterator begin() const;
|/c+I5n m"nc:AdW   MQShm::const_iterator end() const;
7FZ4Q4QCe };
)NG ~*o-j&ze D}\/]Lr
#endif[/code]
"uVjq_Q*A
8efx J Hx i [[i] ±¾Ìû×îºóÓÉ flag ÓÚ 2008-3-25 22:12 ±à¼­ [/i]]

ljq1000 ·¢±íÓÚ 2008-3-24 15:37

ʵÏÖ

[code]Xg\ }Y-Oa
*x0U;YCQ
#include <stdio.h>
6SY x}` #include <stdlib.h>J B0\%hkeO
#include <string.h>
'`hV@6h$h2M`f #include <fcntl.h>2@+m'gGX_*z3a
#include <unistd.h>
3nT}-aE5X7pp #include <signal.h>
_8F Q?'K sY b%P #include <sys/sem.h>%sV/h?B1~&D4r
#include "mqshm.h"
s#T+l'?3N w@%N N-x@
Oo{-o.]L)Q&l]QX5o(Z d #define LINKER_SIZE (sizeof(link_t)) LI `8F!Rk n

]aRXtlVb8y #ifndef ASSERT ~\M'Q:M4U5y^
#include <assert.h>
7u ?(BCp%qf #define ASSERT(exp) assert(exp)
1] z ^lJ{[%? #endifM.~jy4T5KP

LQ:A]b Gm_O const int SHM_MAX_PIDS = 8;-Tb N;Jz8zN)aw Y

.N,x WT;J union semun
t U+TG` HP {
XY;Ph}@*_   int              val;    /* Value for SETVAL */
s Or8Th   struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */0gd jt U s @Q
  unsigned short  *array;  /* Array for GETALL, SETALL */'M6q'?']k&q a)jk4I/P
  struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux specific) */
GsB%j8@lt };
?)P&u X(c6\
sW-rkoJ // signal handlerxAU:g v"n)\~g5h6L~
(V![-df {MM^(T
static bool isTimeout = false;%L$]'z,O)b!qX7@%B {*y'q
0i!k5F a&l
static void catchSignal(int sig)Yx1n nGn tmM
{D;se(mF%A SWC
  if (sig == SIGALRM)6CnqV_T~Lh
    isTimeout = true;
p^Zv@4}6mG }9pOy[{!O\ @0h

tar }w1]'W$p5k // start timer
,{/Z a-\GEsc&K/i static void startTimer(int timeout)/G jHW:S
{8N:q&B(F b
  struct sigaction newAction;
&m _M{q kU,G&D@   newAction.sa_handler = catchSignal;(^"MH/e@ Pc
  newAction.sa_flags = 0;
yW|%\ L9NG   sigaction(SIGALRM, &newAction, NULL);;B@c:r-{Z$y:j&o
  alarm(timeout);
T \UG({%@k+Q   isTimeout = false;
}8r&K;JXe }6[xFV]o'gpJJj*`

hm`!SN&}6g // reset timer
%iZ?x,Ts)vy static void stopTimer()]1N.h*ct"A
{
7p3O$G8B}J@   alarm(0);
[ l~ Z ?'j)f*i   sigaction(SIGALRM, NULL, NULL);E6S v5l0ZH[5\L
  isTimeout = false;.n#D^)z,Z r8Y*G
}
(I_~w$l(yv
i*a q$loe9Ar static void startWaitStatus()0Z)Di5Gi |5e
{6P Y_LhG$^ \nD
  struct sigaction newAction; r ^;PX)nuR0QO
  newAction.sa_handler = catchSignal;u'BL ja ~V&N,r
  newAction.sa_flags = 0;
8thk4WZpo   sigaction(SIGUSR1, &newAction, NULL);i9AS\ cc$PC
}
0B [d2n!U
R4N)I2L/s&WI j static void stopWaitStatus()K+C!ZfY)A1i,t m
{
9V1@Ps-|!e9t   sigaction(SIGUSR1, NULL, NULL); W+Q;e0Bq8i i8|)y
}
*b~0As1B ,O'T_L'BrN;ax
// ~
Wv v2V j'_.o-H3L)r jv}[ln4b
static inline link_t GET_LK_V(link_t *linkp)
6q2q.f D-VXc4t,G$| {
O6t Xu? ^g3ui)n   return *linkp & ~ALIGN_MASK;)a;hIIfw%?
}
4H EPE5b5t@1g!m /x9Hm,I/h2G7r^9q
static inline void SET_LK_V(link_t *linkp, link_t linkv)N#U6L!cm hA4d#p3|
{
-y0@"C#^1MHM   *linkp &= ALIGN_MASK;
'HMfm&C0{W   *linkp += linkv;
,} BE l\4DvH }
V3u.k1zPq A[T6H \$uLp
// MQShmPriv
#\&zH;dc W$l%v // MQShm header structure
0C O'M9}uD // use only byte and word elements for ARM word alignmentbQDTC T

a,^0HcO.Mpr)U struct MQShmPriv
&heAI;cV,Z {dqrr cW&P4yY
  int _pids[SHM_MAX_PIDS]; // process who is waiting for status:uL:V3T#W~ T?
  ushort _placeholder[1]; // placeholder for DWORD alignment;\a9I-f J
  ushort _status; // status of this shm5p)?$E:Dw4{*B g/Y
  ushort _cx; // user defined counter
q Ae,Uoo   ushort _nItems; // how many items in the shmZsaz6C RU
  link_t _offset; // free block offsetPz!m,] QP8K
  link_t _header; // item list header?h)z3rI[*Q
};!Jn$G(yw6_-D7a
h8g(RnE*Q
#define SHM_GET_PID(i) \
*YV9|#Z{1`0`   (_priv->_pids[i])_,h Q3]#?i)_

0GTc7K5V`T;]5N+v #define SHM_SET_PID(i, pid) \
r,r BLmjcpWXq   (_priv->_pids[i] = pid)
5E2XnK"Q%Z i U7K.}O p F
// MQShm members)F.OXSs{? m
/E.E tw+o
void MQShm::pidLock().L;PGNt m:@]6jk
{
k'jt n!d'zYJJP   struct sembuf sembuf;HT0Gc1j-w d7F
  sembuf.sem_num = 0;+R!}_5uR7a"^o[
  sembuf.sem_op = -1;5Z$r$r&xC"q_R4H
  sembuf.sem_flg = SEM_UNDO;
1Xu:l$AV2K4C5~$O   if (semop(_pidSemId, &sembuf, 1) == -1) {9Om2xy0hU d
    perror("semop (pid semphone)");Z/GR/T@&u*k+G j3[
    exit(1); ` R} I4G(Dj&a f
  }
#|2sKp#Ti u~'Y }iud+T6K8^6t&[f7T

hN0qd b8P U void MQShm::pidUnlock()E+o(C*`2[
{+B8T-@,?Vi;ju
  struct sembuf sembuf;
8ph ~ K-yWT   sembuf.sem_num = 0;
4cj!H]P@GZ   sembuf.sem_op = +1;
/T:H H.us];eo   sembuf.sem_flg = SEM_UNDO;b"vq'nj/IPX
  if (semop(_pidSemId, &sembuf, 1) == -1) {
;M{3C]4Cy4_B O     perror("semop (pid semphone)");Jhd.sH;N
    exit(1);B4pJ2\s)e'`K9x
  }
*E&Qq6}7u8z-oP }1P0P4|qY
"\W t3I6P^z
MQShm::MQShm(key_t key, size_t size, bool init)(r\7i:jd'CU(t
{
2RFV S6z,P   bool isCreater = true;
@FV+Tcf!Uu7zX   _size = size;
1Q+qCkp   _myPidIdx = -1;-~B`r_W7G Rx9T
Iy0vqqE
  // create shm*j7YZLs,KE3A
  if ((_shmId = shmget(key, _size, O_RDWR | IPC_CREAT | IPC_EXCL)) == -1) {
cVq2Kk5t6J]2W,Z     char msg[32];3Pgab"N0H'a$WM K6D
    sprintf(msg, "shmget (0x%x)", key);!L5R:@arEhB
    perror(msg);
?3S+t`2HA     isCreater = false;
*D&M7Kxe#sQD
6j6wt G A     if ((_shmId = shmget(key, _size, O_RDWR | IPC_CREAT)) == -1) {
Z!i!D,fC3ODH       perror(msg);
hLA6QF,v       exit(1);/vM$s#W P {S
    }
bT VCF   }
l)ns!s$Zi3y]   if ((_shm = (uchar *)shmat(_shmId, NULL, 0)) == (void *)-1) {
+bE k-P!o9J4q-w     perror("shmat");5yvh8b~L^ H
    exit(1);nJl7g&T2B2dH\?Z
  }
9erw-BMG8xZB I n*S/iC8zN
  // create shm semphone-h+Y%P^ QK%Of
  if ((_shmSemId = semget(key, 1, O_RDWR | IPC_CREAT)) == -1) { I)pHh'F G ~ N
    perror("semget (shm semphone)");:s9kp2N(Zg/_
    exit(1);
AK6x;rZ@l(e}8F'bWw   }
TOSH)y y$XfCA P0@q,z6A6}1X%i~
  // create pid semphoneU$o'g%^1T
  if ((_pidSemId = semget(key + 1, 1, O_RDWR | IPC_CREAT)) == -1) {
s_-|5u+ztO8I     perror("semget (pid semphone)");"U-j"H~tN+?A2y
    exit(1);
8Ely^1a)G)W   }
,Jo:uj j*i4E(p } Z2?P
#GMZ`} V   _priv = (MQShmPriv *)_shm;
L#@r c&g,B HrS9P p/C
  if (isCreater || init) {
c1A.a0p_!|;G     printf("to initialize the MQShm (0x%x)\n", _shmId);
]fuZ ~*\mT!z+w     // initialize the shm by creater fn _;A Ua c
    memset(_priv->_pids, 0, sizeof(_priv->_pids));9ONV d,H
    memset(_priv->_placeholder, 0XCC, sizeof(_priv->_placeholder));`\U.|A H XL#I*N
    _priv->_status = MQShm::StUnknown;
VLP+uU     _priv->_cx = 0;
0Ul*P_1v&d#I4H     _priv->_nItems = 0;
Iy}}7Z"BB     _priv->_offset = sizeof(MQShmPriv);G | h M(g3cB
    _priv->_header = MQShm::null;t+{DS"n JF
    // initialize shm and pid semphone/A0fs/[ i[|7Wx3q Z'E
    union semun data;/F%OCT``C5[
    data.val = 1;
M*Y4{6Wh     if (semctl(_shmSemId, 0, SETVAL, data) == -1) {
3y5J5}.m7b \       perror("semctl (shm semphone)");
r1u5S:q,n"?AltI       exit(1);:bf FG L
    }
7~ R o3m ? Y ~ };vY     if (semctl(_pidSemId, 0, SETVAL, data) == -1) {M |s%Sp2G#c^S
      perror("semctl (pid semphone)");
w |e2v'Jk:l       exit(1);
o+wY ?eY'i)K V     }
8v `m k Ak)X   }8^4gq k/V6I R#V
} g%E\-c"O.rU8~
I iqM t5R6v vq&~ M
MQShm::~MQShm()2WFQ0uU5O\bK)Z
{ Gv*D k a
  if (shmdt(_shm) == -1)
|1cXK$~2ld9Y     perror("shmdt");
/ue.u_,D8_kS;D }Wb8PI*q3IT)E
kN2b9E:N\0C
void MQShm::close()
'AX*tQ#w~x t(d {
%J3CT l)^Y'L4e   printf("close MQShm (0x%x)\n", _shmId);!No~k8WHp

XaJ/g@ k   if (shmdt(_shm) == -1)L`:Ev q8hPr!e
    perror("shmdt");
+t"k6A4F ['c   if (shmctl(_shmId, IPC_RMID, NULL) == -1) YyW#KY8?6a&f
    perror("shmctl");7Q'C a"S6kT
  if (semctl(_shmSemId, 0, IPC_RMID) == -1)'g/tl+Bq-L,|"JW
    perror("semctl (shm semphone)");
x[ I4yQ*O4]aq*?   if (semctl(_pidSemId, 0, IPC_RMID) == -1)
Net/C;p]9X6yn     perror("semctl (pid semphone)");
T1?/J9h#B:KH U f BL7N ` y1@z)p.?D a*o
  _shmId = -1;6y[$v)@y"G N!A
  _shmSemId = -1;
_ ^0@6S*E!_:` u   _pidSemId = -1;
sFs0yc{   _shm = NULL;
Kafc/?#e-{   _priv = NULL; Fwx#t\(})^
}
7zn5T.F8fd4t }.T {L TV%p#W
void MQShm::lock()
!T+hL*JD {
rHzT4A'P3MX3\C   struct sembuf sembuf;
H X @j$P7{'y   sembuf.sem_num = 0;
VFqN}0L*AR   sembuf.sem_op = -1;
vcpxj,M   sembuf.sem_flg = SEM_UNDO;b"b i0^%q|g
  if (semop(_shmSemId, &sembuf, 1) == -1) {w knjO?NQi
    perror("semop");$NH u-b@
    exit(1);/E fi&o\6zS3`
  }\Kl+a-M%sk
}
I9[$x6y+Bu @e}
.^%mSo0~/K1?V.N void MQShm::unlock()
5jUfR9U*]9K"[ {d3|9w'L]q?1Vv0JK
#ifndef NDEBUG
RI8W2yW R|   ASSERT(locked());h/](V.cqkE j
#endif
9z)R"Esiyp   struct sembuf sembuf;
:@p5\g^   sembuf.sem_num = 0;(^EJpM^1Pa
  sembuf.sem_op = +1;KI1K)W)j?G
  sembuf.sem_flg = SEM_UNDO; f,{f5[W1W
  if (semop(_shmSemId, &sembuf, 1) == -1) {'d \&FNy8eJJG
    perror("semop");o0C#LW\)h
    exit(1);GHL6uu(S~y;e M
  }
0_#D8^1~'x0G;Ngd };UK%\9s\

T{F ]_#f(zy bool MQShm::locked()K d$yni
{
!WU(h0s&[ A Y.U${c   int val;Y#n{'[@#B
  if ((val = semctl(_shmSemId, 0, GETVAL)) == -1) {
{$yi D"Cv`'p+t{y     perror("semctl"); eq(s'? IM6r U
    exit(1);
N%V*w)cV#B   }G$wb;n(\w0h9OJ.X`
  return val <= 0;(P'c&?y:Yc)[3[
}*C D@iAA-boZT

#f,W1Z gJ+K%u uint MQShm::freeSpace() constf+Y:O&p4kyO.M,P6C1v
{
.]} q)\zZ   // the free space must contain a byte for 2-byte alignment1v9D|8m;Gjd*P*`9Fh
  return _size - _priv->_offset - LINKER_SIZE - 1; au3T,d*U#xp,Gb
}GWK6U@_.zN
Jtcx#a
uint MQShm::itemCount() const oYh H,|%_QYk
{
1w$b wCN[Q   return _priv->_nItems;
)oKl1kD }7V/q YaU1C {~)j

I5X'S3D7N void MQShm::clrCounter() 4{ fw8]4L
{ %k&jq*f,Kg
  _priv->_cx = 0;
1|S"s Jr(ga k:e }
*yv.@4Y%V x,V-`.g?7s*V
uint MQShm::getCounter() const
` b2y*q`.@@\o {
,e#e}$y*X,oH P4R   return _priv->_cx;
x2k)Jbv8J }
r aC]9y$Km/Z ~!U#X*E!L+_:w6i9bj
void MQShm::setCounter(uint n)
R-Y _(C?-S4c&I { W `?5Yl gr%Lg
  _priv->_cx = n; 9U VZI(Qd%p
}.V1h6l$Z:_-G6{)Q4}

X{D%n2w iec | int MQShm::status() const
q*q:h1_{'X*s {g([U o2Q FysH
  return _priv->_status;`N]3I&r9HB@A
}&}VO&Uqa

0R0M'g%X%gn1n#c6\B]S void MQShm::setStatus(int st)mDJ(mX r
{
(F'G'sfz7i~;[`rK&L   _priv->_status = st;
0E8T^+pB T'Q 8al,K[0n6t1O%]n|4C;_ k
  pidLock();[wizO?A%uY
  for (int i = 0; i < SHM_MAX_PIDS; ++i)
Qck?v     if (SHM_GET_PID(i) != 0)
Cx!gC%l       kill(SHM_GET_PID(i), SIGUSR1);KIa7gFQ
  pidUnlock();
wN@R t"x0WP|   usleep(50000); // a period for waking up process
#}Jq/x%\                  // who block on the status
$t`K;OLL[,b1C&R+Q\ }/p h b [ SG kh[
(r\Uz*V@X U?
bool MQShm::waitStatus(int st, uint timeout)qyn ^ b
{Z6m'xT\R%D
  if (_priv->_status & st)
O)T3E?s     return true;
Hrfq#p0T 7xo?UU!Vj$by
  bool result = true;
1?mhmw1jK+J   startWaitStatus();^Aq8S.o;@4n_ m4Y
  startTimer(timeout);
;C z4E3Zl0f K @
3E2a0G F GN Or   while (!(_priv->_status & st) && result) {
O|'X~ s(e6`,ee*B     if (_myPidIdx == -1) {
`c9L9U*~/]!c+c       pidLock();j!l(d n0k#vXVJ
      int i = 0;
7C6S5@NG m       while (i < SHM_MAX_PIDS && SHM_GET_PID(i) != 0)
@ ~K'mA2^7f6U         ++i;!Hj uLA@DYYS
      ASSERT(i < SHM_MAX_PIDS);;Y&Z;e+\t Hl2N
      SHM_SET_PID(i, getpid());
#K#_D/S0v2M       _myPidIdx = i;u,w Rl;i
      pidUnlock();
MZ:m0z]"h%g*u ^     }
4OYl:[p!d&yS5vcN B h8s1H~
    pause();$r"z|S4}-`7Z

8}'cA Vf:O6E     if (isTimeout)
N K+F3{ L.SkH       result = false;@xcp0?&Hvot
  }
;e`Ec!t!iT"zt GE5w/` |de$T
  stopWaitStatus();
Z O)|azkv\W6{?   stopTimer();
+_Szr;fD"V5o
tM(E|Q   if (_myPidIdx != -1) {
+E.R z?4x l W     pidLock();;eV7H]7k
    SHM_SET_PID(_myPidIdx, 0);L8S9@?^'Je:N$R
    _myPidIdx = -1;
E}rtnA6@6w's1|     pidUnlock();
XN^%S{O c%J   }r&@.x1mi

l$LL Ra   return result;)d nrV8r MRNPX
}+QP(c`A(]^Qc1\]

5au1I,}t1z$_5V void MQShm::append(const uchar *data, uint len)6di2G:y.j
{%z5C U&r Rb+f+fs
  ASSERT(freeSpace() >= len);N{ @ Ag M2F%a

_+Y5W$J/C4u   // append the new itema2_Y(xvW0Q
  uchar *p = _shm + _priv->_offset;S9bU |F7no G
  memcpy(p, data, len);$_PZ x e"_n
:W%F4AN sU8zU@
  // do alignment for arm/No(H }&@8M\U
  bool doAlign = false;
7G'kc`Iooe   if ((int)(p += len) % 2 != 0) {
)\(yUj5d'c,x6H     *p++ = 0xcc; // the byte for alignment yS(H5Bx1O
    doAlign = true;
%?nS]/R tKS   }
$]XpFj n8M:d'b   *((link_t *) p) = MQShm::null; h,]hfa4Xg
  if (doAlign)hn@1iR6WXj
    *((link_t *) p) |= ALIGN_MASK;p`2_at w
  *J6auJ;`"@"Wjo
  // link the new item
(sl![4^{0k:kO3B]   link_t new_linker = p - _shm;
!^ {Hp X   SET_LK_V((link_t *)(_shm + _priv->_offset - LINKER_SIZE), new_linker);
{ Tb*V*@qx7HU]3~   // update offset pointer8O i ZB j6E!H
  _priv->_offset = new_linker + LINKER_SIZE;
/A |wpWQ E   // update counteri2]3i%p/_a
  ++(_priv->_nItems);
sJ hb4};j }4j F1wWY;bNWC

!U1kk6~d&ENVM void MQShm::clear()#bDqUT#^}?*c"Q
{3u/R7r6jh-` |j
  _priv->_nItems = 0;3{eiiP
  _priv->_offset = sizeof(MQShmPriv);TOW,Zf:lF
  _priv->_header = MQShm::null;Wv q a rFQ6H
}|#v jzq3tr
2P#W(Jlu9q
MQShm::const_iterator MQShm::begin() const
V-I&@-g|$yS_w!l {
l7N/C3g|KM&E   return MQShm::const_iterator(this, sizeof(MQShmPriv) - LINKER_SIZE); Q'V"a-a%\ ^h$qg
}
q-[{E,G&c9cX /xlI PoU
MQShm::const_iterator MQShm::end() constZ(jJ+O)j
{
tdMxs-~tE8M \e~ }   link_t linkv = _priv->_offset - LINKER_SIZE;
"Z eksV%T Tz   ASSERT(GET_LK_V((link_t *)(_shm + linkv)) == MQShm::null);]h6pA}p
  return MQShm::const_iterator(this, linkv);d;r+H7^9c `D^*U
}
qe N BYia)Dc
X0\B1tPLK Mg // MQShm::const_iterator members"l.DRxI zBk\

l*[9\MVRK const uchar *MQShm::const_iterator::data() const G6h^4_R)C!Y
{
X#Qm%_|.e K!V   return (const uchar *)(_mqShm->_shm + _linkv + LINKER_SIZE);1U#mO(h|
}
+cp;x@ cIIG %k"mF{%P)B$H
uint MQShm::const_iterator::size() const
+jo8X\]&^+n:ha {
8eR&n%{M6EOZ)R~   link_t nextv = GET_LK_V((link_t *)(_mqShm->_shm + _linkv));
Mz"R[cpt   uint nAlginBytes = *(link_t *)(_mqShm->_shm + nextv) & ALIGN_MASK ? 1 : 0;%f2x`I`m~2S-`
  return nextv - _linkv - LINKER_SIZE - nAlginBytes;8Al(W*h'RN.}4L`
}#u8hDhd#W7O%R;|
N!C$f5g:W
MQShm::const_iterator &MQShm::const_iterator::operator++()g;D DPV
{?3vwl)|1D
  _linkv = GET_LK_V((link_t *)(_mqShm->_shm + _linkv)); uWQ-`0X2Y
  return *this; X {s(L"v8TL
}
m.sA'MEeF8gVG h |I~|d$P
bool MQShm::const_iterator::operator==(const const_iterator &rhs) const)R q-b(y1Gs!i
{
\Cvn'I$d1p2F1ur   return _mqShm == rhs._mqShm && _linkv == rhs._linkv;L2s+Bi;\$c:X3W R|
}
:gwmk!d-Xy q
D]!Pa9I k+j1G!{H` bool MQShm::const_iterator::operator!=(const const_iterator &rhs) const
1s;D;da+@ {
&r6P#N`5^/xF4T   return _mqShm != rhs._mqShm || _linkv != rhs._linkv;1}pk j1s1r
} }2S&?e+?[){
%N3z Zlg!s
[/code]

ljq1000 ·¢±íÓÚ 2008-3-25 16:33

¶¥
KR2R P ` E,Q Ï£ÍûÎÒµÄŬÁ¦²»Òª°×·Ñ

flag ·¢±íÓÚ 2008-3-25 22:20

ÏÖÔÚûÓл·¾³ÊÔ£¬´Ö¿´ÁËһϣ¬¾õµÃ³ö´í´¦ÀíËÆºõÎä¶ÏÁ˵㡣²»ÖªµÀÂ¥Ö÷×Ô¼ºÉè¼ÆÁ˲âÊԵĴúÂëÊÔ¹ýûÓУ¿

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.